Merge pull request #117 from apache/Feature/TabsToSpaces

tabs to spaces
diff --git a/src/log4net.Tests/Appender/AdoNet/Log4NetCommand.cs b/src/log4net.Tests/Appender/AdoNet/Log4NetCommand.cs
index 98beb8e..9cf82a8 100644
--- a/src/log4net.Tests/Appender/AdoNet/Log4NetCommand.cs
+++ b/src/log4net.Tests/Appender/AdoNet/Log4NetCommand.cs
@@ -24,121 +24,121 @@
 
 namespace log4net.Tests.Appender.AdoNet
 {
-    public class Log4NetCommand : IDbCommand
+  public class Log4NetCommand : IDbCommand
+  {
+    #region AdoNetAppender
+
+    private static Log4NetCommand mostRecentInstance;
+
+    private IDbTransaction transaction;
+    private string commandText;
+    private readonly IDataParameterCollection parameters;
+    private CommandType commandType;
+    private int executeNonQueryCount;
+
+    public Log4NetCommand()
     {
-        #region AdoNetAppender
+      mostRecentInstance = this;
 
-        private static Log4NetCommand mostRecentInstance;
-
-        private IDbTransaction transaction;
-        private string commandText;
-        private readonly IDataParameterCollection parameters;
-        private CommandType commandType;
-        private int executeNonQueryCount;
-
-        public Log4NetCommand()
-        {
-            mostRecentInstance = this;
-
-            parameters = new Log4NetParameterCollection();
-        }
-
-        public void Dispose()
-        {
-            // empty
-        }
-
-        public IDbTransaction Transaction
-        {
-            get { return transaction; }
-            set { transaction = value; }
-        }
-
-        public int ExecuteNonQuery()
-        {
-            executeNonQueryCount++;
-            return 0;
-        }
-
-        public int ExecuteNonQueryCount
-        {
-            get { return executeNonQueryCount; }
-        }
-
-        public IDbDataParameter CreateParameter()
-        {
-            return new Log4NetParameter();
-        }
-
-        public string CommandText
-        {
-            get { return commandText; }
-            set { commandText = value; }
-        }
-
-        public CommandType CommandType
-        {
-            get { return commandType; }
-            set { commandType = value; }
-        }
-
-        public void Prepare()
-        {
-            // empty
-        }
-
-        public IDataParameterCollection Parameters
-        {
-            get { return parameters; }
-        }
-
-        public static Log4NetCommand MostRecentInstance
-        {
-            get { return mostRecentInstance; }
-        }
-
-        #endregion
-
-        #region Not Implemented
-
-        public void Cancel()
-        {
-            throw new NotImplementedException();
-        }
-
-        public IDataReader ExecuteReader()
-        {
-            throw new NotImplementedException();
-        }
-
-        public IDataReader ExecuteReader(CommandBehavior behavior)
-        {
-            throw new NotImplementedException();
-        }
-
-        public object ExecuteScalar()
-        {
-            throw new NotImplementedException();
-        }
-
-        public IDbConnection Connection
-        {
-            get { throw new NotImplementedException(); }
-            set { throw new NotImplementedException(); }
-        }
-
-        public int CommandTimeout
-        {
-            get { throw new NotImplementedException(); }
-            set { throw new NotImplementedException(); }
-        }
-
-        public UpdateRowSource UpdatedRowSource
-        {
-            get { throw new NotImplementedException(); }
-            set { throw new NotImplementedException(); }
-        }
-
-        #endregion
+      parameters = new Log4NetParameterCollection();
     }
+
+    public void Dispose()
+    {
+      // empty
+    }
+
+    public IDbTransaction Transaction
+    {
+      get { return transaction; }
+      set { transaction = value; }
+    }
+
+    public int ExecuteNonQuery()
+    {
+      executeNonQueryCount++;
+      return 0;
+    }
+
+    public int ExecuteNonQueryCount
+    {
+      get { return executeNonQueryCount; }
+    }
+
+    public IDbDataParameter CreateParameter()
+    {
+      return new Log4NetParameter();
+    }
+
+    public string CommandText
+    {
+      get { return commandText; }
+      set { commandText = value; }
+    }
+
+    public CommandType CommandType
+    {
+      get { return commandType; }
+      set { commandType = value; }
+    }
+
+    public void Prepare()
+    {
+      // empty
+    }
+
+    public IDataParameterCollection Parameters
+    {
+      get { return parameters; }
+    }
+
+    public static Log4NetCommand MostRecentInstance
+    {
+      get { return mostRecentInstance; }
+    }
+
+    #endregion
+
+    #region Not Implemented
+
+    public void Cancel()
+    {
+      throw new NotImplementedException();
+    }
+
+    public IDataReader ExecuteReader()
+    {
+      throw new NotImplementedException();
+    }
+
+    public IDataReader ExecuteReader(CommandBehavior behavior)
+    {
+      throw new NotImplementedException();
+    }
+
+    public object ExecuteScalar()
+    {
+      throw new NotImplementedException();
+    }
+
+    public IDbConnection Connection
+    {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
+    public int CommandTimeout
+    {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
+    public UpdateRowSource UpdatedRowSource
+    {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net.Tests/Appender/AdoNet/Log4NetConnection.cs b/src/log4net.Tests/Appender/AdoNet/Log4NetConnection.cs
index 33bbcce..cabcb0a 100644
--- a/src/log4net.Tests/Appender/AdoNet/Log4NetConnection.cs
+++ b/src/log4net.Tests/Appender/AdoNet/Log4NetConnection.cs
@@ -24,88 +24,88 @@
 
 namespace log4net.Tests.Appender.AdoNet
 {
-    public class Log4NetConnection : IDbConnection
+  public class Log4NetConnection : IDbConnection
+  {
+    #region AdoNetAppender
+
+    private static Log4NetConnection mostRecentInstance;
+
+    private bool open;
+    private string connectionString;
+
+    public Log4NetConnection()
     {
-        #region AdoNetAppender
-
-        private static Log4NetConnection mostRecentInstance;
-
-        private bool open;
-        private string connectionString;
-
-        public Log4NetConnection()
-        {
-            mostRecentInstance = this;
-        }
-
-        public void Close()
-        {
-            open = false;
-        }
-
-        public ConnectionState State
-        {
-            get 
-            {
-                return open ? ConnectionState.Open : ConnectionState.Closed;
-            }
-        }
-
-        public string ConnectionString
-        {
-            get { return connectionString; }
-            set { connectionString = value; }
-        }
-
-        public IDbTransaction BeginTransaction()
-        {
-            return new Log4NetTransaction();
-        }
-
-        public IDbCommand CreateCommand()
-        {
-            return new Log4NetCommand();
-        }
-
-        public void Open()
-        {
-            open = true;
-        }
-
-        public static Log4NetConnection MostRecentInstance
-        {
-            get { return mostRecentInstance; }
-        }
-
-        #endregion
-
-        #region Not Implemented
-
-        public IDbTransaction BeginTransaction(IsolationLevel il)
-        {
-            throw new NotImplementedException();
-        }
-
-        public void ChangeDatabase(string databaseName)
-        {
-            throw new NotImplementedException();
-        }
-
-        public int ConnectionTimeout
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public string Database
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public void Dispose()
-        {
-            throw new NotImplementedException();
-        }
-
-        #endregion
+      mostRecentInstance = this;
     }
+
+    public void Close()
+    {
+      open = false;
+    }
+
+    public ConnectionState State
+    {
+      get
+      {
+        return open ? ConnectionState.Open : ConnectionState.Closed;
+      }
+    }
+
+    public string ConnectionString
+    {
+      get { return connectionString; }
+      set { connectionString = value; }
+    }
+
+    public IDbTransaction BeginTransaction()
+    {
+      return new Log4NetTransaction();
+    }
+
+    public IDbCommand CreateCommand()
+    {
+      return new Log4NetCommand();
+    }
+
+    public void Open()
+    {
+      open = true;
+    }
+
+    public static Log4NetConnection MostRecentInstance
+    {
+      get { return mostRecentInstance; }
+    }
+
+    #endregion
+
+    #region Not Implemented
+
+    public IDbTransaction BeginTransaction(IsolationLevel il)
+    {
+      throw new NotImplementedException();
+    }
+
+    public void ChangeDatabase(string databaseName)
+    {
+      throw new NotImplementedException();
+    }
+
+    public int ConnectionTimeout
+    {
+      get { throw new NotImplementedException(); }
+    }
+
+    public string Database
+    {
+      get { throw new NotImplementedException(); }
+    }
+
+    public void Dispose()
+    {
+      throw new NotImplementedException();
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net.Tests/Appender/AdoNet/Log4NetParameter.cs b/src/log4net.Tests/Appender/AdoNet/Log4NetParameter.cs
index 4eb038d..d79621a 100644
--- a/src/log4net.Tests/Appender/AdoNet/Log4NetParameter.cs
+++ b/src/log4net.Tests/Appender/AdoNet/Log4NetParameter.cs
@@ -24,80 +24,80 @@
 
 namespace log4net.Tests.Appender.AdoNet
 {
-    public class Log4NetParameter : IDbDataParameter
+  public class Log4NetParameter : IDbDataParameter
+  {
+    #region AdoNetAppender
+
+    private string parameterName;
+    private byte precision;
+    private byte scale;
+    private int size;
+    private DbType dbType;
+    private object value;
+
+    public string ParameterName
     {
-        #region AdoNetAppender
-
-        private string parameterName;
-        private byte precision;
-        private byte scale;
-        private int size;
-        private DbType dbType;
-        private object value;
-
-        public string ParameterName
-        {
-            get { return parameterName; }
-            set { parameterName = value; }
-        }
-
-        public byte Precision
-        {
-            get { return precision; }
-            set { precision = value; }
-        }
-
-        public byte Scale
-        {
-            get { return scale; }
-            set { scale = value; }
-        }
-
-        public int Size
-        {
-            get { return size; }
-            set { size = value; }
-        }
-
-        public DbType DbType
-        {
-            get { return dbType; }
-            set { dbType = value; }
-        }
-
-        public object Value
-        {
-            get { return value; }
-            set { this.value = value; }
-        }
-
-        #endregion
-
-        #region Not Implemented
-
-        public ParameterDirection Direction
-        {
-            get { throw new NotImplementedException(); }
-            set { throw new NotImplementedException(); }
-        }
-
-        public bool IsNullable
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public string SourceColumn
-        {
-            get { throw new NotImplementedException(); }
-            set { throw new NotImplementedException(); }
-        }
-
-        public DataRowVersion SourceVersion
-        {
-            get { throw new NotImplementedException(); }
-            set { throw new NotImplementedException(); }
-        }
-
-        #endregion
+      get { return parameterName; }
+      set { parameterName = value; }
     }
+
+    public byte Precision
+    {
+      get { return precision; }
+      set { precision = value; }
+    }
+
+    public byte Scale
+    {
+      get { return scale; }
+      set { scale = value; }
+    }
+
+    public int Size
+    {
+      get { return size; }
+      set { size = value; }
+    }
+
+    public DbType DbType
+    {
+      get { return dbType; }
+      set { dbType = value; }
+    }
+
+    public object Value
+    {
+      get { return value; }
+      set { this.value = value; }
+    }
+
+    #endregion
+
+    #region Not Implemented
+
+    public ParameterDirection Direction
+    {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
+    public bool IsNullable
+    {
+      get { throw new NotImplementedException(); }
+    }
+
+    public string SourceColumn
+    {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
+    public DataRowVersion SourceVersion
+    {
+      get { throw new NotImplementedException(); }
+      set { throw new NotImplementedException(); }
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net.Tests/Appender/AdoNet/Log4NetParameterCollection.cs b/src/log4net.Tests/Appender/AdoNet/Log4NetParameterCollection.cs
index 8b0d041..c010769 100644
--- a/src/log4net.Tests/Appender/AdoNet/Log4NetParameterCollection.cs
+++ b/src/log4net.Tests/Appender/AdoNet/Log4NetParameterCollection.cs
@@ -25,45 +25,45 @@
 
 namespace log4net.Tests.Appender.AdoNet
 {
-    public class Log4NetParameterCollection : CollectionBase, IDataParameterCollection
+  public class Log4NetParameterCollection : CollectionBase, IDataParameterCollection
+  {
+    #region AdoNetAppender
+
+    private readonly Hashtable parameterNameToIndex = new Hashtable();
+
+    protected override void OnInsertComplete(int index, object value)
     {
-        #region AdoNetAppender
+      base.OnInsertComplete(index, value);
 
-        private readonly Hashtable parameterNameToIndex = new Hashtable();
-
-        protected override void OnInsertComplete(int index, object value)
-        {
-            base.OnInsertComplete(index, value);
-
-            IDataParameter param = (IDataParameter)value;
-            parameterNameToIndex[param.ParameterName] = index;
-        }
-
-        public int IndexOf(string parameterName)
-        {
-            return (int)parameterNameToIndex[parameterName];
-        }
-
-        public object this[string parameterName]
-        {
-            get { return InnerList[IndexOf(parameterName)]; }
-            set { InnerList[IndexOf(parameterName)] = value; }
-        }
-
-        #endregion
-
-        #region Not Implemented
-
-        public void RemoveAt(string parameterName)
-        {
-            throw new NotImplementedException();
-        }
-
-        public bool Contains(string parameterName)
-        {
-            throw new NotImplementedException();
-        }
-
-        #endregion
+      IDataParameter param = (IDataParameter)value;
+      parameterNameToIndex[param.ParameterName] = index;
     }
+
+    public int IndexOf(string parameterName)
+    {
+      return (int)parameterNameToIndex[parameterName];
+    }
+
+    public object this[string parameterName]
+    {
+      get { return InnerList[IndexOf(parameterName)]; }
+      set { InnerList[IndexOf(parameterName)] = value; }
+    }
+
+    #endregion
+
+    #region Not Implemented
+
+    public void RemoveAt(string parameterName)
+    {
+      throw new NotImplementedException();
+    }
+
+    public bool Contains(string parameterName)
+    {
+      throw new NotImplementedException();
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net.Tests/Appender/AdoNet/Log4NetTransaction.cs b/src/log4net.Tests/Appender/AdoNet/Log4NetTransaction.cs
index d52e364..ab415ae 100644
--- a/src/log4net.Tests/Appender/AdoNet/Log4NetTransaction.cs
+++ b/src/log4net.Tests/Appender/AdoNet/Log4NetTransaction.cs
@@ -24,39 +24,39 @@
 
 namespace log4net.Tests.Appender.AdoNet
 {
-    public class Log4NetTransaction : IDbTransaction
+  public class Log4NetTransaction : IDbTransaction
+  {
+    #region AdoNetAppender
+
+    public void Commit()
     {
-        #region AdoNetAppender
-
-        public void Commit()
-        {
-            // empty
-        }
-
-        public void Rollback()
-        {
-            // empty
-        }
-
-        #endregion
-
-        #region Not Implemented
-
-        public IDbConnection Connection
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public IsolationLevel IsolationLevel
-        {
-            get { throw new NotImplementedException(); }
-        }
-
-        public void Dispose()
-        {
-            throw new NotImplementedException();
-        }
-
-        #endregion
+      // empty
     }
+
+    public void Rollback()
+    {
+      // empty
+    }
+
+    #endregion
+
+    #region Not Implemented
+
+    public IDbConnection Connection
+    {
+      get { throw new NotImplementedException(); }
+    }
+
+    public IsolationLevel IsolationLevel
+    {
+      get { throw new NotImplementedException(); }
+    }
+
+    public void Dispose()
+    {
+      throw new NotImplementedException();
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net.Tests/Appender/AdoNetAppenderTest.cs b/src/log4net.Tests/Appender/AdoNetAppenderTest.cs
index 1b48f26..1b4eedf 100644
--- a/src/log4net.Tests/Appender/AdoNetAppenderTest.cs
+++ b/src/log4net.Tests/Appender/AdoNetAppenderTest.cs
@@ -38,67 +38,67 @@
 
 namespace log4net.Tests.Appender
 {
-    [TestFixture]
-    public class AdoNetAppenderTest
+  [TestFixture]
+  public class AdoNetAppenderTest
+  {
+    [Test]
+    public void NoBufferingTest()
     {
-        [Test]
-        public void NoBufferingTest()
-        {
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 
-            AdoNetAppender adoNetAppender = new AdoNetAppender();
-            adoNetAppender.BufferSize = -1;
+      AdoNetAppender adoNetAppender = new AdoNetAppender();
+      adoNetAppender.BufferSize = -1;
 #if NETSTANDARD1_3
             adoNetAppender.ConnectionType = typeof(Log4NetConnection).AssemblyQualifiedName;
 #else
-            adoNetAppender.ConnectionType = "log4net.Tests.Appender.AdoNet.Log4NetConnection";
+      adoNetAppender.ConnectionType = "log4net.Tests.Appender.AdoNet.Log4NetConnection";
 #endif
-            adoNetAppender.ActivateOptions();
+      adoNetAppender.ActivateOptions();
 
-            BasicConfigurator.Configure(rep, adoNetAppender);
+      BasicConfigurator.Configure(rep, adoNetAppender);
 
-            ILog log = LogManager.GetLogger(rep.Name, "NoBufferingTest");
-            log.Debug("Message");
-            Assert.NotNull(Log4NetCommand.MostRecentInstance);
-            Assert.AreEqual(1, Log4NetCommand.MostRecentInstance.ExecuteNonQueryCount);
-        }
+      ILog log = LogManager.GetLogger(rep.Name, "NoBufferingTest");
+      log.Debug("Message");
+      Assert.NotNull(Log4NetCommand.MostRecentInstance);
+      Assert.AreEqual(1, Log4NetCommand.MostRecentInstance.ExecuteNonQueryCount);
+    }
 
-        [Test]
-        public void BufferingTest()
-        {
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+    [Test]
+    public void BufferingTest()
+    {
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 
-            int bufferSize = 5;
+      int bufferSize = 5;
 
-            AdoNetAppender adoNetAppender = new AdoNetAppender();
-            adoNetAppender.BufferSize = bufferSize;
+      AdoNetAppender adoNetAppender = new AdoNetAppender();
+      adoNetAppender.BufferSize = bufferSize;
 #if NETSTANDARD1_3
             adoNetAppender.ConnectionType = typeof(Log4NetConnection).AssemblyQualifiedName;
 #else
-            adoNetAppender.ConnectionType = "log4net.Tests.Appender.AdoNet.Log4NetConnection";
+      adoNetAppender.ConnectionType = "log4net.Tests.Appender.AdoNet.Log4NetConnection";
 #endif
-            adoNetAppender.ActivateOptions();
+      adoNetAppender.ActivateOptions();
 
-            BasicConfigurator.Configure(rep, adoNetAppender);
+      BasicConfigurator.Configure(rep, adoNetAppender);
 
-            ILog log = LogManager.GetLogger(rep.Name, "BufferingTest");
-            for (int i = 0; i < bufferSize; i++)
-            {
-                log.Debug("Message");
-                Assert.IsNull(Log4NetCommand.MostRecentInstance);
-            }
-            log.Debug("Message");
-            Assert.NotNull(Log4NetCommand.MostRecentInstance);
-            Assert.AreEqual(bufferSize+1, Log4NetCommand.MostRecentInstance.ExecuteNonQueryCount);
-        }
+      ILog log = LogManager.GetLogger(rep.Name, "BufferingTest");
+      for (int i = 0; i < bufferSize; i++)
+      {
+        log.Debug("Message");
+        Assert.IsNull(Log4NetCommand.MostRecentInstance);
+      }
+      log.Debug("Message");
+      Assert.NotNull(Log4NetCommand.MostRecentInstance);
+      Assert.AreEqual(bufferSize + 1, Log4NetCommand.MostRecentInstance.ExecuteNonQueryCount);
+    }
 
 #if !NETSTANDARD1_3
-        [Test]
-        public void WebsiteExample()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            #region Load log4netConfig
-            log4netConfig.LoadXml(@"
+    [Test]
+    public void WebsiteExample()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      #region Load log4netConfig
+      log4netConfig.LoadXml(@"
                 <log4net>
                 <appender name=""AdoNetAppender"" type=""log4net.Appender.AdoNetAppender"">
                     <bufferSize value=""-1"" />
@@ -154,41 +154,41 @@
                     <appender-ref ref=""AdoNetAppender"" />
                   </root>  
                 </log4net>");
-            #endregion
+      #endregion
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
-            ILog log = LogManager.GetLogger(rep.Name, "WebsiteExample");
-            log.Debug("Message");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILog log = LogManager.GetLogger(rep.Name, "WebsiteExample");
+      log.Debug("Message");
 
-            IDbCommand command = Log4NetCommand.MostRecentInstance;
-            
-            Assert.NotNull(command);
-            Assert.AreEqual(
-                "INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)",
-                command.CommandText);
-            
-            Assert.AreEqual(6, command.Parameters.Count);
+      IDbCommand command = Log4NetCommand.MostRecentInstance;
 
-            IDbDataParameter param = (IDbDataParameter)command.Parameters["@message"];
-            Assert.AreEqual("Message", param.Value);
+      Assert.NotNull(command);
+      Assert.AreEqual(
+          "INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)",
+          command.CommandText);
 
-            param = (IDbDataParameter)command.Parameters["@log_level"];
-            Assert.AreEqual(Level.Debug.ToString(), param.Value);
+      Assert.AreEqual(6, command.Parameters.Count);
 
-            param = (IDbDataParameter)command.Parameters["@logger"];
-            Assert.AreEqual("WebsiteExample", param.Value);
+      IDbDataParameter param = (IDbDataParameter)command.Parameters["@message"];
+      Assert.AreEqual("Message", param.Value);
 
-            param = (IDbDataParameter)command.Parameters["@exception"];
-            Assert.IsEmpty((string)param.Value);
-        }
+      param = (IDbDataParameter)command.Parameters["@log_level"];
+      Assert.AreEqual(Level.Debug.ToString(), param.Value);
 
-        [Test]
-        public void BufferingWebsiteExample()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            #region Load log4netConfig
-            log4netConfig.LoadXml(@"
+      param = (IDbDataParameter)command.Parameters["@logger"];
+      Assert.AreEqual("WebsiteExample", param.Value);
+
+      param = (IDbDataParameter)command.Parameters["@exception"];
+      Assert.IsEmpty((string)param.Value);
+    }
+
+    [Test]
+    public void BufferingWebsiteExample()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      #region Load log4netConfig
+      log4netConfig.LoadXml(@"
                 <log4net>
                 <appender name=""AdoNetAppender"" type=""log4net.Appender.AdoNetAppender"">
                     <bufferSize value=""2"" />
@@ -244,46 +244,46 @@
                     <appender-ref ref=""AdoNetAppender"" />
                   </root>  
                 </log4net>");
-            #endregion
+      #endregion
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
-            ILog log = LogManager.GetLogger(rep.Name, "WebsiteExample");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILog log = LogManager.GetLogger(rep.Name, "WebsiteExample");
 
-            for (int i = 0; i < 3; i++)
-            {
-                log.Debug("Message");
-            }
+      for (int i = 0; i < 3; i++)
+      {
+        log.Debug("Message");
+      }
 
-            IDbCommand command = Log4NetCommand.MostRecentInstance;
+      IDbCommand command = Log4NetCommand.MostRecentInstance;
 
-            Assert.NotNull(command);
-            Assert.AreEqual(
-                "INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)",
-                command.CommandText);
+      Assert.NotNull(command);
+      Assert.AreEqual(
+          "INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)",
+          command.CommandText);
 
-            Assert.AreEqual(6, command.Parameters.Count);
+      Assert.AreEqual(6, command.Parameters.Count);
 
-            IDbDataParameter param = (IDbDataParameter)command.Parameters["@message"];
-            Assert.AreEqual("Message", param.Value);
+      IDbDataParameter param = (IDbDataParameter)command.Parameters["@message"];
+      Assert.AreEqual("Message", param.Value);
 
-            param = (IDbDataParameter)command.Parameters["@log_level"];
-            Assert.AreEqual(Level.Debug.ToString(), param.Value);
+      param = (IDbDataParameter)command.Parameters["@log_level"];
+      Assert.AreEqual(Level.Debug.ToString(), param.Value);
 
-            param = (IDbDataParameter)command.Parameters["@logger"];
-            Assert.AreEqual("WebsiteExample", param.Value);
+      param = (IDbDataParameter)command.Parameters["@logger"];
+      Assert.AreEqual("WebsiteExample", param.Value);
 
-            param = (IDbDataParameter)command.Parameters["@exception"];
-            Assert.IsEmpty((string)param.Value);
-        }
+      param = (IDbDataParameter)command.Parameters["@exception"];
+      Assert.IsEmpty((string)param.Value);
+    }
 #endif
 
-        [Test]
-        public void NullPropertyXmlConfig()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            #region Load log4netConfig
-            log4netConfig.LoadXml(@"
+    [Test]
+    public void NullPropertyXmlConfig()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      #region Load log4netConfig
+      log4netConfig.LoadXml(@"
                 <log4net>
                 <appender name=""AdoNetAppender"" type=""log4net.Appender.AdoNetAppender"">
                     <bufferSize value=""-1"" />
@@ -304,54 +304,54 @@
                     <appender-ref ref=""AdoNetAppender"" />
                   </root>  
                 </log4net>");
-            #endregion
+      #endregion
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
-            ILog log = LogManager.GetLogger(rep.Name, "NullPropertyXmlConfig");
-            
-            log.Debug("Message");
-            IDbCommand command = Log4NetCommand.MostRecentInstance;
-            Assert.NotNull(command);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILog log = LogManager.GetLogger(rep.Name, "NullPropertyXmlConfig");
 
-            IDbDataParameter param = (IDbDataParameter)command.Parameters["@productId"];
-            Assert.AreNotEqual(SystemInfo.NullText, param.Value);
-            Assert.AreEqual(DBNull.Value, param.Value);
-        }
+      log.Debug("Message");
+      IDbCommand command = Log4NetCommand.MostRecentInstance;
+      Assert.NotNull(command);
 
-        [Test]
-        public void NullPropertyProgmaticConfig()
-        {
-            AdoNetAppenderParameter productIdParam = new AdoNetAppenderParameter();
-            productIdParam.ParameterName = "@productId";
-            productIdParam.DbType = DbType.String;
-            productIdParam.Size = 50;
-            RawPropertyLayout rawPropertyLayout = new RawPropertyLayout();
-            rawPropertyLayout.Key = "ProductId";
-            productIdParam.Layout = rawPropertyLayout;
+      IDbDataParameter param = (IDbDataParameter)command.Parameters["@productId"];
+      Assert.AreNotEqual(SystemInfo.NullText, param.Value);
+      Assert.AreEqual(DBNull.Value, param.Value);
+    }
 
-            AdoNetAppender appender = new AdoNetAppender();
+    [Test]
+    public void NullPropertyProgmaticConfig()
+    {
+      AdoNetAppenderParameter productIdParam = new AdoNetAppenderParameter();
+      productIdParam.ParameterName = "@productId";
+      productIdParam.DbType = DbType.String;
+      productIdParam.Size = 50;
+      RawPropertyLayout rawPropertyLayout = new RawPropertyLayout();
+      rawPropertyLayout.Key = "ProductId";
+      productIdParam.Layout = rawPropertyLayout;
+
+      AdoNetAppender appender = new AdoNetAppender();
 #if NETSTANDARD1_3
             appender.ConnectionType = typeof(Log4NetConnection).AssemblyQualifiedName;
 #else
-            appender.ConnectionType = typeof(Log4NetConnection).FullName;
+      appender.ConnectionType = typeof(Log4NetConnection).FullName;
 #endif
-            appender.BufferSize = -1;
-            appender.CommandText = "INSERT INTO Log ([productId]) VALUES (@productId)";
-            appender.AddParameter(productIdParam);
-            appender.ActivateOptions();
+      appender.BufferSize = -1;
+      appender.CommandText = "INSERT INTO Log ([productId]) VALUES (@productId)";
+      appender.AddParameter(productIdParam);
+      appender.ActivateOptions();
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, appender);
-            ILog log = LogManager.GetLogger(rep.Name, "NullPropertyProgmaticConfig");
-            
-            log.Debug("Message");
-            IDbCommand command = Log4NetCommand.MostRecentInstance;
-            Assert.NotNull(command);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, appender);
+      ILog log = LogManager.GetLogger(rep.Name, "NullPropertyProgmaticConfig");
 
-            IDbDataParameter param = (IDbDataParameter)command.Parameters["@productId"];
-            Assert.AreNotEqual(SystemInfo.NullText, param.Value);
-            Assert.AreEqual(DBNull.Value, param.Value);
-        }
+      log.Debug("Message");
+      IDbCommand command = Log4NetCommand.MostRecentInstance;
+      Assert.NotNull(command);
+
+      IDbDataParameter param = (IDbDataParameter)command.Parameters["@productId"];
+      Assert.AreNotEqual(SystemInfo.NullText, param.Value);
+      Assert.AreEqual(DBNull.Value, param.Value);
     }
+  }
 }
diff --git a/src/log4net.Tests/Appender/AppenderCollectionTest.cs b/src/log4net.Tests/Appender/AppenderCollectionTest.cs
index e22c364..cf135f6 100644
--- a/src/log4net.Tests/Appender/AppenderCollectionTest.cs
+++ b/src/log4net.Tests/Appender/AppenderCollectionTest.cs
@@ -22,44 +22,44 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="AppenderCollection"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="AppenderCollection"/> class.
-	/// </remarks>
-	/// <author>Carlos Muñoz</author>
-	[TestFixture]
-	public class AppenderCollectionTest
-	{
-		/// <summary>
-		/// Verifies that ToArray returns the elements of the <see cref="AppenderCollection"/>
-		/// </summary>
-		[Test]
-		public void ToArrayTest()
-		{
-			AppenderCollection appenderCollection = new AppenderCollection();
-			IAppender appender = new MemoryAppender();
-			appenderCollection.Add(appender);
+  /// <summary>
+  /// Used for internal unit testing the <see cref="AppenderCollection"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="AppenderCollection"/> class.
+  /// </remarks>
+  /// <author>Carlos Muñoz</author>
+  [TestFixture]
+  public class AppenderCollectionTest
+  {
+    /// <summary>
+    /// Verifies that ToArray returns the elements of the <see cref="AppenderCollection"/>
+    /// </summary>
+    [Test]
+    public void ToArrayTest()
+    {
+      AppenderCollection appenderCollection = new AppenderCollection();
+      IAppender appender = new MemoryAppender();
+      appenderCollection.Add(appender);
 
-			IAppender[] appenderArray = appenderCollection.ToArray();
+      IAppender[] appenderArray = appenderCollection.ToArray();
 
-			Assert.AreEqual(1, appenderArray.Length);
-			Assert.AreEqual(appender, appenderArray[0]);
-		}
+      Assert.AreEqual(1, appenderArray.Length);
+      Assert.AreEqual(appender, appenderArray[0]);
+    }
 
-		[Test]
-		public void ReadOnlyToArrayTest()
-		{
-			AppenderCollection appenderCollection = new AppenderCollection();
-			IAppender appender = new MemoryAppender();
-			appenderCollection.Add(appender);
-			AppenderCollection readonlyAppenderCollection = AppenderCollection.ReadOnly(appenderCollection);
+    [Test]
+    public void ReadOnlyToArrayTest()
+    {
+      AppenderCollection appenderCollection = new AppenderCollection();
+      IAppender appender = new MemoryAppender();
+      appenderCollection.Add(appender);
+      AppenderCollection readonlyAppenderCollection = AppenderCollection.ReadOnly(appenderCollection);
 
-			IAppender[] appenderArray = readonlyAppenderCollection.ToArray();
+      IAppender[] appenderArray = readonlyAppenderCollection.ToArray();
 
-			Assert.AreEqual(1, appenderArray.Length);
-			Assert.AreEqual(appender, appenderArray[0]);
-		}
-	}
+      Assert.AreEqual(1, appenderArray.Length);
+      Assert.AreEqual(appender, appenderArray[0]);
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/BufferingAppenderTest.cs b/src/log4net.Tests/Appender/BufferingAppenderTest.cs
index ca65663..638ad69 100644
--- a/src/log4net.Tests/Appender/BufferingAppenderTest.cs
+++ b/src/log4net.Tests/Appender/BufferingAppenderTest.cs
@@ -25,88 +25,88 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="BufferingAppenderSkeleton"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="BufferingAppenderSkeleton"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class BufferingAppenderTest
-	{
-		private BufferingForwardingAppender m_bufferingForwardingAppender;
-		private CountingAppender m_countingAppender;
-		private Repository.Hierarchy.Hierarchy m_hierarchy;
+  /// <summary>
+  /// Used for internal unit testing the <see cref="BufferingAppenderSkeleton"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="BufferingAppenderSkeleton"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class BufferingAppenderTest
+  {
+    private BufferingForwardingAppender m_bufferingForwardingAppender;
+    private CountingAppender m_countingAppender;
+    private Repository.Hierarchy.Hierarchy m_hierarchy;
 
 
-		private void SetupRepository()
-		{
-			m_hierarchy = new Repository.Hierarchy.Hierarchy();
+    private void SetupRepository()
+    {
+      m_hierarchy = new Repository.Hierarchy.Hierarchy();
 
-			m_countingAppender = new CountingAppender();
-			m_countingAppender.ActivateOptions();
+      m_countingAppender = new CountingAppender();
+      m_countingAppender.ActivateOptions();
 
-			m_bufferingForwardingAppender = new BufferingForwardingAppender();
-			m_bufferingForwardingAppender.AddAppender(m_countingAppender);
+      m_bufferingForwardingAppender = new BufferingForwardingAppender();
+      m_bufferingForwardingAppender.AddAppender(m_countingAppender);
 
-			m_bufferingForwardingAppender.BufferSize = 0;
-			m_bufferingForwardingAppender.ClearFilters();
-			m_bufferingForwardingAppender.Evaluator = null;
-			m_bufferingForwardingAppender.Fix = FixFlags.Partial;
-			m_bufferingForwardingAppender.Lossy = false;
-			m_bufferingForwardingAppender.LossyEvaluator = null;
-			m_bufferingForwardingAppender.Threshold = Level.All;
+      m_bufferingForwardingAppender.BufferSize = 0;
+      m_bufferingForwardingAppender.ClearFilters();
+      m_bufferingForwardingAppender.Evaluator = null;
+      m_bufferingForwardingAppender.Fix = FixFlags.Partial;
+      m_bufferingForwardingAppender.Lossy = false;
+      m_bufferingForwardingAppender.LossyEvaluator = null;
+      m_bufferingForwardingAppender.Threshold = Level.All;
 
-			m_bufferingForwardingAppender.ActivateOptions();
+      m_bufferingForwardingAppender.ActivateOptions();
 
-			BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
-		}
+      BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
+    }
 
-		/// <summary>
-		/// </summary>
-		[Test]
-		public void TestSetupAppender()
-		{
-			SetupRepository();
+    /// <summary>
+    /// </summary>
+    [Test]
+    public void TestSetupAppender()
+    {
+      SetupRepository();
 
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test empty appender");
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test empty appender");
 
-			ILogger logger = m_hierarchy.GetLogger("test");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message logged", null);
+      ILogger logger = m_hierarchy.GetLogger("test");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message logged", null);
 
-			Assert.AreEqual(1, m_countingAppender.Counter, "Test 1 event logged");
-		}
+      Assert.AreEqual(1, m_countingAppender.Counter, "Test 1 event logged");
+    }
 
-		/// <summary>
-		/// </summary>
-		[Test]
-		public void TestBufferSize5()
-		{
-			SetupRepository();
+    /// <summary>
+    /// </summary>
+    [Test]
+    public void TestBufferSize5()
+    {
+      SetupRepository();
 
-			m_bufferingForwardingAppender.BufferSize = 5;
-			m_bufferingForwardingAppender.ActivateOptions();
+      m_bufferingForwardingAppender.BufferSize = 5;
+      m_bufferingForwardingAppender.ActivateOptions();
 
-			Assert.AreEqual(m_countingAppender.Counter, 0);
+      Assert.AreEqual(m_countingAppender.Counter, 0);
 
-			ILogger logger = m_hierarchy.GetLogger("test");
+      ILogger logger = m_hierarchy.GetLogger("test");
 
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 1", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 1 event in buffer");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 2", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 event in buffer");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 3", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 event in buffer");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 4", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 4 event in buffer");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 5", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 5 event in buffer");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 6", null);
-			Assert.AreEqual(6, m_countingAppender.Counter, "Test 0 event in buffer. 6 event sent");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 7", null);
-			Assert.AreEqual(6, m_countingAppender.Counter, "Test 1 event in buffer. 6 event sent");
-			logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 8", null);
-			Assert.AreEqual(6, m_countingAppender.Counter, "Test 2 event in buffer. 6 event sent");
-		}
-	}
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 1", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 1 event in buffer");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 2", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 event in buffer");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 3", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 event in buffer");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 4", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 4 event in buffer");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 5", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 5 event in buffer");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 6", null);
+      Assert.AreEqual(6, m_countingAppender.Counter, "Test 0 event in buffer. 6 event sent");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 7", null);
+      Assert.AreEqual(6, m_countingAppender.Counter, "Test 1 event in buffer. 6 event sent");
+      logger.Log(typeof(BufferingAppenderTest), Level.Warn, "Message 8", null);
+      Assert.AreEqual(6, m_countingAppender.Counter, "Test 2 event in buffer. 6 event sent");
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/CountingAppender.cs b/src/log4net.Tests/Appender/CountingAppender.cs
index 0e0aa15..e39754a 100644
--- a/src/log4net.Tests/Appender/CountingAppender.cs
+++ b/src/log4net.Tests/Appender/CountingAppender.cs
@@ -22,64 +22,64 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Implements an Appender for test purposes that counts the
-	/// number of output calls to <see cref="Append" />.
-	/// </summary>
-	/// <remarks>
-	/// This appender is used in the unit tests.
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class CountingAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
-		/// <summary>
-		/// Initializes a new instance of the <see cref="CountingAppender" /> class.
-		/// </summary>
-		public CountingAppender()
-		{
-			m_counter = 0;
-		}
-		#endregion Public Instance Constructors
+  /// <summary>
+  /// Implements an Appender for test purposes that counts the
+  /// number of output calls to <see cref="Append" />.
+  /// </summary>
+  /// <remarks>
+  /// This appender is used in the unit tests.
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class CountingAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
+    /// <summary>
+    /// Initializes a new instance of the <see cref="CountingAppender" /> class.
+    /// </summary>
+    public CountingAppender()
+    {
+      m_counter = 0;
+    }
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
-		/// <summary>
-		/// Returns the number of times <see cref="Append" /> has been called.
-		/// </summary>
-		/// <value>
-		/// The number of times <see cref="Append" /> has been called.
-		/// </value>
-		public int Counter
-		{
-			get { return m_counter; }
-		}
-		#endregion Public Instance Properties
+    #region Public Instance Properties
+    /// <summary>
+    /// Returns the number of times <see cref="Append" /> has been called.
+    /// </summary>
+    /// <value>
+    /// The number of times <see cref="Append" /> has been called.
+    /// </value>
+    public int Counter
+    {
+      get { return m_counter; }
+    }
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// Reset the counter to zero
-		/// </summary>
-		public void ResetCounter()
-		{
-			m_counter = 0;
-		}
+    /// <summary>
+    /// Reset the counter to zero
+    /// </summary>
+    public void ResetCounter()
+    {
+      m_counter = 0;
+    }
 
-		#region Override implementation of AppenderSkeleton
-		/// <summary>
-		/// Registers how many times the method has been called.
-		/// </summary>
-		/// <param name="logEvent">The logging event.</param>
-		protected override void Append(LoggingEvent logEvent)
-		{
-			m_counter++;
-		}
-		#endregion Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
+    /// <summary>
+    /// Registers how many times the method has been called.
+    /// </summary>
+    /// <param name="logEvent">The logging event.</param>
+    protected override void Append(LoggingEvent logEvent)
+    {
+      m_counter++;
+    }
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Private Instance Fields
-		/// <summary>
-		/// The number of times <see cref="Append" /> has been called.
-		/// </summary>
-		private int m_counter;
-		#endregion Private Instance Fields
-	}
+    #region Private Instance Fields
+    /// <summary>
+    /// The number of times <see cref="Append" /> has been called.
+    /// </summary>
+    private int m_counter;
+    #endregion Private Instance Fields
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/DebugAppenderTest.cs b/src/log4net.Tests/Appender/DebugAppenderTest.cs
index 89983ab..8cc2608 100644
--- a/src/log4net.Tests/Appender/DebugAppenderTest.cs
+++ b/src/log4net.Tests/Appender/DebugAppenderTest.cs
@@ -31,145 +31,145 @@
 
 namespace log4net.Tests.Appender
 {
-    [TestFixture]
-    public class DebugAppenderTest
+  [TestFixture]
+  public class DebugAppenderTest
+  {
+    [Test]
+    public void NullCategoryTest()
     {
-        [Test]
-        public void NullCategoryTest()
-        {
-            CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
-            Debug.Listeners.Add(categoryTraceListener);
+      CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
+      Debug.Listeners.Add(categoryTraceListener);
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 
-            DebugAppender debugAppender = new DebugAppender();
-            debugAppender.Layout = new SimpleLayout();
-            debugAppender.ActivateOptions();
+      DebugAppender debugAppender = new DebugAppender();
+      debugAppender.Layout = new SimpleLayout();
+      debugAppender.ActivateOptions();
 
-            debugAppender.Category = null;
+      debugAppender.Category = null;
 
-            TestErrorHandler testErrHandler = new TestErrorHandler();
-            debugAppender.ErrorHandler = testErrHandler;            
+      TestErrorHandler testErrHandler = new TestErrorHandler();
+      debugAppender.ErrorHandler = testErrHandler;
 
-            BasicConfigurator.Configure(rep, debugAppender);
+      BasicConfigurator.Configure(rep, debugAppender);
 
-            ILog log = LogManager.GetLogger(rep.Name, GetType());
-            log.Debug("Message");
+      ILog log = LogManager.GetLogger(rep.Name, GetType());
+      log.Debug("Message");
 
-            Assert.AreEqual(
-                null,
-                categoryTraceListener.Category);
+      Assert.AreEqual(
+          null,
+          categoryTraceListener.Category);
 
-            Assert.IsFalse(testErrHandler.ErrorOccured);
+      Assert.IsFalse(testErrHandler.ErrorOccured);
 
-            Debug.Listeners.Remove(categoryTraceListener);
-        }
-
-        [Test]
-        public void EmptyStringCategoryTest()
-        {
-            CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
-            Debug.Listeners.Add(categoryTraceListener);
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-
-            DebugAppender debugAppender = new DebugAppender();
-            debugAppender.Layout = new SimpleLayout();
-            debugAppender.ActivateOptions();
-
-            debugAppender.Category = new PatternLayout("");
-
-            BasicConfigurator.Configure(rep, debugAppender);
-
-            ILog log = LogManager.GetLogger(rep.Name, GetType());
-            log.Debug("Message");
-
-            Assert.AreEqual(
-                null,
-                categoryTraceListener.Category);
-
-            Debug.Listeners.Remove(categoryTraceListener);
-        }
-
-        [Test]
-        public void DefaultCategoryTest()
-        {
-            CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
-            Debug.Listeners.Add(categoryTraceListener);
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-
-            DebugAppender debugAppender = new DebugAppender();
-            debugAppender.Layout = new SimpleLayout();
-            debugAppender.ActivateOptions();
-
-            BasicConfigurator.Configure(rep, debugAppender);
-
-            ILog log = LogManager.GetLogger(rep.Name, GetType());
-            log.Debug("Message");
-
-            Assert.AreEqual(
-                GetType().ToString(),
-                categoryTraceListener.Category);
-
-            Debug.Listeners.Remove(categoryTraceListener);
-        }
-
-        [Test]
-        public void MethodNameCategoryTest()
-        {
-            CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
-            Debug.Listeners.Add(categoryTraceListener);
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-
-            DebugAppender debugAppender = new DebugAppender();
-            PatternLayout methodLayout = new PatternLayout("%method");
-            methodLayout.ActivateOptions();
-            debugAppender.Category = methodLayout;
-            debugAppender.Layout = new SimpleLayout();
-            debugAppender.ActivateOptions();
-
-            BasicConfigurator.Configure(rep, debugAppender);
-
-            ILog log = LogManager.GetLogger(rep.Name, GetType());
-            log.Debug("Message");
-
-            Assert.AreEqual(
-                System.Reflection.MethodInfo.GetCurrentMethod().Name,
-                categoryTraceListener.Category);
-
-            Debug.Listeners.Remove(categoryTraceListener);
-        }
-
-        private class TestErrorHandler : IErrorHandler
-        {
-            private bool m_errorOccured = false;
-
-            public bool ErrorOccured
-            { 
-                get { return m_errorOccured; }
-            }
-            #region IErrorHandler Members
-
-            public void Error(string message, Exception e, ErrorCode errorCode)
-            {
-                m_errorOccured = true;
-            }
-
-            public void Error(string message, Exception e)
-            {
-                Error(message, e, ErrorCode.GenericFailure);
-            }
-
-            public void Error(string message)
-            {
-                Error(message, null, ErrorCode.GenericFailure);
-            }
-
-            #endregion
-        }
+      Debug.Listeners.Remove(categoryTraceListener);
     }
+
+    [Test]
+    public void EmptyStringCategoryTest()
+    {
+      CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
+      Debug.Listeners.Add(categoryTraceListener);
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+
+      DebugAppender debugAppender = new DebugAppender();
+      debugAppender.Layout = new SimpleLayout();
+      debugAppender.ActivateOptions();
+
+      debugAppender.Category = new PatternLayout("");
+
+      BasicConfigurator.Configure(rep, debugAppender);
+
+      ILog log = LogManager.GetLogger(rep.Name, GetType());
+      log.Debug("Message");
+
+      Assert.AreEqual(
+          null,
+          categoryTraceListener.Category);
+
+      Debug.Listeners.Remove(categoryTraceListener);
+    }
+
+    [Test]
+    public void DefaultCategoryTest()
+    {
+      CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
+      Debug.Listeners.Add(categoryTraceListener);
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+
+      DebugAppender debugAppender = new DebugAppender();
+      debugAppender.Layout = new SimpleLayout();
+      debugAppender.ActivateOptions();
+
+      BasicConfigurator.Configure(rep, debugAppender);
+
+      ILog log = LogManager.GetLogger(rep.Name, GetType());
+      log.Debug("Message");
+
+      Assert.AreEqual(
+          GetType().ToString(),
+          categoryTraceListener.Category);
+
+      Debug.Listeners.Remove(categoryTraceListener);
+    }
+
+    [Test]
+    public void MethodNameCategoryTest()
+    {
+      CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
+      Debug.Listeners.Add(categoryTraceListener);
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+
+      DebugAppender debugAppender = new DebugAppender();
+      PatternLayout methodLayout = new PatternLayout("%method");
+      methodLayout.ActivateOptions();
+      debugAppender.Category = methodLayout;
+      debugAppender.Layout = new SimpleLayout();
+      debugAppender.ActivateOptions();
+
+      BasicConfigurator.Configure(rep, debugAppender);
+
+      ILog log = LogManager.GetLogger(rep.Name, GetType());
+      log.Debug("Message");
+
+      Assert.AreEqual(
+          System.Reflection.MethodInfo.GetCurrentMethod().Name,
+          categoryTraceListener.Category);
+
+      Debug.Listeners.Remove(categoryTraceListener);
+    }
+
+    private class TestErrorHandler : IErrorHandler
+    {
+      private bool m_errorOccured = false;
+
+      public bool ErrorOccured
+      {
+        get { return m_errorOccured; }
+      }
+      #region IErrorHandler Members
+
+      public void Error(string message, Exception e, ErrorCode errorCode)
+      {
+        m_errorOccured = true;
+      }
+
+      public void Error(string message, Exception e)
+      {
+        Error(message, e, ErrorCode.GenericFailure);
+      }
+
+      public void Error(string message)
+      {
+        Error(message, null, ErrorCode.GenericFailure);
+      }
+
+      #endregion
+    }
+  }
 }
 
 #endif
diff --git a/src/log4net.Tests/Appender/EventLogAppenderTest.cs b/src/log4net.Tests/Appender/EventLogAppenderTest.cs
index e055f2f..63e7771 100644
--- a/src/log4net.Tests/Appender/EventLogAppenderTest.cs
+++ b/src/log4net.Tests/Appender/EventLogAppenderTest.cs
@@ -29,77 +29,77 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="EventLogAppender"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="EventLogAppender"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class EventLogAppenderTest
-	{
-		/// <summary>
-		/// Verifies that for each event log level, the correct system
-		/// event log enumeration is returned
-		/// </summary>
-		[Test]
-		public void TestGetEntryTypeForExistingApplicationName()
-		{
-			EventLogAppender eventAppender = new EventLogAppender();
-            eventAppender.ApplicationName = "Winlogon";
-			eventAppender.ActivateOptions();
+  /// <summary>
+  /// Used for internal unit testing the <see cref="EventLogAppender"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="EventLogAppender"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class EventLogAppenderTest
+  {
+    /// <summary>
+    /// Verifies that for each event log level, the correct system
+    /// event log enumeration is returned
+    /// </summary>
+    [Test]
+    public void TestGetEntryTypeForExistingApplicationName()
+    {
+      EventLogAppender eventAppender = new EventLogAppender();
+      eventAppender.ApplicationName = "Winlogon";
+      eventAppender.ActivateOptions();
 
-			Assert.AreEqual(
-				EventLogEntryType.Information,
-				GetEntryType(eventAppender, Level.All));
+      Assert.AreEqual(
+        EventLogEntryType.Information,
+        GetEntryType(eventAppender, Level.All));
 
-			Assert.AreEqual(
-				EventLogEntryType.Information,
-				GetEntryType(eventAppender, Level.Debug));
+      Assert.AreEqual(
+        EventLogEntryType.Information,
+        GetEntryType(eventAppender, Level.Debug));
 
-			Assert.AreEqual(
-				EventLogEntryType.Information,
-				GetEntryType(eventAppender, Level.Info));
+      Assert.AreEqual(
+        EventLogEntryType.Information,
+        GetEntryType(eventAppender, Level.Info));
 
-			Assert.AreEqual(
-				EventLogEntryType.Warning,
-				GetEntryType(eventAppender, Level.Warn));
+      Assert.AreEqual(
+        EventLogEntryType.Warning,
+        GetEntryType(eventAppender, Level.Warn));
 
-			Assert.AreEqual(
-				EventLogEntryType.Error,
-				GetEntryType(eventAppender, Level.Error));
+      Assert.AreEqual(
+        EventLogEntryType.Error,
+        GetEntryType(eventAppender, Level.Error));
 
-			Assert.AreEqual(
-				EventLogEntryType.Error,
-				GetEntryType(eventAppender, Level.Fatal));
+      Assert.AreEqual(
+        EventLogEntryType.Error,
+        GetEntryType(eventAppender, Level.Fatal));
 
-			Assert.AreEqual(
-				EventLogEntryType.Error,
-				GetEntryType(eventAppender, Level.Off));
-		}
+      Assert.AreEqual(
+        EventLogEntryType.Error,
+        GetEntryType(eventAppender, Level.Off));
+    }
 
-        /// <summary>
-        /// ActivateOption tries to create an event source if it doesn't exist but this is going to fail on more modern Windows versions unless the code is run with local administrator privileges.
-        /// </summary>
-        [Test]
-	[Ignore("seems to require administrator privileges or a specific environent when run")]
-        public void ActivateOptionsDisablesAppenderIfSourceDoesntExist()
-        {
-            EventLogAppender eventAppender = new EventLogAppender();
-            eventAppender.ActivateOptions();
-            Assert.AreEqual(Level.Off, eventAppender.Threshold);
-        }
+    /// <summary>
+    /// ActivateOption tries to create an event source if it doesn't exist but this is going to fail on more modern Windows versions unless the code is run with local administrator privileges.
+    /// </summary>
+    [Test]
+    [Ignore("seems to require administrator privileges or a specific environent when run")]
+    public void ActivateOptionsDisablesAppenderIfSourceDoesntExist()
+    {
+      EventLogAppender eventAppender = new EventLogAppender();
+      eventAppender.ActivateOptions();
+      Assert.AreEqual(Level.Off, eventAppender.Threshold);
+    }
 
-		//
-		// Helper functions to dig into the appender
-		//
+    //
+    // Helper functions to dig into the appender
+    //
 
-		private static EventLogEntryType GetEntryType(EventLogAppender appender, Level level)
-		{
-			return (EventLogEntryType)Utils.InvokeMethod(appender, "GetEntryType", level);
-		}
+    private static EventLogEntryType GetEntryType(EventLogAppender appender, Level level)
+    {
+      return (EventLogEntryType)Utils.InvokeMethod(appender, "GetEntryType", level);
+    }
 
-	}
+  }
 }
 
 #endif // NET_2_0
diff --git a/src/log4net.Tests/Appender/MemoryAppenderTest.cs b/src/log4net.Tests/Appender/MemoryAppenderTest.cs
index 9b4e7a0..7bb755b 100644
--- a/src/log4net.Tests/Appender/MemoryAppenderTest.cs
+++ b/src/log4net.Tests/Appender/MemoryAppenderTest.cs
@@ -32,59 +32,60 @@
 
 namespace log4net.Tests.Appender
 {
-    [TestFixture]
-    public class MemoryAppenderTest
+  [TestFixture]
+  public class MemoryAppenderTest
+  {
+    private static int cThreadsRunning;
+    private const int cThreadsMax = 10;
+    private const int cLogEntriesPerThread = 100;
+    private const long cEventsExpected = cLogEntriesPerThread * cThreadsMax;
+
+    [Test]
+    public void TestThreadSafety()
     {
-        private static int cThreadsRunning;
-        private const int cThreadsMax = 10;
-        private const int cLogEntriesPerThread = 100;
-        private const long cEventsExpected = cLogEntriesPerThread * cThreadsMax;
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      var memoryAppender = new MemoryAppender();
+      var patternLayout = new PatternLayout();
+      memoryAppender.Layout = patternLayout;
+      memoryAppender.ActivateOptions();
+      BasicConfigurator.Configure(rep, memoryAppender);
 
-        [Test]
-        public void TestThreadSafety()
-        {
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            var memoryAppender = new MemoryAppender();
-            var patternLayout = new PatternLayout();
-            memoryAppender.Layout = patternLayout;
-            memoryAppender.ActivateOptions();
-            BasicConfigurator.Configure(rep, memoryAppender);
+      cThreadsRunning = cThreadsMax;
+      var threads = Enumerable.Range(0, cThreadsMax)
+          .Select(i => new Thread(LogMessages(rep.Name)))
+          .ToList();
 
-            cThreadsRunning = cThreadsMax;
-            var threads = Enumerable.Range(0, cThreadsMax)
-                .Select(i => new Thread(LogMessages(rep.Name)))
-                .ToList();
+      foreach (var thread in threads)
+      {
+        thread.Start();
+      }
 
-            foreach (var thread in threads)
-            {
-                thread.Start();
-            }
-
-            long cEventsRead = 0;
-            while (cThreadsRunning > 0)
-            {
-                var events = memoryAppender.PopAllEvents();
-                cEventsRead += events.Length;
-            }
-            foreach (var thread in threads)
-            {
-                thread.Join();
-            }
-	    cEventsRead += memoryAppender.PopAllEvents().Length;
-            Assert.AreEqual(cEventsExpected, cEventsRead, "Log events were lost.");
-        }
-
-        private static ThreadStart LogMessages(string repository)
-        {
-	    return () => {
-		var logger = LogManager.GetLogger(repository, "LoggerThread");
-		for (var i = 0; i < cLogEntriesPerThread; i++)
-		{
-		    logger.InfoFormat("Logging message {0}", i);
-		}
-		Interlocked.Decrement(ref cThreadsRunning);
-	    };
-	}
+      long cEventsRead = 0;
+      while (cThreadsRunning > 0)
+      {
+        var events = memoryAppender.PopAllEvents();
+        cEventsRead += events.Length;
+      }
+      foreach (var thread in threads)
+      {
+        thread.Join();
+      }
+      cEventsRead += memoryAppender.PopAllEvents().Length;
+      Assert.AreEqual(cEventsExpected, cEventsRead, "Log events were lost.");
     }
+
+    private static ThreadStart LogMessages(string repository)
+    {
+      return () =>
+      {
+        var logger = LogManager.GetLogger(repository, "LoggerThread");
+        for (var i = 0; i < cLogEntriesPerThread; i++)
+        {
+          logger.InfoFormat("Logging message {0}", i);
+        }
+        Interlocked.Decrement(ref cThreadsRunning);
+      };
+    }
+  }
 }
 #endif
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/RemotingAppenderTest.cs b/src/log4net.Tests/Appender/RemotingAppenderTest.cs
index a4de297..49a739f 100644
--- a/src/log4net.Tests/Appender/RemotingAppenderTest.cs
+++ b/src/log4net.Tests/Appender/RemotingAppenderTest.cs
@@ -38,419 +38,423 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="RemotingAppender"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="RemotingAppender"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class RemotingAppenderTest
-	{
-		private IChannel m_remotingChannel = null;
+  /// <summary>
+  /// Used for internal unit testing the <see cref="RemotingAppender"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="RemotingAppender"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class RemotingAppenderTest
+  {
+    private IChannel m_remotingChannel = null;
 
-		/// <summary>
-		/// Test that the Message property is correctly remoted
-		/// </summary>
-		[Test]
-		public void TestRemotedMessage()
-		{
-			// Setup the remoting appender
-			ConfigureRootAppender(FixFlags.Partial);
+    /// <summary>
+    /// Test that the Message property is correctly remoted
+    /// </summary>
+    [Test]
+    public void TestRemotedMessage()
+    {
+      // Setup the remoting appender
+      ConfigureRootAppender(FixFlags.Partial);
 
-			RemoteLoggingSinkImpl.Instance.Reset();
+      RemoteLoggingSinkImpl.Instance.Reset();
 
-			Logger root;
-			root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
+      Logger root;
+      root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
 
-			string testMessage = string.Format("test message [ {0} ]", (new Random()).Next());
+      string testMessage = string.Format("test message [ {0} ]", (new Random()).Next());
 
-			// Log a message that will be remoted
-			root.Log(Level.Debug, testMessage, null);
+      // Log a message that will be remoted
+      root.Log(Level.Debug, testMessage, null);
 
-			// Wait for the remoted object to be delivered
-			Thread.Sleep(2000);
+      // Wait for the remoted object to be delivered
+      Thread.Sleep(2000);
 
-			LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
-			Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
+      LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
+      Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
 
-			Assert.AreEqual(testMessage, events[0].RenderedMessage, "Expect Message match after remoting event");
-		}
+      Assert.AreEqual(testMessage, events[0].RenderedMessage, "Expect Message match after remoting event");
+    }
 
-		/// <summary>
-		/// Test that the LocationInfo property is not remoted when doing a Fix.Partial
-		/// </summary>
-		[Test]
-		public void TestPartialFix()
-		{
-			// Setup the remoting appender
-			ConfigureRootAppender(FixFlags.Partial);
+    /// <summary>
+    /// Test that the LocationInfo property is not remoted when doing a Fix.Partial
+    /// </summary>
+    [Test]
+    public void TestPartialFix()
+    {
+      // Setup the remoting appender
+      ConfigureRootAppender(FixFlags.Partial);
 
-			RemoteLoggingSinkImpl.Instance.Reset();
+      RemoteLoggingSinkImpl.Instance.Reset();
 
-			Logger root;
-			root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
+      Logger root;
+      root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
 
-			// Log a message that will be remoted
-			root.Log(Level.Debug, "test message", null);
+      // Log a message that will be remoted
+      root.Log(Level.Debug, "test message", null);
 
-			// Wait for the remoted object to be delivered
-			Thread.Sleep(2000);
+      // Wait for the remoted object to be delivered
+      Thread.Sleep(2000);
 
-			LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
-			Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
+      LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
+      Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
 
-			// Grab the event data
-			LoggingEventData eventData = GetLoggingEventData(events[0]);
+      // Grab the event data
+      LoggingEventData eventData = GetLoggingEventData(events[0]);
 
-			Assert.IsNull(eventData.LocationInfo, "Expect LocationInfo to be null because only doing a partial fix");
-		}
+      Assert.IsNull(eventData.LocationInfo, "Expect LocationInfo to be null because only doing a partial fix");
+    }
 
-		/// <summary>
-		/// Test that the LocationInfo property is remoted when doing a Fix.All
-		/// </summary>
-		[Test]
-		public void TestFullFix()
-		{
-			// Setup the remoting appender
-			ConfigureRootAppender(FixFlags.All);
+    /// <summary>
+    /// Test that the LocationInfo property is remoted when doing a Fix.All
+    /// </summary>
+    [Test]
+    public void TestFullFix()
+    {
+      // Setup the remoting appender
+      ConfigureRootAppender(FixFlags.All);
 
-			RemoteLoggingSinkImpl.Instance.Reset();
+      RemoteLoggingSinkImpl.Instance.Reset();
 
-			Logger root;
-			root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
+      Logger root;
+      root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
 
-			// Log a message that will be remoted
-			root.Log(Level.Debug, "test message", null);
+      // Log a message that will be remoted
+      root.Log(Level.Debug, "test message", null);
 
-			// Wait for the remoted object to be delivered
-			Thread.Sleep(5000);
+      // Wait for the remoted object to be delivered
+      Thread.Sleep(5000);
 
-			WaitFor("Remote instance should have received a remoting event", () => RemoteLoggingSinkImpl.Instance.Events.Length > 0);
-			LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
-			Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
+      WaitFor("Remote instance should have received a remoting event", () => RemoteLoggingSinkImpl.Instance.Events.Length > 0);
+      LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
+      Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
 
-			// Grab the event data
-			LoggingEventData eventData = GetLoggingEventData(events[0]);
+      // Grab the event data
+      LoggingEventData eventData = GetLoggingEventData(events[0]);
 
-			Assert.IsNotNull(eventData.LocationInfo, "Expect LocationInfo to not be null because doing a full fix");
-		}
+      Assert.IsNotNull(eventData.LocationInfo, "Expect LocationInfo to not be null because doing a full fix");
+    }
 
-		private void WaitFor(
-			string failMessage,
-			Func<bool> condition, 
-			int maxWaitMilliseconds = 5000)
-		{
-			var start = DateTime.Now;
-			do
-			{
-				if (condition())
-				{
-					return;
-				}
-				Thread.Sleep(100);
-			} while ((DateTime.Now - start).TotalMilliseconds < maxWaitMilliseconds);
-			throw new TimeoutException($"Condition not achieved within {maxWaitMilliseconds}ms: {failMessage}");
-		}
+    private void WaitFor(
+      string failMessage,
+      Func<bool> condition,
+      int maxWaitMilliseconds = 5000)
+    {
+      var start = DateTime.Now;
+      do
+      {
+        if (condition())
+        {
+          return;
+        }
+        Thread.Sleep(100);
+      } while ((DateTime.Now - start).TotalMilliseconds < maxWaitMilliseconds);
+      throw new TimeoutException($"Condition not achieved within {maxWaitMilliseconds}ms: {failMessage}");
+    }
 
-		/// <summary>
-		/// Test that the Message property is correctly remoted
-		/// </summary>
-		[Test]
-		public void TestRemotedMessageNdcPushPop()
-		{
-			// Setup the remoting appender
-			ConfigureRootAppender(FixFlags.Partial);
+    /// <summary>
+    /// Test that the Message property is correctly remoted
+    /// </summary>
+    [Test]
+    public void TestRemotedMessageNdcPushPop()
+    {
+      // Setup the remoting appender
+      ConfigureRootAppender(FixFlags.Partial);
 
-			RemoteLoggingSinkImpl.Instance.Reset();
+      RemoteLoggingSinkImpl.Instance.Reset();
 
-			Logger root;
-			root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
+      Logger root;
+      root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
 
-			string testMessage = string.Format("test message [ {0} ]", (new Random()).Next());
+      string testMessage = string.Format("test message [ {0} ]", (new Random()).Next());
 
-			using(NDC.Push("value"))
-			{
-			}
+      using (NDC.Push("value"))
+      {
+      }
 
-			// Log a message that will be remoted
-			root.Log(Level.Debug, testMessage, null);
+      // Log a message that will be remoted
+      root.Log(Level.Debug, testMessage, null);
 
-			// Wait for the remoted object to be delivered
-			Thread.Sleep(2000);
+      // Wait for the remoted object to be delivered
+      Thread.Sleep(2000);
 
-			LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
-			Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
+      LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
+      Assert.AreEqual(1, events.Length, "Expect to receive 1 remoted event");
 
-			Assert.AreEqual(testMessage, events[0].RenderedMessage, "Expect Message match after remoting event");
-		}
+      Assert.AreEqual(testMessage, events[0].RenderedMessage, "Expect Message match after remoting event");
+    }
 
-		[Test]
-		public void TestNestedNdc()
-		{
-			// This test can suffer from timing and ordering issues as the RemotingAppender does dispatch events asynchronously
+    [Test]
+    public void TestNestedNdc()
+    {
+      // This test can suffer from timing and ordering issues as the RemotingAppender does dispatch events asynchronously
 
-			// Setup the remoting appender
-			ConfigureRootAppender(FixFlags.Partial);
+      // Setup the remoting appender
+      ConfigureRootAppender(FixFlags.Partial);
 
-			RemoteLoggingSinkImpl.Instance.Reset();
+      RemoteLoggingSinkImpl.Instance.Reset();
 
-			TestService t;
-			t = new TestService();
-			t.Test();
+      TestService t;
+      t = new TestService();
+      t.Test();
 
-			// Wait for the remoted objects to be delivered
-			Thread.Sleep(3000);
+      // Wait for the remoted objects to be delivered
+      Thread.Sleep(3000);
 
-			LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
-			Assert.AreEqual(5, events.Length, "Expect to receive 5 remoted event");
+      LoggingEvent[] events = RemoteLoggingSinkImpl.Instance.Events;
+      Assert.AreEqual(5, events.Length, "Expect to receive 5 remoted event");
 
-			Assert.AreEqual("begin test", events[0].RenderedMessage, "Verify event 1 RenderedMessage");
-			Assert.AreEqual("feature", events[1].RenderedMessage, "Verify event 2 RenderedMessage");
-			Assert.AreEqual("return", events[2].RenderedMessage, "Verify event 3 RenderedMessage");
-			Assert.AreEqual("return", events[3].RenderedMessage, "Verify event 4 RenderedMessage");
-			Assert.AreEqual("end test", events[4].RenderedMessage, "Verify event 5 RenderedMessage");
+      Assert.AreEqual("begin test", events[0].RenderedMessage, "Verify event 1 RenderedMessage");
+      Assert.AreEqual("feature", events[1].RenderedMessage, "Verify event 2 RenderedMessage");
+      Assert.AreEqual("return", events[2].RenderedMessage, "Verify event 3 RenderedMessage");
+      Assert.AreEqual("return", events[3].RenderedMessage, "Verify event 4 RenderedMessage");
+      Assert.AreEqual("end test", events[4].RenderedMessage, "Verify event 5 RenderedMessage");
 
-			Assert.IsNull(events[0].Properties["NDC"], "Verify event 1 Properties");
-			Assert.AreEqual("test1", events[1].Properties["NDC"], "Verify event 2 Properties");
-			Assert.AreEqual("test1 test2", events[2].Properties["NDC"], "Verify event 3 Properties");
-			Assert.AreEqual("test1", events[3].Properties["NDC"], "Verify event 4 Properties");
-			Assert.IsNull(events[4].Properties["NDC"], "Verify event 5 Properties");
-		}
+      Assert.IsNull(events[0].Properties["NDC"], "Verify event 1 Properties");
+      Assert.AreEqual("test1", events[1].Properties["NDC"], "Verify event 2 Properties");
+      Assert.AreEqual("test1 test2", events[2].Properties["NDC"], "Verify event 3 Properties");
+      Assert.AreEqual("test1", events[3].Properties["NDC"], "Verify event 4 Properties");
+      Assert.IsNull(events[4].Properties["NDC"], "Verify event 5 Properties");
+    }
 
 
-		private void RegisterRemotingServerChannel()
-		{
-			if (m_remotingChannel == null)
-			{
-				BinaryClientFormatterSinkProvider clientSinkProvider = new BinaryClientFormatterSinkProvider();
+    private void RegisterRemotingServerChannel()
+    {
+      if (m_remotingChannel == null)
+      {
+        BinaryClientFormatterSinkProvider clientSinkProvider = new BinaryClientFormatterSinkProvider();
 
-				BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();
-				serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
+        BinaryServerFormatterSinkProvider serverSinkProvider = new BinaryServerFormatterSinkProvider();
+        serverSinkProvider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
 
-				Hashtable channelProperties = new Hashtable();
-				channelProperties["port"] = 8085;
+        Hashtable channelProperties = new Hashtable();
+        channelProperties["port"] = 8085;
 
-				m_remotingChannel = new TcpChannel(channelProperties, clientSinkProvider, serverSinkProvider);
-				// Setup remoting server
-				try
-				{
+        m_remotingChannel = new TcpChannel(channelProperties, clientSinkProvider, serverSinkProvider);
+        // Setup remoting server
+        try
+        {
 #if NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0
-					ChannelServices.RegisterChannel(m_remotingChannel, false);
+          ChannelServices.RegisterChannel(m_remotingChannel, false);
 #else
-					ChannelServices.RegisterChannel(m_remotingChannel);
+          ChannelServices.RegisterChannel(m_remotingChannel);
 #endif
-				}
-				catch(Exception ex)
-				{
-					Assert.Fail("Failed to set up LoggingSink: {0}", ex);
-				}
-
-				// Marshal the sink object
-				RemotingServices.Marshal(RemoteLoggingSinkImpl.Instance, "LoggingSink", typeof(RemotingAppender.IRemoteLoggingSink));
-			}
-		}
-
-        /// <summary>
-		/// Shuts down any loggers in the hierarchy, along
-		/// with all appenders.
-		/// </summary>
-		private static void ResetRepository()
-		{
-			// Regular users should not use the clear method lightly!
-			LogManager.GetRepository().ResetConfiguration();
-			LogManager.GetRepository().Shutdown();
-			((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Clear();
-		}
-
-		/// <summary>
-		/// Any initialization that happens before each test can
-		/// go here
-		/// </summary>
-		[SetUp]
-		public void SetUp()
-		{
-			ResetRepository();
-			RegisterRemotingServerChannel();
-		}
-
-		/// <summary>
-		/// Any steps that happen after each test go here
-		/// </summary>
-		[TearDown]
-		public void TearDown()
-		{
-			ResetRepository();
-		}
-
-        /// <summary>
-        /// Close down remoting infrastructure
-        /// </summary>
-        [OneTimeTearDown]
-        public void UnregisterRemotingServerChannel() {
-            if (m_remotingChannel != null) {
-                ((TcpChannel) m_remotingChannel).StopListening(null);
-                try {
-                    ChannelServices.UnregisterChannel(m_remotingChannel);
-                }
-                catch (Exception) {
-                }
-                m_remotingChannel = null;
-            }
+        }
+        catch (Exception ex)
+        {
+          Assert.Fail("Failed to set up LoggingSink: {0}", ex);
         }
 
-		/// <summary>
-		/// Configures the root appender for counting and rolling
-		/// </summary>
-		private static void ConfigureRootAppender(FixFlags fixFlags)
-		{
-			Logger root;
-			root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
-			root.Level = Level.Debug;
-			root.AddAppender(CreateAppender(fixFlags));
-			root.Repository.Configured = true;
-		}
+        // Marshal the sink object
+        RemotingServices.Marshal(RemoteLoggingSinkImpl.Instance, "LoggingSink", typeof(RemotingAppender.IRemoteLoggingSink));
+      }
+    }
 
-		private static RemotingAppender CreateAppender(FixFlags fixFlags)
-		{
-			RemotingAppender appender = new RemotingAppender();
-			appender.Sink = "tcp://localhost:8085/LoggingSink";
-			appender.Lossy = false;
-			appender.BufferSize = 1;
-			appender.Fix = fixFlags;
+    /// <summary>
+    /// Shuts down any loggers in the hierarchy, along
+    /// with all appenders.
+    /// </summary>
+    private static void ResetRepository()
+    {
+      // Regular users should not use the clear method lightly!
+      LogManager.GetRepository().ResetConfiguration();
+      LogManager.GetRepository().Shutdown();
+      ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Clear();
+    }
 
-			appender.ActivateOptions();
+    /// <summary>
+    /// Any initialization that happens before each test can
+    /// go here
+    /// </summary>
+    [SetUp]
+    public void SetUp()
+    {
+      ResetRepository();
+      RegisterRemotingServerChannel();
+    }
 
-			return appender;
-		}
+    /// <summary>
+    /// Any steps that happen after each test go here
+    /// </summary>
+    [TearDown]
+    public void TearDown()
+    {
+      ResetRepository();
+    }
 
-		public class RemoteLoggingSinkImpl : MarshalByRefObject, RemotingAppender.IRemoteLoggingSink
-		{
-			public static readonly RemoteLoggingSinkImpl Instance = new RemoteLoggingSinkImpl();
+    /// <summary>
+    /// Close down remoting infrastructure
+    /// </summary>
+    [OneTimeTearDown]
+    public void UnregisterRemotingServerChannel()
+    {
+      if (m_remotingChannel != null)
+      {
+        ((TcpChannel)m_remotingChannel).StopListening(null);
+        try
+        {
+          ChannelServices.UnregisterChannel(m_remotingChannel);
+        }
+        catch (Exception)
+        {
+        }
+        m_remotingChannel = null;
+      }
+    }
 
-			private ArrayList m_events = new ArrayList();
+    /// <summary>
+    /// Configures the root appender for counting and rolling
+    /// </summary>
+    private static void ConfigureRootAppender(FixFlags fixFlags)
+    {
+      Logger root;
+      root = ((Repository.Hierarchy.Hierarchy)LogManager.GetRepository()).Root;
+      root.Level = Level.Debug;
+      root.AddAppender(CreateAppender(fixFlags));
+      root.Repository.Configured = true;
+    }
 
-			#region Public Instance Constructors
-			private RemoteLoggingSinkImpl()
-			{
-			}
-			#endregion Public Instance Constructors
+    private static RemotingAppender CreateAppender(FixFlags fixFlags)
+    {
+      RemotingAppender appender = new RemotingAppender();
+      appender.Sink = "tcp://localhost:8085/LoggingSink";
+      appender.Lossy = false;
+      appender.BufferSize = 1;
+      appender.Fix = fixFlags;
 
-			#region Implementation of IRemoteLoggingSink
-			/// <summary>
-			/// Logs the events to to an internal buffer
-			/// </summary>
-			/// <param name="events">The events to log.</param>
-			/// <remarks>
-			/// Logs the events to to an internal buffer. The logged events can 
-			/// be retrieved via the <see cref="Events"/> property. To clear
-			/// the buffer call the <see cref="Reset"/> method.
-			/// </remarks>
-			public void LogEvents(LoggingEvent[] events)
-			{
-				m_events.AddRange(events);
-			}
-			#endregion Implementation of IRemoteLoggingSink
+      appender.ActivateOptions();
 
-			#region Override implementation of MarshalByRefObject
-			/// <summary>
-			/// Obtains a lifetime service object to control the lifetime 
-			/// policy for this instance.
-			/// </summary>
-			/// <returns>
-			/// <c>null</c> to indicate that this instance should live
-			/// forever.
-			/// </returns>
-			public override object InitializeLifetimeService()
-			{
-				return null;
-			}
-			#endregion Override implementation of MarshalByRefObject
+      return appender;
+    }
 
-			public void Reset()
-			{
-				m_events.Clear();
-			}
+    public class RemoteLoggingSinkImpl : MarshalByRefObject, RemotingAppender.IRemoteLoggingSink
+    {
+      public static readonly RemoteLoggingSinkImpl Instance = new RemoteLoggingSinkImpl();
 
-			public LoggingEvent[] Events
-			{
-				get { return (LoggingEvent[])m_events.ToArray(typeof(LoggingEvent)); }
-			}
-		}
+      private ArrayList m_events = new ArrayList();
 
-		//
-		// Helper functions to dig into the appender
-		//
+      #region Public Instance Constructors
+      private RemoteLoggingSinkImpl()
+      {
+      }
+      #endregion Public Instance Constructors
 
-		private static LoggingEventData GetLoggingEventData(LoggingEvent loggingEvent)
-		{
-			return (LoggingEventData)Utils.GetField(loggingEvent, "m_data");
-		}
-	}
+      #region Implementation of IRemoteLoggingSink
+      /// <summary>
+      /// Logs the events to to an internal buffer
+      /// </summary>
+      /// <param name="events">The events to log.</param>
+      /// <remarks>
+      /// Logs the events to to an internal buffer. The logged events can 
+      /// be retrieved via the <see cref="Events"/> property. To clear
+      /// the buffer call the <see cref="Reset"/> method.
+      /// </remarks>
+      public void LogEvents(LoggingEvent[] events)
+      {
+        m_events.AddRange(events);
+      }
+      #endregion Implementation of IRemoteLoggingSink
+
+      #region Override implementation of MarshalByRefObject
+      /// <summary>
+      /// Obtains a lifetime service object to control the lifetime 
+      /// policy for this instance.
+      /// </summary>
+      /// <returns>
+      /// <c>null</c> to indicate that this instance should live
+      /// forever.
+      /// </returns>
+      public override object InitializeLifetimeService()
+      {
+        return null;
+      }
+      #endregion Override implementation of MarshalByRefObject
+
+      public void Reset()
+      {
+        m_events.Clear();
+      }
+
+      public LoggingEvent[] Events
+      {
+        get { return (LoggingEvent[])m_events.ToArray(typeof(LoggingEvent)); }
+      }
+    }
+
+    //
+    // Helper functions to dig into the appender
+    //
+
+    private static LoggingEventData GetLoggingEventData(LoggingEvent loggingEvent)
+    {
+      return (LoggingEventData)Utils.GetField(loggingEvent, "m_data");
+    }
+  }
 }
 
 // helper for TestNestedNdc
 
 namespace log4net.Tests.Appender.Remoting.UserInterfaces
 {
-	public class TestService
-	{
-		private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+  public class TestService
+  {
+    private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
-		public void Test()
-		{
-			log.Info("begin test");
-			Thread.Sleep(100);
+    public void Test()
+    {
+      log.Info("begin test");
+      Thread.Sleep(100);
 
-			Feature f = new Feature();
-			f.Test();
-			log.Info("end test");
-			Thread.Sleep(100);
-		}
-	}
+      Feature f = new Feature();
+      f.Test();
+      log.Info("end test");
+      Thread.Sleep(100);
+    }
+  }
 }
 
 // helper for TestNestedNdc
 
 namespace log4net.Tests.Appender.Remoting
 {
-	public class Feature
-	{
-		private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+  public class Feature
+  {
+    private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
-		public void Test()
-		{
-			using(NDC.Push("test1"))
-			{
-				log.Info("feature");
-				Thread.Sleep(100);
+    public void Test()
+    {
+      using (NDC.Push("test1"))
+      {
+        log.Info("feature");
+        Thread.Sleep(100);
 
-				Dal d = new Dal();
-				d.Test();
-				log.Info("return");
-				Thread.Sleep(100);
-			}
-		}
-	}
+        Dal d = new Dal();
+        d.Test();
+        log.Info("return");
+        Thread.Sleep(100);
+      }
+    }
+  }
 }
 
 // helper for TestNestedNdc
 
 namespace log4net.Tests.Appender.Remoting.Data
 {
-	public class Dal
-	{
-		private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+  public class Dal
+  {
+    private static ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
-		public void Test()
-		{
-			using(NDC.Push("test2"))
-			{
-				log.Info("return");
-				Thread.Sleep(100);
-			}
-		}
-	}
+    public void Test()
+    {
+      using (NDC.Push("test2"))
+      {
+        log.Info("return");
+        Thread.Sleep(100);
+      }
+    }
+  }
 }
 
 #endif // NET_2_0
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs
index d6cee4b..c6e5938 100644
--- a/src/log4net.Tests/Appender/RollingFileAppenderTest.cs
+++ b/src/log4net.Tests/Appender/RollingFileAppenderTest.cs
@@ -35,2108 +35,2108 @@
 
 namespace log4net.Tests.Appender
 {
-    /// <summary>
-    /// Used for internal unit testing the <see cref="RollingFileAppender"/> class.
-    /// </summary>
-    [TestFixture]
-    public class RollingFileAppenderTest
+  /// <summary>
+  /// Used for internal unit testing the <see cref="RollingFileAppender"/> class.
+  /// </summary>
+  [TestFixture]
+  public class RollingFileAppenderTest
+  {
+    private const string c_fileName = "test_41d3d834_4320f4da.log";
+
+    private const string c_testMessage98Chars =
+        "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567";
+
+    private const string c_testMessage99Chars =
+        "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678";
+
+    private const int c_iMaximumFileSize = 450; // in bytes
+    private int _iMessagesLoggedThisFile = 0;
+    private int _iMessagesLogged = 0;
+    private int _iCountDirection = 0;
+    private int _MaxSizeRollBackups = 3;
+    private CountingAppender _caRoot;
+    private Logger _root;
+#if !NETSTANDARD1_3
+    private CultureInfo _currentCulture;
+    private CultureInfo _currentUICulture;
+#endif
+    private class SilentErrorHandler : IErrorHandler
     {
-        private const string c_fileName = "test_41d3d834_4320f4da.log";
+      private StringBuilder m_buffer = new StringBuilder();
 
-        private const string c_testMessage98Chars =
-            "01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567";
+      public string Message
+      {
+        get { return m_buffer.ToString(); }
+      }
 
-        private const string c_testMessage99Chars =
-            "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678";
+      public void Error(string message)
+      {
+        m_buffer.Append(message + "\n");
+      }
 
-        private const int c_iMaximumFileSize = 450; // in bytes
-        private int _iMessagesLoggedThisFile = 0;
-        private int _iMessagesLogged = 0;
-        private int _iCountDirection = 0;
-        private int _MaxSizeRollBackups = 3;
-        private CountingAppender _caRoot;
-        private Logger _root;
-#if !NETSTANDARD1_3
-        private CultureInfo _currentCulture;
-        private CultureInfo _currentUICulture;
-#endif
-        private class SilentErrorHandler : IErrorHandler
-        {
-            private StringBuilder m_buffer = new StringBuilder();
+      public void Error(string message, Exception e)
+      {
+        m_buffer.Append(message + "\n" + e.Message + "\n");
+      }
 
-            public string Message
-            {
-                get { return m_buffer.ToString(); }
-            }
+      public void Error(string message, Exception e, ErrorCode errorCode)
+      {
+        m_buffer.Append(message + "\n" + e.Message + "\n");
+      }
+    }
 
-            public void Error(string message)
-            {
-                m_buffer.Append(message + "\n");
-            }
+    /// <summary>
+    /// Sets up variables used for the tests
+    /// </summary>
+    private void InitializeVariables()
+    {
+      _iMessagesLoggedThisFile = 0;
+      _iMessagesLogged = 0;
+      _iCountDirection = +1; // Up
+      _MaxSizeRollBackups = 3;
+    }
 
-            public void Error(string message, Exception e)
-            {
-                m_buffer.Append(message + "\n" + e.Message + "\n");
-            }
+    /// <summary>
+    /// Shuts down any loggers in the hierarchy, along
+    /// with all appenders, and deletes any test files used
+    /// for logging.
+    /// </summary>
+    private static void ResetAndDeleteTestFiles()
+    {
+      // Regular users should not use the clear method lightly!
+      Utils.GetRepository().ResetConfiguration();
+      Utils.GetRepository().Shutdown();
+      ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
 
-            public void Error(string message, Exception e, ErrorCode errorCode)
-            {
-                m_buffer.Append(message + "\n" + e.Message + "\n");
-            }
-        }
+      DeleteTestFiles();
+    }
 
-        /// <summary>
-        /// Sets up variables used for the tests
-        /// </summary>
-        private void InitializeVariables()
-        {
-            _iMessagesLoggedThisFile = 0;
-            _iMessagesLogged = 0;
-            _iCountDirection = +1; // Up
-            _MaxSizeRollBackups = 3;
-        }
-
-        /// <summary>
-        /// Shuts down any loggers in the hierarchy, along
-        /// with all appenders, and deletes any test files used
-        /// for logging.
-        /// </summary>
-        private static void ResetAndDeleteTestFiles()
-        {
-            // Regular users should not use the clear method lightly!
-            Utils.GetRepository().ResetConfiguration();
-            Utils.GetRepository().Shutdown();
-            ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
-
-            DeleteTestFiles();
-        }
-
-        /// <summary>
-        /// Any initialization that happens before each test can
-        /// go here
-        /// </summary>
-        [SetUp]
-        public void SetUp()
-        {
-            ResetAndDeleteTestFiles();
-            InitializeVariables();
+    /// <summary>
+    /// Any initialization that happens before each test can
+    /// go here
+    /// </summary>
+    [SetUp]
+    public void SetUp()
+    {
+      ResetAndDeleteTestFiles();
+      InitializeVariables();
 
 #if !NETSTANDARD1_3
-            // set correct thread culture
-            _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
-            _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
-            System.Threading.Thread.CurrentThread.CurrentCulture =
-                System.Threading.Thread.CurrentThread.CurrentUICulture =
-                    System.Globalization.CultureInfo.InvariantCulture;
+      // set correct thread culture
+      _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+      _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
+      System.Threading.Thread.CurrentThread.CurrentCulture =
+          System.Threading.Thread.CurrentThread.CurrentUICulture =
+              System.Globalization.CultureInfo.InvariantCulture;
 #endif
-        }
+    }
 
-        /// <summary>
-        /// Any steps that happen after each test go here
-        /// </summary>
-        [TearDown]
-        public void TearDown()
-        {
-            ResetAndDeleteTestFiles();
+    /// <summary>
+    /// Any steps that happen after each test go here
+    /// </summary>
+    [TearDown]
+    public void TearDown()
+    {
+      ResetAndDeleteTestFiles();
 
 #if !NETSTANDARD1_3
-            // restore previous culture
-            System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
-            System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
+      // restore previous culture
+      System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
+      System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
 #endif
+    }
+
+    /// <summary>
+    /// Finds the number of files that match the base file name,
+    /// and matches the result against an expected count
+    /// </summary>
+    /// <param name="iExpectedCount"></param>
+    private static void VerifyFileCount(int iExpectedCount)
+    {
+      VerifyFileCount(iExpectedCount, false);
+    }
+
+    /// <summary>
+    /// Finds the number of files that match the base file name,
+    /// and matches the result against an expected count
+    /// </summary>
+    /// <param name="iExpectedCount"></param>
+    private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension)
+    {
+      ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension);
+      Assert.IsNotNull(alFiles);
+      Assert.AreEqual(iExpectedCount, alFiles.Count);
+    }
+
+    /// <summary>
+    /// Creates a file with the given number, and the shared base file name
+    /// </summary>
+    /// <param name="iFileNumber"></param>
+    private static void CreateFile(int iFileNumber)
+    {
+      FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber));
+
+      FileStream fileStream = null;
+      try
+      {
+        fileStream = fileInfo.Create();
+      }
+      finally
+      {
+        if (null != fileStream)
+        {
+          try
+          {
+            fileStream.Close();
+          }
+          catch
+          {
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Verifies that the code correctly loads all filenames
+    /// </summary>
+    [Test]
+    public void TestGetExistingFiles()
+    {
+      VerifyFileCount(0);
+      CreateFile(0);
+      VerifyFileCount(1);
+      CreateFile(1);
+      VerifyFileCount(2);
+    }
+
+    [Test]
+    public void RollingCombinedWithPreserveExtension()
+    {
+      _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
+      _root.Level = Level.All;
+      PatternLayout patternLayout = new PatternLayout();
+      patternLayout.ActivateOptions();
+
+      RollingFileAppender roller = new RollingFileAppender();
+      roller.StaticLogFileName = false;
+      roller.Layout = patternLayout;
+      roller.AppendToFile = true;
+      roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
+      roller.DatePattern = "dd_MM_yyyy";
+      roller.MaxSizeRollBackups = 1;
+      roller.CountDirection = 1;
+      roller.PreserveLogFileNameExtension = true;
+      roller.MaximumFileSize = "10KB";
+      roller.File = c_fileName;
+      roller.ActivateOptions();
+      _root.AddAppender(roller);
+
+      _root.Repository.Configured = true;
+
+      for (int i = 0; i < 1000; i++)
+      {
+        StringBuilder s = new StringBuilder();
+        for (int j = 50; j < 100; j++)
+        {
+          if (j > 50)
+          {
+            s.Append(" ");
+          }
+
+          s.Append(j);
         }
 
-        /// <summary>
-        /// Finds the number of files that match the base file name,
-        /// and matches the result against an expected count
-        /// </summary>
-        /// <param name="iExpectedCount"></param>
-        private static void VerifyFileCount(int iExpectedCount)
+        _root.Log(Level.Debug, s.ToString(), null);
+      }
+
+      VerifyFileCount(2, true);
+    }
+
+    /// <summary>
+    /// Removes all test files that exist
+    /// </summary>
+    private static void DeleteTestFiles()
+    {
+      ArrayList alFiles = GetExistingFiles(c_fileName);
+      alFiles.AddRange(GetExistingFiles(c_fileName, true));
+      foreach (string sFile in alFiles)
+      {
+        try
         {
-            VerifyFileCount(iExpectedCount, false);
+          Debug.WriteLine("Deleting test file " + sFile);
+          File.Delete(sFile);
         }
-
-        /// <summary>
-        /// Finds the number of files that match the base file name,
-        /// and matches the result against an expected count
-        /// </summary>
-        /// <param name="iExpectedCount"></param>
-        private static void VerifyFileCount(int iExpectedCount, bool preserveLogFileNameExtension)
+        catch (Exception ex)
         {
-            ArrayList alFiles = GetExistingFiles(c_fileName, preserveLogFileNameExtension);
-            Assert.IsNotNull(alFiles);
-            Assert.AreEqual(iExpectedCount, alFiles.Count);
+          Debug.WriteLine("Exception while deleting test file " + ex);
         }
+      }
+    }
 
-        /// <summary>
-        /// Creates a file with the given number, and the shared base file name
-        /// </summary>
-        /// <param name="iFileNumber"></param>
-        private static void CreateFile(int iFileNumber)
+    ///// <summary>
+    ///// Generates a file name associated with the count.
+    ///// </summary>
+    ///// <param name="iFileCount"></param>
+    ///// <returns></returns>
+    //private string MakeFileName(int iFileCount)
+    //{
+    //    return MakeFileName(_fileName, iFileCount);
+    //}
+
+    /// <summary>
+    /// Generates a file name associated with the count, using
+    /// the base file name.
+    /// </summary>
+    /// <param name="sBaseFile"></param>
+    /// <param name="iFileCount"></param>
+    /// <returns></returns>
+    private static string MakeFileName(string sBaseFile, int iFileCount)
+    {
+      if (0 == iFileCount)
+      {
+        return sBaseFile;
+      }
+
+      return sBaseFile + "." + iFileCount;
+    }
+
+    /// <summary>
+    /// Returns a RollingFileAppender using all the internal settings for maximum
+    /// file size and number of backups
+    /// </summary>
+    /// <returns></returns>
+    private RollingFileAppender CreateAppender()
+    {
+      return CreateAppender(new FileAppender.ExclusiveLock());
+    }
+
+    /// <summary>
+    /// Returns a RollingFileAppender using all the internal settings for maximum
+    /// file size and number of backups
+    /// </summary>
+    /// <param name="lockModel">The locking model to test</param>
+    /// <returns></returns>
+    private RollingFileAppender CreateAppender(FileAppender.LockingModelBase lockModel)
+    {
+      //
+      // Use a basic pattern that
+      // includes just the message and a CR/LF.
+      //
+      PatternLayout layout = new PatternLayout("%m%n");
+
+      //
+      // Create the new appender
+      //
+      RollingFileAppender appender = new RollingFileAppender();
+      appender.Layout = layout;
+      appender.File = c_fileName;
+      appender.Encoding = Encoding.ASCII;
+      appender.MaximumFileSize = c_iMaximumFileSize.ToString();
+      appender.MaxSizeRollBackups = _MaxSizeRollBackups;
+      appender.CountDirection = _iCountDirection;
+      appender.RollingStyle = RollingFileAppender.RollingMode.Size;
+      appender.LockingModel = lockModel;
+
+      appender.ActivateOptions();
+
+      return appender;
+    }
+
+    /// <summary>
+    /// Used for test purposes, a table of these objects can be used to identify
+    /// any existing files and their expected length.
+    /// </summary>
+    public class RollFileEntry
+    {
+      /// <summary>
+      /// Stores the name of the file
+      /// </summary>
+      private string m_fileName;
+
+      /// <summary>
+      /// The expected length of the file
+      /// </summary>
+      private long m_fileLength;
+
+      /// <summary>
+      /// Default constructor
+      /// </summary>
+      public RollFileEntry()
+      {
+      }
+
+      /// <summary>
+      /// Constructor used when the fileInfo and expected length are known
+      /// </summary>
+      /// <param name="fileName"></param>
+      /// <param name="fileLength"></param>
+      public RollFileEntry(string fileName, long fileLength)
+      {
+        m_fileName = fileName;
+        m_fileLength = fileLength;
+      }
+
+      /// <summary>
+      /// Stores the name of the file
+      /// </summary>
+      public string FileName
+      {
+        get { return m_fileName; }
+      }
+
+      /// <summary>
+      /// The expected length of the file
+      /// </summary>
+      public long FileLength
+      {
+        get { return m_fileLength; }
+      }
+    }
+
+    /// <summary>
+    /// Used for table-driven testing.  This class holds information that can be used
+    /// for testing of file rolling.
+    /// </summary>
+    public class RollConditions
+    {
+      /// <summary>
+      /// A table of entries showing files that should exist and their expected sizes
+      /// before logging is called
+      /// </summary>
+      private RollFileEntry[] m_preLogFileEntries;
+
+      /// <summary>
+      /// A table of entries showing files that should exist and their expected sizes
+      /// after a message is logged
+      /// </summary>
+      private RollFileEntry[] m_postLogFileEntries;
+
+      /// <summary>
+      /// Constructor, taking all required parameters
+      /// </summary>
+      /// <param name="preLogFileEntries"></param>
+      /// <param name="postLogFileEntries"></param>
+      public RollConditions(RollFileEntry[] preLogFileEntries, RollFileEntry[] postLogFileEntries)
+      {
+        m_preLogFileEntries = preLogFileEntries;
+        m_postLogFileEntries = postLogFileEntries;
+      }
+
+      /// <summary>
+      /// A table of entries showing files that should exist and their expected sizes
+      /// before logging is called
+      /// </summary>
+      public RollFileEntry[] GetPreLogFileEntries()
+      {
+        return m_preLogFileEntries;
+      }
+
+      /// <summary>
+      /// A table of entries showing files that should exist and their expected sizes
+      /// after a message is logged
+      /// </summary>
+      public RollFileEntry[] GetPostLogFileEntries()
+      {
+        return m_postLogFileEntries;
+      }
+    }
+
+    private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting,
+        string sFileName,
+        FileInfo file,
+        RollFileEntry entry)
+    {
+      Assert.IsTrue(alExisting.Contains(sFileName), "filename {0} not found in test directory", sFileName);
+      Assert.AreEqual(entry.FileLength, file.Length, "file length mismatch");
+      // Remove this file from the list
+      alExisting.Remove(sFileName);
+    }
+
+    /// <summary>
+    /// Checks that all the expected files exist, and only the expected files.  Also
+    /// verifies the length of all files against the expected length
+    /// </summary>
+    /// <param name="sBaseFileName"></param>
+    /// <param name="fileEntries"></param>
+    private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries)
+    {
+      ArrayList alExisting = GetExistingFiles(sBaseFileName);
+      if (null != fileEntries)
+      {
+        //          AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length );
+        foreach (RollFileEntry rollFile in fileEntries)
         {
-            FileInfo fileInfo = new FileInfo(MakeFileName(c_fileName, iFileNumber));
+          string sFileName = rollFile.FileName;
+          FileInfo file = new FileInfo(sFileName);
 
-            FileStream fileStream = null;
-            try
+          if (rollFile.FileLength > 0)
+          {
+            Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName);
+            VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
+          }
+          else
+          {
+            // If length is 0, file may not exist yet.  If file exists, make sure length
+            // is zero.  If file doesn't exist, this is OK
+
+            if (file.Exists)
             {
-                fileStream = fileInfo.Create();
+              VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
             }
-            finally
-            {
-                if (null != fileStream)
-                {
-                    try
-                    {
-                        fileStream.Close();
-                    }
-                    catch
-                    {
-                    }
-                }
-            }
+          }
         }
+      }
+      else
+      {
+        Assert.AreEqual(0, alExisting.Count);
+      }
 
-        /// <summary>
-        /// Verifies that the code correctly loads all filenames
-        /// </summary>
-        [Test]
-        public void TestGetExistingFiles()
-        {
-            VerifyFileCount(0);
-            CreateFile(0);
-            VerifyFileCount(1);
-            CreateFile(1);
-            VerifyFileCount(2);
-        }
+      // This check ensures no extra files matching the wildcard pattern exist.
+      // We only want the files we expect, and no others
+      Assert.AreEqual(0, alExisting.Count);
+    }
 
-        [Test]
-        public void RollingCombinedWithPreserveExtension()
-        {
-            _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
-            _root.Level = Level.All;
-            PatternLayout patternLayout = new PatternLayout();
-            patternLayout.ActivateOptions();
+    /// <summary>
+    /// Called before logging a message to check that all the expected files exist, 
+    /// and only the expected files.  Also verifies the length of all files against 
+    /// the expected length
+    /// </summary>
+    /// <param name="sBaseFileName"></param>
+    /// <param name="entry"></param>
+    private static void VerifyPreConditions(string sBaseFileName, RollConditions entry)
+    {
+      VerifyFileConditions(sBaseFileName, entry.GetPreLogFileEntries());
+    }
 
-            RollingFileAppender roller = new RollingFileAppender();
-            roller.StaticLogFileName = false;
-            roller.Layout = patternLayout;
-            roller.AppendToFile = true;
-            roller.RollingStyle = RollingFileAppender.RollingMode.Composite;
-            roller.DatePattern = "dd_MM_yyyy";
-            roller.MaxSizeRollBackups = 1;
-            roller.CountDirection = 1;
-            roller.PreserveLogFileNameExtension = true;
-            roller.MaximumFileSize = "10KB";
-            roller.File = c_fileName;
-            roller.ActivateOptions();
-            _root.AddAppender(roller);
+    /// <summary>
+    /// Called after logging a message to check that all the expected files exist, 
+    /// and only the expected files.  Also verifies the length of all files against 
+    /// the expected length
+    /// </summary>
+    /// <param name="sBaseFileName"></param>
+    /// <param name="entry"></param>
+    private static void VerifyPostConditions(string sBaseFileName, RollConditions entry)
+    {
+      VerifyFileConditions(sBaseFileName, entry.GetPostLogFileEntries());
+    }
 
-            _root.Repository.Configured = true;
+    /// <summary>
+    /// Logs a message, verifying the expected message counts against the 
+    /// current running totals.
+    /// </summary>
+    /// <param name="entry"></param>
+    /// <param name="sMessageToLog"></param>
+    private void LogMessage(RollConditions entry, string sMessageToLog)
+    {
+      Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++);
+      _root.Log(Level.Debug, sMessageToLog, null);
+      Assert.AreEqual(_caRoot.Counter, _iMessagesLogged);
+      _iMessagesLoggedThisFile++;
+    }
 
-            for (int i = 0; i < 1000; i++)
-            {
-                StringBuilder s = new StringBuilder();
-                for (int j = 50; j < 100; j++)
-                {
-                    if (j > 50)
-                    {
-                        s.Append(" ");
-                    }
+    //private void DumpFileEntry( RollFileEntry entry )
+    //{
+    //    System.Diagnostics.Debug.WriteLine( "\tfile   name: " + entry.FileName );
+    //    System.Diagnostics.Debug.WriteLine( "\tfile length: " + entry.FileLength );
+    //}
 
-                    s.Append(j);
-                }
+    //private void DumpTableEntry( RollConditions entry )
+    //{
+    //    System.Diagnostics.Debug.WriteLine( "Pre-Conditions" );
+    //    foreach( RollFileEntry file in entry.GetPreLogFileEntries() )
+    //    {
+    //        DumpFileEntry( file );
+    //    }
+    //    System.Diagnostics.Debug.WriteLine( "Post-Conditions" );
+    //    foreach( RollFileEntry file in entry.GetPostLogFileEntries() )
+    //    {
+    //        DumpFileEntry( file );
+    //    }
+    //    //        System.Diagnostics.Debug.WriteLine("");
+    //}
 
-                _root.Log(Level.Debug, s.ToString(), null);
-            }
+    /// <summary>
+    /// Runs through all table entries, logging messages.  Before each message is logged,
+    /// pre-conditions are checked to ensure the expected files exist and they are the
+    /// expected size.  After logging, verifies the same.
+    /// </summary>
+    /// <param name="sBaseFileName"></param>
+    /// <param name="entries"></param>
+    /// <param name="sMessageToLog"></param>
+    private void RollFromTableEntries(string sBaseFileName, RollConditions[] entries, string sMessageToLog)
+    {
+      for (int i = 0; i < entries.Length; i++)
+      {
+        RollConditions entry = entries[i];
 
-            VerifyFileCount(2, true);
-        }
-
-        /// <summary>
-        /// Removes all test files that exist
-        /// </summary>
-        private static void DeleteTestFiles()
-        {
-            ArrayList alFiles = GetExistingFiles(c_fileName);
-            alFiles.AddRange(GetExistingFiles(c_fileName, true));
-            foreach (string sFile in alFiles)
-            {
-                try
-                {
-                    Debug.WriteLine("Deleting test file " + sFile);
-                    File.Delete(sFile);
-                }
-                catch (Exception ex)
-                {
-                    Debug.WriteLine("Exception while deleting test file " + ex);
-                }
-            }
-        }
+        //          System.Diagnostics.Debug.WriteLine( i + ": Entry " + i + " pre/post conditions");
+        //          DumpTableEntry( entry );
+        //          System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions");
+        VerifyPreConditions(sBaseFileName, entry);
+        //          System.Diagnostics.Debug.WriteLine( i + ": Logging message");
+        LogMessage(entry, sMessageToLog);
+        //          System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions");
+        VerifyPostConditions(sBaseFileName, entry);
+        //          System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n");
+      }
+    }
 
-        ///// <summary>
-        ///// Generates a file name associated with the count.
-        ///// </summary>
-        ///// <param name="iFileCount"></param>
-        ///// <returns></returns>
-        //private string MakeFileName(int iFileCount)
-        //{
-        //    return MakeFileName(_fileName, iFileCount);
-        //}
+    private static readonly int s_Newline_Length = Environment.NewLine.Length;
 
-        /// <summary>
-        /// Generates a file name associated with the count, using
-        /// the base file name.
-        /// </summary>
-        /// <param name="sBaseFile"></param>
-        /// <param name="iFileCount"></param>
-        /// <returns></returns>
-        private static string MakeFileName(string sBaseFile, int iFileCount)
-        {
-            if (0 == iFileCount)
-            {
-                return sBaseFile;
-            }
+    /// <summary>
+    /// Returns the number of bytes logged per message, including
+    /// any newline characters in addition to the message length.
+    /// </summary>
+    /// <param name="sMessage"></param>
+    /// <returns></returns>
+    private static int TotalMessageLength(string sMessage)
+    {
+      return sMessage.Length + s_Newline_Length;
+    }
 
-            return sBaseFile + "." + iFileCount;
-        }
+    /// <summary>
+    /// Determines how many messages of a fixed length can be logged
+    /// to a single file before the file rolls.
+    /// </summary>
+    /// <param name="iMessageLength"></param>
+    /// <returns></returns>
+    private static int MessagesPerFile(int iMessageLength)
+    {
+      int iMessagesPerFile = c_iMaximumFileSize / iMessageLength;
 
-        /// <summary>
-        /// Returns a RollingFileAppender using all the internal settings for maximum
-        /// file size and number of backups
-        /// </summary>
-        /// <returns></returns>
-        private RollingFileAppender CreateAppender()
-        {
-            return CreateAppender(new FileAppender.ExclusiveLock());
-        }
+      //
+      // RollingFileAppender checks for wrap BEFORE logging,
+      // so we will actually get one more message per file than
+      // we would otherwise.
+      //
+      if (iMessagesPerFile * iMessageLength < c_iMaximumFileSize)
+      {
+        iMessagesPerFile++;
+      }
 
-        /// <summary>
-        /// Returns a RollingFileAppender using all the internal settings for maximum
-        /// file size and number of backups
-        /// </summary>
-        /// <param name="lockModel">The locking model to test</param>
-        /// <returns></returns>
-        private RollingFileAppender CreateAppender(FileAppender.LockingModelBase lockModel)
-        {
-            //
-            // Use a basic pattern that
-            // includes just the message and a CR/LF.
-            //
-            PatternLayout layout = new PatternLayout("%m%n");
+      return iMessagesPerFile;
+    }
 
-            //
-            // Create the new appender
-            //
-            RollingFileAppender appender = new RollingFileAppender();
-            appender.Layout = layout;
-            appender.File = c_fileName;
-            appender.Encoding = Encoding.ASCII;
-            appender.MaximumFileSize = c_iMaximumFileSize.ToString();
-            appender.MaxSizeRollBackups = _MaxSizeRollBackups;
-            appender.CountDirection = _iCountDirection;
-            appender.RollingStyle = RollingFileAppender.RollingMode.Size;
-            appender.LockingModel = lockModel;
+    /// <summary>
+    /// Determines the name of the current file
+    /// </summary>
+    /// <returns></returns>
+    private static string GetCurrentFile()
+    {
+      // Current file name is always the base file name when
+      // counting.  Dates will need a different approach
+      return c_fileName;
+    }
 
-            appender.ActivateOptions();
+    /// <summary>
+    /// Turns a group of file names into an array of file entries that include the name
+    /// and a size.  This is useful for assigning the properties of backup files, when
+    /// the length of the files are all the same size due to a fixed message length.
+    /// </summary>
+    /// <param name="sBackupGroup"></param>
+    /// <param name="iBackupFileLength"></param>
+    /// <returns></returns>
+    private static RollFileEntry[] MakeBackupFileEntriesFromBackupGroup(string sBackupGroup, int iBackupFileLength)
+    {
+      string[] sFiles = sBackupGroup.Split(' ');
 
-            return appender;
-        }
+      ArrayList alEntries = new ArrayList();
 
-        /// <summary>
-        /// Used for test purposes, a table of these objects can be used to identify
-        /// any existing files and their expected length.
-        /// </summary>
-        public class RollFileEntry
+      for (int i = 0; i < sFiles.Length; i++)
+      {
+        // Weed out any whitespace entries from the array
+        if (sFiles[i].Trim().Length > 0)
         {
-            /// <summary>
-            /// Stores the name of the file
-            /// </summary>
-            private string m_fileName;
-
-            /// <summary>
-            /// The expected length of the file
-            /// </summary>
-            private long m_fileLength;
-
-            /// <summary>
-            /// Default constructor
-            /// </summary>
-            public RollFileEntry()
-            {
-            }
-
-            /// <summary>
-            /// Constructor used when the fileInfo and expected length are known
-            /// </summary>
-            /// <param name="fileName"></param>
-            /// <param name="fileLength"></param>
-            public RollFileEntry(string fileName, long fileLength)
-            {
-                m_fileName = fileName;
-                m_fileLength = fileLength;
-            }
-
-            /// <summary>
-            /// Stores the name of the file
-            /// </summary>
-            public string FileName
-            {
-                get { return m_fileName; }
-            }
-
-            /// <summary>
-            /// The expected length of the file
-            /// </summary>
-            public long FileLength
-            {
-                get { return m_fileLength; }
-            }
+          alEntries.Add(new RollFileEntry(sFiles[i], iBackupFileLength));
         }
+      }
 
-        /// <summary>
-        /// Used for table-driven testing.  This class holds information that can be used
-        /// for testing of file rolling.
-        /// </summary>
-        public class RollConditions
-        {
-            /// <summary>
-            /// A table of entries showing files that should exist and their expected sizes
-            /// before logging is called
-            /// </summary>
-            private RollFileEntry[] m_preLogFileEntries;
+      return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry));
+    }
 
-            /// <summary>
-            /// A table of entries showing files that should exist and their expected sizes
-            /// after a message is logged
-            /// </summary>
-            private RollFileEntry[] m_postLogFileEntries;
+    /// <summary>
+    /// Finds the iGroup group in the string (comma separated groups)
+    /// </summary>
+    /// <param name="sBackupGroups"></param>
+    /// <param name="iGroup"></param>
+    /// <returns></returns>
+    private static string GetBackupGroup(string sBackupGroups, int iGroup)
+    {
+      string[] sGroups = sBackupGroups.Split(',');
+      return sGroups[iGroup];
+    }
 
-            /// <summary>
-            /// Constructor, taking all required parameters
-            /// </summary>
-            /// <param name="preLogFileEntries"></param>
-            /// <param name="postLogFileEntries"></param>
-            public RollConditions(RollFileEntry[] preLogFileEntries, RollFileEntry[] postLogFileEntries)
-            {
-                m_preLogFileEntries = preLogFileEntries;
-                m_postLogFileEntries = postLogFileEntries;
-            }
+    ///// <summary>
+    ///// Builds a collection of file entries based on the file names
+    ///// specified in a groups string and the max file size from the
+    ///// stats object
+    ///// </summary>
+    ///// <param name="sBackupGroups"></param>
+    ///// <param name="stats"></param>
+    ///// <returns></returns>
+    //private RollFileEntry[] MakeBackupFileEntriesForPreCondition( string sBackupGroups, RollingStats stats )
+    //{
+    //    if (0 == stats.NumberOfFileRolls )
+    //    {
+    //        return null;  // first round has no previous backups
+    //    }
+    //    string sGroup;
+    //    if (0 == stats.MessagesThisFile )
+    //    {
+    //        // first file has special pattern...since rolling doesn't occur when message
+    //        // is logged, rather before next message is logged.
+    //        if (stats.NumberOfFileRolls <= 1 )
+    //        {
+    //            return null;   
+    //        }
+    //        // Use backup files from previous round.  The minus 2 is because we have already
+    //        // rolled, and the first round uses null instead of the string
+    //        sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-2 );
+    //    }
+    //    else
+    //    {
+    //        sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-1 );
+    //    }
+    //    return MakeBackupFileEntriesFromBackupGroup( sGroup, stats.MaximumFileSize );
+    //}
 
-            /// <summary>
-            /// A table of entries showing files that should exist and their expected sizes
-            /// before logging is called
-            /// </summary>
-            public RollFileEntry[] GetPreLogFileEntries()
-            {
-                return m_preLogFileEntries;
-            }
+    /// <summary>
+    /// Builds a collection of file entries based on the file names
+    /// specified in a groups string and the max file size from the
+    /// stats object
+    /// </summary>
+    /// <param name="sBackupGroups"></param>
+    /// <param name="stats"></param>
+    /// <returns></returns>
+    private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats)
+    {
+      if (0 == stats.NumberOfFileRolls)
+      {
+        return null; // first round has no previous backups
+      }
 
-            /// <summary>
-            /// A table of entries showing files that should exist and their expected sizes
-            /// after a message is logged
-            /// </summary>
-            public RollFileEntry[] GetPostLogFileEntries()
-            {
-                return m_postLogFileEntries;
-            }
-        }
+      string sGroup = GetBackupGroup(sBackupGroups, stats.NumberOfFileRolls - 1);
+      return MakeBackupFileEntriesFromBackupGroup(sGroup, stats.MaximumFileSize);
+    }
 
-        private static void VerifyExistenceAndRemoveFromList(ArrayList alExisting,
-            string sFileName,
-            FileInfo file,
-            RollFileEntry entry)
-        {
-            Assert.IsTrue(alExisting.Contains(sFileName), "filename {0} not found in test directory", sFileName);
-            Assert.AreEqual(entry.FileLength, file.Length, "file length mismatch");
-            // Remove this file from the list
-            alExisting.Remove(sFileName);
-        }
 
-        /// <summary>
-        /// Checks that all the expected files exist, and only the expected files.  Also
-        /// verifies the length of all files against the expected length
-        /// </summary>
-        /// <param name="sBaseFileName"></param>
-        /// <param name="fileEntries"></param>
-        private static void VerifyFileConditions(string sBaseFileName, RollFileEntry[] fileEntries)
-        {
-            ArrayList alExisting = GetExistingFiles(sBaseFileName);
-            if (null != fileEntries)
-            {
-                //					AssertEquals( "File count mismatch", alExisting.Count, fileEntries.Length );
-                foreach (RollFileEntry rollFile in fileEntries)
-                {
-                    string sFileName = rollFile.FileName;
-                    FileInfo file = new FileInfo(sFileName);
+    /// <summary>
+    /// This class holds information that is used while we are generating
+    /// test data sets
+    /// </summary>
+    public class RollingStats
+    {
+      private int iTotalMessageLength;
+      private int iMessagesPerFile;
+      private int iMessagesThisFile;
+      private int iNumberOfFileRolls;
 
-                    if (rollFile.FileLength > 0)
-                    {
-                        Assert.IsTrue(file.Exists, "filename {0} does not exist", sFileName);
-                        VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
-                    }
-                    else
-                    {
-                        // If length is 0, file may not exist yet.  If file exists, make sure length
-                        // is zero.  If file doesn't exist, this is OK
+      /// <summary>
+      /// Number of total bytes a log file can reach.
+      /// </summary>
+      public int MaximumFileSize
+      {
+        get { return TotalMessageLength * MessagesPerFile; }
+      }
 
-                        if (file.Exists)
-                        {
-                            VerifyExistenceAndRemoveFromList(alExisting, sFileName, file, rollFile);
-                        }
-                    }
-                }
-            }
-            else
-            {
-                Assert.AreEqual(0, alExisting.Count);
-            }
+      /// <summary>
+      /// The length of a message, including any CR/LF characters.
+      /// This length assumes all messages are a fixed length for
+      /// test purposes.
+      /// </summary>
+      public int TotalMessageLength
+      {
+        get { return iTotalMessageLength; }
+        set { iTotalMessageLength = value; }
+      }
 
-            // This check ensures no extra files matching the wildcard pattern exist.
-            // We only want the files we expect, and no others
-            Assert.AreEqual(0, alExisting.Count);
-        }
+      /// <summary>
+      /// A count of the number of messages that are logged to each
+      /// file.
+      /// </summary>
+      public int MessagesPerFile
+      {
+        get { return iMessagesPerFile; }
+        set { iMessagesPerFile = value; }
+      }
 
-        /// <summary>
-        /// Called before logging a message to check that all the expected files exist, 
-        /// and only the expected files.  Also verifies the length of all files against 
-        /// the expected length
-        /// </summary>
-        /// <param name="sBaseFileName"></param>
-        /// <param name="entry"></param>
-        private static void VerifyPreConditions(string sBaseFileName, RollConditions entry)
-        {
-            VerifyFileConditions(sBaseFileName, entry.GetPreLogFileEntries());
-        }
+      /// <summary>
+      /// Counts how many messages have been logged to the current file
+      /// </summary>
+      public int MessagesThisFile
+      {
+        get { return iMessagesThisFile; }
+        set { iMessagesThisFile = value; }
+      }
 
-        /// <summary>
-        /// Called after logging a message to check that all the expected files exist, 
-        /// and only the expected files.  Also verifies the length of all files against 
-        /// the expected length
-        /// </summary>
-        /// <param name="sBaseFileName"></param>
-        /// <param name="entry"></param>
-        private static void VerifyPostConditions(string sBaseFileName, RollConditions entry)
-        {
-            VerifyFileConditions(sBaseFileName, entry.GetPostLogFileEntries());
-        }
+      /// <summary>
+      /// Counts how many times a file roll has occurred
+      /// </summary>
+      public int NumberOfFileRolls
+      {
+        get { return iNumberOfFileRolls; }
+        set { iNumberOfFileRolls = value; }
+      }
+    }
 
-        /// <summary>
-        /// Logs a message, verifying the expected message counts against the 
-        /// current running totals.
-        /// </summary>
-        /// <param name="entry"></param>
-        /// <param name="sMessageToLog"></param>
-        private void LogMessage(RollConditions entry, string sMessageToLog)
-        {
-            Assert.AreEqual(_caRoot.Counter, _iMessagesLogged++);
-            _root.Log(Level.Debug, sMessageToLog, null);
-            Assert.AreEqual(_caRoot.Counter, _iMessagesLogged);
-            _iMessagesLoggedThisFile++;
-        }
+    /// <summary>
+    /// The stats are used to keep track of progress while we are algorithmically
+    /// generating a table of pre/post condition tests for file rolling.
+    /// </summary>
+    /// <param name="sTestMessage"></param>
+    /// <returns></returns>
+    private static RollingStats InitializeStats(string sTestMessage)
+    {
+      RollingStats rollingStats = new RollingStats();
 
-        //private void DumpFileEntry( RollFileEntry entry )
-        //{
-        //    System.Diagnostics.Debug.WriteLine( "\tfile   name: " + entry.FileName );
-        //    System.Diagnostics.Debug.WriteLine( "\tfile length: " + entry.FileLength );
-        //}
+      rollingStats.TotalMessageLength = TotalMessageLength(sTestMessage);
+      rollingStats.MessagesPerFile = MessagesPerFile(rollingStats.TotalMessageLength);
+      rollingStats.MessagesThisFile = 0;
+      rollingStats.NumberOfFileRolls = 0;
 
-        //private void DumpTableEntry( RollConditions entry )
-        //{
-        //    System.Diagnostics.Debug.WriteLine( "Pre-Conditions" );
-        //    foreach( RollFileEntry file in entry.GetPreLogFileEntries() )
-        //    {
-        //        DumpFileEntry( file );
-        //    }
-        //    System.Diagnostics.Debug.WriteLine( "Post-Conditions" );
-        //    foreach( RollFileEntry file in entry.GetPostLogFileEntries() )
-        //    {
-        //        DumpFileEntry( file );
-        //    }
-        //    //				System.Diagnostics.Debug.WriteLine("");
-        //}
+      return rollingStats;
+    }
 
-        /// <summary>
-        /// Runs through all table entries, logging messages.  Before each message is logged,
-        /// pre-conditions are checked to ensure the expected files exist and they are the
-        /// expected size.  After logging, verifies the same.
-        /// </summary>
-        /// <param name="sBaseFileName"></param>
-        /// <param name="entries"></param>
-        /// <param name="sMessageToLog"></param>
-        private void RollFromTableEntries(string sBaseFileName, RollConditions[] entries, string sMessageToLog)
-        {
-            for (int i = 0; i < entries.Length; i++)
-            {
-                RollConditions entry = entries[i];
+    /// <summary>
+    /// Takes an existing array of RollFileEntry objects, creates a new array one element
+    /// bigger, and appends the final element to the end.  If the existing entries are
+    /// null (no entries), then a one-element array is returned with the final element
+    /// as the only entry.
+    /// </summary>
+    /// <param name="existing"></param>
+    /// <param name="final"></param>
+    /// <returns></returns>
+    private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final)
+    {
+      int iLength = 1;
+      if (null != existing)
+      {
+        iLength += existing.Length;
+      }
 
-                //					System.Diagnostics.Debug.WriteLine( i + ": Entry " + i + " pre/post conditions");
-                //					DumpTableEntry( entry );
-                //					System.Diagnostics.Debug.WriteLine( i + ": Testing entry pre-conditions");
-                VerifyPreConditions(sBaseFileName, entry);
-                //					System.Diagnostics.Debug.WriteLine( i + ": Logging message");
-                LogMessage(entry, sMessageToLog);
-                //					System.Diagnostics.Debug.WriteLine( i + ": Testing entry post-conditions");
-                VerifyPostConditions(sBaseFileName, entry);
-                //					System.Diagnostics.Debug.WriteLine( i + ": Finished validating entry\n");
-            }
-        }
+      RollFileEntry[] combined = new RollFileEntry[iLength];
+      if (null != existing)
+      {
+        Array.Copy(existing, 0, combined, 0, existing.Length);
+      }
 
-        private static readonly int s_Newline_Length = Environment.NewLine.Length;
+      combined[iLength - 1] = final;
+      return combined;
+    }
 
-        /// <summary>
-        /// Returns the number of bytes logged per message, including
-        /// any newline characters in addition to the message length.
-        /// </summary>
-        /// <param name="sMessage"></param>
-        /// <returns></returns>
-        private static int TotalMessageLength(string sMessage)
-        {
-            return sMessage.Length + s_Newline_Length;
-        }
-
-        /// <summary>
-        /// Determines how many messages of a fixed length can be logged
-        /// to a single file before the file rolls.
-        /// </summary>
-        /// <param name="iMessageLength"></param>
-        /// <returns></returns>
-        private static int MessagesPerFile(int iMessageLength)
-        {
-            int iMessagesPerFile = c_iMaximumFileSize / iMessageLength;
-
-            //
-            // RollingFileAppender checks for wrap BEFORE logging,
-            // so we will actually get one more message per file than
-            // we would otherwise.
-            //
-            if (iMessagesPerFile * iMessageLength < c_iMaximumFileSize)
-            {
-                iMessagesPerFile++;
-            }
-
-            return iMessagesPerFile;
-        }
-
-        /// <summary>
-        /// Determines the name of the current file
-        /// </summary>
-        /// <returns></returns>
-        private static string GetCurrentFile()
-        {
-            // Current file name is always the base file name when
-            // counting.  Dates will need a different approach
-            return c_fileName;
-        }
-
-        /// <summary>
-        /// Turns a group of file names into an array of file entries that include the name
-        /// and a size.  This is useful for assigning the properties of backup files, when
-        /// the length of the files are all the same size due to a fixed message length.
-        /// </summary>
-        /// <param name="sBackupGroup"></param>
-        /// <param name="iBackupFileLength"></param>
-        /// <returns></returns>
-        private static RollFileEntry[] MakeBackupFileEntriesFromBackupGroup(string sBackupGroup, int iBackupFileLength)
-        {
-            string[] sFiles = sBackupGroup.Split(' ');
-
-            ArrayList alEntries = new ArrayList();
-
-            for (int i = 0; i < sFiles.Length; i++)
-            {
-                // Weed out any whitespace entries from the array
-                if (sFiles[i].Trim().Length > 0)
-                {
-                    alEntries.Add(new RollFileEntry(sFiles[i], iBackupFileLength));
-                }
-            }
-
-            return (RollFileEntry[])alEntries.ToArray(typeof(RollFileEntry));
-        }
-
-        /// <summary>
-        /// Finds the iGroup group in the string (comma separated groups)
-        /// </summary>
-        /// <param name="sBackupGroups"></param>
-        /// <param name="iGroup"></param>
-        /// <returns></returns>
-        private static string GetBackupGroup(string sBackupGroups, int iGroup)
-        {
-            string[] sGroups = sBackupGroups.Split(',');
-            return sGroups[iGroup];
-        }
-
-        ///// <summary>
-        ///// Builds a collection of file entries based on the file names
-        ///// specified in a groups string and the max file size from the
-        ///// stats object
-        ///// </summary>
-        ///// <param name="sBackupGroups"></param>
-        ///// <param name="stats"></param>
-        ///// <returns></returns>
-        //private RollFileEntry[] MakeBackupFileEntriesForPreCondition( string sBackupGroups, RollingStats stats )
-        //{
-        //    if (0 == stats.NumberOfFileRolls )
-        //    {
-        //        return null;	// first round has no previous backups
-        //    }
-        //    string sGroup;
-        //    if (0 == stats.MessagesThisFile )
-        //    {
-        //        // first file has special pattern...since rolling doesn't occur when message
-        //        // is logged, rather before next message is logged.
-        //        if (stats.NumberOfFileRolls <= 1 )
-        //        {
-        //            return null;   
-        //        }
-        //        // Use backup files from previous round.  The minus 2 is because we have already
-        //        // rolled, and the first round uses null instead of the string
-        //        sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-2 );
-        //    }
-        //    else
-        //    {
-        //        sGroup = GetBackupGroup( sBackupGroups, stats.NumberOfFileRolls-1 );
-        //    }
-        //    return MakeBackupFileEntriesFromBackupGroup( sGroup, stats.MaximumFileSize );
-        //}
-
-        /// <summary>
-        /// Builds a collection of file entries based on the file names
-        /// specified in a groups string and the max file size from the
-        /// stats object
-        /// </summary>
-        /// <param name="sBackupGroups"></param>
-        /// <param name="stats"></param>
-        /// <returns></returns>
-        private static RollFileEntry[] MakeBackupFileEntriesForPostCondition(string sBackupGroups, RollingStats stats)
-        {
-            if (0 == stats.NumberOfFileRolls)
-            {
-                return null; // first round has no previous backups
-            }
-
-            string sGroup = GetBackupGroup(sBackupGroups, stats.NumberOfFileRolls - 1);
-            return MakeBackupFileEntriesFromBackupGroup(sGroup, stats.MaximumFileSize);
-        }
-
-
-        /// <summary>
-        /// This class holds information that is used while we are generating
-        /// test data sets
-        /// </summary>
-        public class RollingStats
-        {
-            private int iTotalMessageLength;
-            private int iMessagesPerFile;
-            private int iMessagesThisFile;
-            private int iNumberOfFileRolls;
-
-            /// <summary>
-            /// Number of total bytes a log file can reach.
-            /// </summary>
-            public int MaximumFileSize
-            {
-                get { return TotalMessageLength * MessagesPerFile; }
-            }
-
-            /// <summary>
-            /// The length of a message, including any CR/LF characters.
-            /// This length assumes all messages are a fixed length for
-            /// test purposes.
-            /// </summary>
-            public int TotalMessageLength
-            {
-                get { return iTotalMessageLength; }
-                set { iTotalMessageLength = value; }
-            }
-
-            /// <summary>
-            /// A count of the number of messages that are logged to each
-            /// file.
-            /// </summary>
-            public int MessagesPerFile
-            {
-                get { return iMessagesPerFile; }
-                set { iMessagesPerFile = value; }
-            }
-
-            /// <summary>
-            /// Counts how many messages have been logged to the current file
-            /// </summary>
-            public int MessagesThisFile
-            {
-                get { return iMessagesThisFile; }
-                set { iMessagesThisFile = value; }
-            }
-
-            /// <summary>
-            /// Counts how many times a file roll has occurred
-            /// </summary>
-            public int NumberOfFileRolls
-            {
-                get { return iNumberOfFileRolls; }
-                set { iNumberOfFileRolls = value; }
-            }
-        }
-
-        /// <summary>
-        /// The stats are used to keep track of progress while we are algorithmically
-        /// generating a table of pre/post condition tests for file rolling.
-        /// </summary>
-        /// <param name="sTestMessage"></param>
-        /// <returns></returns>
-        private static RollingStats InitializeStats(string sTestMessage)
-        {
-            RollingStats rollingStats = new RollingStats();
-
-            rollingStats.TotalMessageLength = TotalMessageLength(sTestMessage);
-            rollingStats.MessagesPerFile = MessagesPerFile(rollingStats.TotalMessageLength);
-            rollingStats.MessagesThisFile = 0;
-            rollingStats.NumberOfFileRolls = 0;
-
-            return rollingStats;
-        }
-
-        /// <summary>
-        /// Takes an existing array of RollFileEntry objects, creates a new array one element
-        /// bigger, and appends the final element to the end.  If the existing entries are
-        /// null (no entries), then a one-element array is returned with the final element
-        /// as the only entry.
-        /// </summary>
-        /// <param name="existing"></param>
-        /// <param name="final"></param>
-        /// <returns></returns>
-        private static RollFileEntry[] AddFinalElement(RollFileEntry[] existing, RollFileEntry final)
-        {
-            int iLength = 1;
-            if (null != existing)
-            {
-                iLength += existing.Length;
-            }
-
-            RollFileEntry[] combined = new RollFileEntry[iLength];
-            if (null != existing)
-            {
-                Array.Copy(existing, 0, combined, 0, existing.Length);
-            }
-
-            combined[iLength - 1] = final;
-            return combined;
-        }
-
-        /// <summary>
-        /// Generates the pre and post condition arrays from an array of backup files and the
-        /// current file / next file.
-        /// </summary>
-        /// <param name="sBackupFiles"></param>
-        /// <param name="preCondition"></param>
-        /// <param name="current"></param>
-        /// <param name="currentNext"></param>
-        /// <param name="rollingStats"></param>
-        /// <returns></returns>
-        private static RollConditions BuildTableEntry(string sBackupFiles,
-            RollConditions preCondition,
-            RollFileEntry current,
-            RollFileEntry currentNext,
-            RollingStats rollingStats)
-        {
-            RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats);
-            RollFileEntry[] post = AddFinalElement(backupsPost, currentNext);
-            if (null == preCondition)
-            {
-                return new RollConditions(AddFinalElement(null, current), post);
-            }
+    /// <summary>
+    /// Generates the pre and post condition arrays from an array of backup files and the
+    /// current file / next file.
+    /// </summary>
+    /// <param name="sBackupFiles"></param>
+    /// <param name="preCondition"></param>
+    /// <param name="current"></param>
+    /// <param name="currentNext"></param>
+    /// <param name="rollingStats"></param>
+    /// <returns></returns>
+    private static RollConditions BuildTableEntry(string sBackupFiles,
+        RollConditions preCondition,
+        RollFileEntry current,
+        RollFileEntry currentNext,
+        RollingStats rollingStats)
+    {
+      RollFileEntry[] backupsPost = MakeBackupFileEntriesForPostCondition(sBackupFiles, rollingStats);
+      RollFileEntry[] post = AddFinalElement(backupsPost, currentNext);
+      if (null == preCondition)
+      {
+        return new RollConditions(AddFinalElement(null, current), post);
+      }
 
-            return new RollConditions(preCondition.GetPostLogFileEntries(), post);
-        }
+      return new RollConditions(preCondition.GetPostLogFileEntries(), post);
+    }
 
-        /// <summary>
-        /// Returns a RollFileEntry that represents the next state of the current file,
-        /// based on the current state.  When the current state would roll, the next
-        /// entry is the current file wrapped to 0 bytes.  Otherwise, the next state
-        /// is the post-condition passed in as the currentNext parameter
-        /// </summary>
-        /// <param name="rollingStats"></param>
-        /// <param name="currentNext"></param>
-        /// <returns></returns>
-        private static RollFileEntry MoveNextEntry(RollingStats rollingStats, RollFileEntry currentNext)
-        {
-            rollingStats.MessagesThisFile = rollingStats.MessagesThisFile + 1;
-            if (rollingStats.MessagesThisFile >= rollingStats.MessagesPerFile)
-            {
-                rollingStats.MessagesThisFile = 0;
-                rollingStats.NumberOfFileRolls = rollingStats.NumberOfFileRolls + 1;
+    /// <summary>
+    /// Returns a RollFileEntry that represents the next state of the current file,
+    /// based on the current state.  When the current state would roll, the next
+    /// entry is the current file wrapped to 0 bytes.  Otherwise, the next state
+    /// is the post-condition passed in as the currentNext parameter
+    /// </summary>
+    /// <param name="rollingStats"></param>
+    /// <param name="currentNext"></param>
+    /// <returns></returns>
+    private static RollFileEntry MoveNextEntry(RollingStats rollingStats, RollFileEntry currentNext)
+    {
+      rollingStats.MessagesThisFile = rollingStats.MessagesThisFile + 1;
+      if (rollingStats.MessagesThisFile >= rollingStats.MessagesPerFile)
+      {
+        rollingStats.MessagesThisFile = 0;
+        rollingStats.NumberOfFileRolls = rollingStats.NumberOfFileRolls + 1;
 
-                return new RollFileEntry(GetCurrentFile(), 0);
-            }
-            else
-            {
-                return currentNext;
-            }
-        }
+        return new RollFileEntry(GetCurrentFile(), 0);
+      }
+      else
+      {
+        return currentNext;
+      }
+    }
 
-        /// <summary>
-        /// Callback point for the regular expression parser.  Turns
-        /// the number into a file name.
-        /// </summary>
-        /// <param name="match"></param>
-        /// <returns></returns>
-        private static string NumberedNameMaker(Match match)
-        {
-            Int32 iValue = Int32.Parse(match.Value);
-            return MakeFileName(c_fileName, iValue);
-        }
+    /// <summary>
+    /// Callback point for the regular expression parser.  Turns
+    /// the number into a file name.
+    /// </summary>
+    /// <param name="match"></param>
+    /// <returns></returns>
+    private static string NumberedNameMaker(Match match)
+    {
+      Int32 iValue = Int32.Parse(match.Value);
+      return MakeFileName(c_fileName, iValue);
+    }
 
-        /// <summary>
-        /// Parses a numeric list of files, turning them into file names.
-        /// Calls back to a method that does the actual replacement, turning
-        /// the numeric value into a filename.
-        /// </summary>
-        /// <param name="sBackupInfo"></param>
-        /// <param name="evaluator"></param>
-        /// <returns></returns>
-        private static string ConvertToFiles(string sBackupInfo, MatchEvaluator evaluator)
-        {
-            Regex regex = new Regex(@"\d+");
-            return regex.Replace(sBackupInfo, evaluator);
-        }
+    /// <summary>
+    /// Parses a numeric list of files, turning them into file names.
+    /// Calls back to a method that does the actual replacement, turning
+    /// the numeric value into a filename.
+    /// </summary>
+    /// <param name="sBackupInfo"></param>
+    /// <param name="evaluator"></param>
+    /// <returns></returns>
+    private static string ConvertToFiles(string sBackupInfo, MatchEvaluator evaluator)
+    {
+      Regex regex = new Regex(@"\d+");
+      return regex.Replace(sBackupInfo, evaluator);
+    }
 
-        /// <summary>
-        /// Makes test entries used for verifying counted file names
-        /// </summary>
-        /// <param name="sTestMessage">A message to log repeatedly</param>
-        /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
-        /// that results after each message is logged</param>
-        /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
-        /// <returns></returns>
-        private static RollConditions[] MakeNumericTestEntries(string sTestMessage,
-            string sBackupInfo,
-            int iMessagesToLog)
-        {
-            return MakeTestEntries(
-                sTestMessage,
-                sBackupInfo,
-                iMessagesToLog,
-                new MatchEvaluator(NumberedNameMaker));
-        }
+    /// <summary>
+    /// Makes test entries used for verifying counted file names
+    /// </summary>
+    /// <param name="sTestMessage">A message to log repeatedly</param>
+    /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
+    /// that results after each message is logged</param>
+    /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
+    /// <returns></returns>
+    private static RollConditions[] MakeNumericTestEntries(string sTestMessage,
+        string sBackupInfo,
+        int iMessagesToLog)
+    {
+      return MakeTestEntries(
+          sTestMessage,
+          sBackupInfo,
+          iMessagesToLog,
+          new MatchEvaluator(NumberedNameMaker));
+    }
 
-        /// <summary>
-        /// This routine takes a list of backup file names and a message that will be logged
-        /// repeatedly, and generates a collection of objects containing pre-condition and 
-        /// post-condition information.  This pre/post information shows the names and expected 
-        /// file sizes for all files just before and just after a message is logged.
-        /// </summary>
-        /// <param name="sTestMessage">A message to log repeatedly</param>
-        /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
-        /// that results after each message is logged</param>
-        /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
-        /// <param name="evaluator">Function that can turn a number into a filename</param>
-        /// <returns></returns>
-        private static RollConditions[] MakeTestEntries(string sTestMessage,
-            string sBackupInfo,
-            int iMessagesToLog,
-            MatchEvaluator evaluator)
-        {
-            string sBackupFiles = ConvertToFiles(sBackupInfo, evaluator);
+    /// <summary>
+    /// This routine takes a list of backup file names and a message that will be logged
+    /// repeatedly, and generates a collection of objects containing pre-condition and 
+    /// post-condition information.  This pre/post information shows the names and expected 
+    /// file sizes for all files just before and just after a message is logged.
+    /// </summary>
+    /// <param name="sTestMessage">A message to log repeatedly</param>
+    /// <param name="sBackupInfo">Filename groups used to indicate backup file name progression
+    /// that results after each message is logged</param>
+    /// <param name="iMessagesToLog">How many times the test message will be repeatedly logged</param>
+    /// <param name="evaluator">Function that can turn a number into a filename</param>
+    /// <returns></returns>
+    private static RollConditions[] MakeTestEntries(string sTestMessage,
+        string sBackupInfo,
+        int iMessagesToLog,
+        MatchEvaluator evaluator)
+    {
+      string sBackupFiles = ConvertToFiles(sBackupInfo, evaluator);
 
-            RollConditions[] table = new RollConditions[iMessagesToLog];
+      RollConditions[] table = new RollConditions[iMessagesToLog];
 
-            RollingStats rollingStats = InitializeStats(sTestMessage);
+      RollingStats rollingStats = InitializeStats(sTestMessage);
 
-            RollConditions preCondition = null;
-            rollingStats.MessagesThisFile = 0;
+      RollConditions preCondition = null;
+      rollingStats.MessagesThisFile = 0;
 
-            RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0);
-            for (int i = 0; i < iMessagesToLog; i++)
-            {
-                RollFileEntry currentNext = new RollFileEntry(
-                    GetCurrentFile(),
-                    (1 + rollingStats.MessagesThisFile) * rollingStats.TotalMessageLength);
+      RollFileEntry currentFile = new RollFileEntry(GetCurrentFile(), 0);
+      for (int i = 0; i < iMessagesToLog; i++)
+      {
+        RollFileEntry currentNext = new RollFileEntry(
+            GetCurrentFile(),
+            (1 + rollingStats.MessagesThisFile) * rollingStats.TotalMessageLength);
 
-                table[i] = BuildTableEntry(sBackupFiles, preCondition, currentFile, currentNext, rollingStats);
-                preCondition = table[i];
+        table[i] = BuildTableEntry(sBackupFiles, preCondition, currentFile, currentNext, rollingStats);
+        preCondition = table[i];
 
-                //System.Diagnostics.Debug.WriteLine( "Message " + i );
-                //DumpTableEntry( table[i] );
+        //System.Diagnostics.Debug.WriteLine( "Message " + i );
+        //DumpTableEntry( table[i] );
 
-                currentFile = MoveNextEntry(rollingStats, currentNext);
-            }
+        currentFile = MoveNextEntry(rollingStats, currentNext);
+      }
 
-            return table;
-        }
+      return table;
+    }
 
-        /// <summary>
-        /// Uses the externally defined rolling table to verify rolling names/sizes
-        /// </summary>
-        /// <remarks>
-        /// Pattern is:  check pre-conditions.  Log messages, checking size of current file.
-        /// when size exceeds limit, check post conditions.  Can determine from message the
-        /// number of messages N that will cause a roll to occur.  Challenge is to verify the
-        /// expected files, their sizes, and the names.  For a message of length L, the backups
-        /// will be of size (N * L), and the current file will be of size (K * L), where K is
-        /// the number of messages that have been logged to this file.
-        ///
-        /// File sizes can be checked algorithmically.  
-        /// 
-        /// File names are generated using a table driven algorithm, where a number is turned into
-        /// the actual filename.
-        /// 
-        /// The entries are comma-separated, with spaces between the names.  Each comma indicates
-        /// a 'roll', and the group between commas indicates the numbers for all backup files that
-        /// occur as a result of the roll.  It is assumed that no backup files exist before a roll 
-        /// occurs
-        /// </remarks>
-        /// <param name="table"></param>
-        private void VerifyRolling(RollConditions[] table)
-        {
-            ConfigureRootAppender();
-            RollFromTableEntries(c_fileName, table, GetTestMessage());
-        }
+    /// <summary>
+    /// Uses the externally defined rolling table to verify rolling names/sizes
+    /// </summary>
+    /// <remarks>
+    /// Pattern is:  check pre-conditions.  Log messages, checking size of current file.
+    /// when size exceeds limit, check post conditions.  Can determine from message the
+    /// number of messages N that will cause a roll to occur.  Challenge is to verify the
+    /// expected files, their sizes, and the names.  For a message of length L, the backups
+    /// will be of size (N * L), and the current file will be of size (K * L), where K is
+    /// the number of messages that have been logged to this file.
+    ///
+    /// File sizes can be checked algorithmically.  
+    /// 
+    /// File names are generated using a table driven algorithm, where a number is turned into
+    /// the actual filename.
+    /// 
+    /// The entries are comma-separated, with spaces between the names.  Each comma indicates
+    /// a 'roll', and the group between commas indicates the numbers for all backup files that
+    /// occur as a result of the roll.  It is assumed that no backup files exist before a roll 
+    /// occurs
+    /// </remarks>
+    /// <param name="table"></param>
+    private void VerifyRolling(RollConditions[] table)
+    {
+      ConfigureRootAppender();
+      RollFromTableEntries(c_fileName, table, GetTestMessage());
+    }
 
-        /// <summary>
-        /// Validates rolling using a fixed number of backup files, with
-        /// count direction set to up, so that newer files have higher counts.
-        /// Newest = N, Oldest = N-K, where K is the number of backups to allow
-        /// and N is the number of times rolling has occurred.
-        /// </summary>
-        [Test]
-        public void TestRollingCountUpFixedBackups()
-        {
-            //
-            // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
-            // oldest, and 3 is the newest
-            //
-            string sBackupInfo = "1, 1 2, 1 2 3, 2 3 4, 3 4 5";
+    /// <summary>
+    /// Validates rolling using a fixed number of backup files, with
+    /// count direction set to up, so that newer files have higher counts.
+    /// Newest = N, Oldest = N-K, where K is the number of backups to allow
+    /// and N is the number of times rolling has occurred.
+    /// </summary>
+    [Test]
+    public void TestRollingCountUpFixedBackups()
+    {
+      //
+      // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+      // oldest, and 3 is the newest
+      //
+      string sBackupInfo = "1, 1 2, 1 2 3, 2 3 4, 3 4 5";
 
-            //
-            // Count Up
-            //
-            _iCountDirection = +1;
+      //
+      // Count Up
+      //
+      _iCountDirection = +1;
 
-            //
-            // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
-            // bytes for current file as messages are logged.
-            //
-            int iMessagesToLog = 30;
+      //
+      // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
+      // bytes for current file as messages are logged.
+      //
+      int iMessagesToLog = 30;
 
-            VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
-        }
+      VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+    }
 
-        /// <summary>
-        /// Validates rolling using an infinite number of backup files, with
-        /// count direction set to up, so that newer files have higher counts.
-        /// Newest = N, Oldest = 1, where N is the number of times rolling has 
-        /// occurred.
-        /// </summary>
-        [Test]
-        public void TestRollingCountUpInfiniteBackups()
-        {
-            //
-            // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
-            // oldest, and 3 is the newest
-            //
-            string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
+    /// <summary>
+    /// Validates rolling using an infinite number of backup files, with
+    /// count direction set to up, so that newer files have higher counts.
+    /// Newest = N, Oldest = 1, where N is the number of times rolling has 
+    /// occurred.
+    /// </summary>
+    [Test]
+    public void TestRollingCountUpInfiniteBackups()
+    {
+      //
+      // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+      // oldest, and 3 is the newest
+      //
+      string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
 
-            //
-            // Count Up
-            //
-            _iCountDirection = +1;
+      //
+      // Count Up
+      //
+      _iCountDirection = +1;
 
-            //
-            // Infinite backups
-            //
-            _MaxSizeRollBackups = -1;
+      //
+      // Infinite backups
+      //
+      _MaxSizeRollBackups = -1;
 
-            //
-            // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
-            // bytes for current file as messages are logged.
-            //
-            int iMessagesToLog = 30;
+      //
+      // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
+      // bytes for current file as messages are logged.
+      //
+      int iMessagesToLog = 30;
 
-            VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
-        }
+      VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+    }
 
-        /// <summary>
-        /// Validates rolling with no backup files, with count direction set to up.
-        /// Only the current file should be present, wrapping to 0 bytes once the
-        /// previous file fills up.
-        /// </summary>
-        [Test]
-        public void TestRollingCountUpZeroBackups()
-        {
-            //
-            // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
-            // oldest, and 3 is the newest
-            //
-            string sBackupInfo = ", , , , ";
+    /// <summary>
+    /// Validates rolling with no backup files, with count direction set to up.
+    /// Only the current file should be present, wrapping to 0 bytes once the
+    /// previous file fills up.
+    /// </summary>
+    [Test]
+    public void TestRollingCountUpZeroBackups()
+    {
+      //
+      // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+      // oldest, and 3 is the newest
+      //
+      string sBackupInfo = ", , , , ";
 
-            //
-            // Count Up
-            //
-            _iCountDirection = +1;
+      //
+      // Count Up
+      //
+      _iCountDirection = +1;
 
-            //
-            // No backups
-            //
-            _MaxSizeRollBackups = 0;
+      //
+      // No backups
+      //
+      _MaxSizeRollBackups = 0;
 
-            //
-            // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
-            // bytes for current file as messages are logged.
-            //
-            int iMessagesToLog = 30;
+      //
+      // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
+      // bytes for current file as messages are logged.
+      //
+      int iMessagesToLog = 30;
 
-            VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
-        }
+      VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+    }
 
 
-        /// <summary>
-        /// Validates rolling using a fixed number of backup files, with
-        /// count direction set to down, so that older files have higher counts.
-        /// Newest = 1, Oldest = N, where N is the number of backups to allow
-        /// </summary>
-        [Test]
-        public void TestRollingCountDownFixedBackups()
-        {
-            //
-            // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
-            // oldest, and 3 is the newest
-            //
-            string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3, 1 2 3";
+    /// <summary>
+    /// Validates rolling using a fixed number of backup files, with
+    /// count direction set to down, so that older files have higher counts.
+    /// Newest = 1, Oldest = N, where N is the number of backups to allow
+    /// </summary>
+    [Test]
+    public void TestRollingCountDownFixedBackups()
+    {
+      //
+      // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+      // oldest, and 3 is the newest
+      //
+      string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3, 1 2 3";
 
-            //
-            // Count Up
-            //
-            _iCountDirection = -1;
+      //
+      // Count Up
+      //
+      _iCountDirection = -1;
 
-            //
-            // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
-            // bytes for current file as messages are logged.
-            //
-            int iMessagesToLog = 30;
+      //
+      // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
+      // bytes for current file as messages are logged.
+      //
+      int iMessagesToLog = 30;
 
-            VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
-        }
+      VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+    }
 
-        /// <summary>
-        /// Validates rolling using an infinite number of backup files, with
-        /// count direction set to down, so that older files have higher counts.
-        /// Newest = 1, Oldest = N, where N is the number of times rolling has
-        /// occurred
-        /// </summary>
-        [Test]
-        public void TestRollingCountDownInfiniteBackups()
-        {
-            //
-            // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
-            // oldest, and 3 is the newest
-            //
-            string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
+    /// <summary>
+    /// Validates rolling using an infinite number of backup files, with
+    /// count direction set to down, so that older files have higher counts.
+    /// Newest = 1, Oldest = N, where N is the number of times rolling has
+    /// occurred
+    /// </summary>
+    [Test]
+    public void TestRollingCountDownInfiniteBackups()
+    {
+      //
+      // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+      // oldest, and 3 is the newest
+      //
+      string sBackupInfo = "1, 1 2, 1 2 3, 1 2 3 4, 1 2 3 4 5";
 
-            //
-            // Count Down
-            //
-            _iCountDirection = -1;
+      //
+      // Count Down
+      //
+      _iCountDirection = -1;
 
-            //
-            // Infinite backups
-            //
-            _MaxSizeRollBackups = -1;
+      //
+      // Infinite backups
+      //
+      _MaxSizeRollBackups = -1;
 
-            //
-            // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
-            // bytes for current file as messages are logged.
-            //
-            int iMessagesToLog = 30;
+      //
+      // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
+      // bytes for current file as messages are logged.
+      //
+      int iMessagesToLog = 30;
 
-            VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
-        }
+      VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+    }
 
-        /// <summary>
-        /// Validates rolling with no backup files, with count direction set to down.
-        /// Only the current file should be present, wrapping to 0 bytes once the
-        /// previous file fills up.
-        /// </summary>
-        [Test]
-        public void TestRollingCountDownZeroBackups()
-        {
-            //
-            // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
-            // oldest, and 3 is the newest
-            //
-            string sBackupInfo = ", , , , ";
+    /// <summary>
+    /// Validates rolling with no backup files, with count direction set to down.
+    /// Only the current file should be present, wrapping to 0 bytes once the
+    /// previous file fills up.
+    /// </summary>
+    [Test]
+    public void TestRollingCountDownZeroBackups()
+    {
+      //
+      // Oldest to newest when reading in a group left-to-right, so 1 2 3 means 1 is the
+      // oldest, and 3 is the newest
+      //
+      string sBackupInfo = ", , , , ";
 
-            //
-            // Count Up
-            //
-            _iCountDirection = -1;
+      //
+      // Count Up
+      //
+      _iCountDirection = -1;
 
-            //
-            // No backups
-            //
-            _MaxSizeRollBackups = 0;
+      //
+      // No backups
+      //
+      _MaxSizeRollBackups = 0;
 
-            //
-            // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
-            // bytes for current file as messages are logged.
-            //
-            int iMessagesToLog = 30;
+      //
+      // Log 30 messages.  This is 5 groups, 6 checks per group ( 0, 100, 200, 300, 400, 500 
+      // bytes for current file as messages are logged.
+      //
+      int iMessagesToLog = 30;
 
-            VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
-        }
+      VerifyRolling(MakeNumericTestEntries(GetTestMessage(), sBackupInfo, iMessagesToLog));
+    }
 
-        /// <summary>
-        /// Configures the root appender for counting and rolling
-        /// </summary>
-        private void ConfigureRootAppender()
-        {
-            _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
-            _root.Level = Level.Debug;
-            _caRoot = new CountingAppender();
-            _root.AddAppender(_caRoot);
-            Assert.AreEqual(_caRoot.Counter, 0);
+    /// <summary>
+    /// Configures the root appender for counting and rolling
+    /// </summary>
+    private void ConfigureRootAppender()
+    {
+      _root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
+      _root.Level = Level.Debug;
+      _caRoot = new CountingAppender();
+      _root.AddAppender(_caRoot);
+      Assert.AreEqual(_caRoot.Counter, 0);
 
-            //
-            // Set the root appender with a RollingFileAppender
-            //
-            _root.AddAppender(CreateAppender());
+      //
+      // Set the root appender with a RollingFileAppender
+      //
+      _root.AddAppender(CreateAppender());
 
-            _root.Repository.Configured = true;
-        }
+      _root.Repository.Configured = true;
+    }
 
-        /// <summary>
-        /// Verifies that the current backup index is detected correctly when initializing
-        /// </summary>
-        /// <param name="sBaseFile"></param>
-        /// <param name="alFiles"></param>
-        /// <param name="iExpectedCurSizeRollBackups"></param>
-        private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile,
-            ArrayList alFiles,
-            int iExpectedCurSizeRollBackups)
-        {
-            InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"),
-                iExpectedCurSizeRollBackups);
-        }
+    /// <summary>
+    /// Verifies that the current backup index is detected correctly when initializing
+    /// </summary>
+    /// <param name="sBaseFile"></param>
+    /// <param name="alFiles"></param>
+    /// <param name="iExpectedCurSizeRollBackups"></param>
+    private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile,
+        ArrayList alFiles,
+        int iExpectedCurSizeRollBackups)
+    {
+      InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("5,0,1"),
+          iExpectedCurSizeRollBackups);
+    }
 
-        /// <summary>
-        /// Tests that the current backup index is 0 when no
-        /// existing files are seen
-        /// </summary>
-        [Test]
-        public void TestInitializeRollBackups1()
-        {
-            string sBaseFile = "LogFile.log";
-            ArrayList arrFiles = new ArrayList();
-            arrFiles.Add("junk1");
-            arrFiles.Add("junk1.log");
-            arrFiles.Add("junk2.log");
-            arrFiles.Add("junk.log.1");
-            arrFiles.Add("junk.log.2");
+    /// <summary>
+    /// Tests that the current backup index is 0 when no
+    /// existing files are seen
+    /// </summary>
+    [Test]
+    public void TestInitializeRollBackups1()
+    {
+      string sBaseFile = "LogFile.log";
+      ArrayList arrFiles = new ArrayList();
+      arrFiles.Add("junk1");
+      arrFiles.Add("junk1.log");
+      arrFiles.Add("junk2.log");
+      arrFiles.Add("junk.log.1");
+      arrFiles.Add("junk.log.2");
 
-            int iExpectedCurSizeRollBackups = 0;
-            VerifyInitializeRollBackupsFromBaseFile(sBaseFile, arrFiles, iExpectedCurSizeRollBackups);
-        }
+      int iExpectedCurSizeRollBackups = 0;
+      VerifyInitializeRollBackupsFromBaseFile(sBaseFile, arrFiles, iExpectedCurSizeRollBackups);
+    }
 
-        /// <summary>
-        /// Verifies that files are detected when the base file is specified
-        /// </summary>
-        /// <param name="sBaseFile"></param>
-        private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile)
-        {
-            ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2");
+    /// <summary>
+    /// Verifies that files are detected when the base file is specified
+    /// </summary>
+    /// <param name="sBaseFile"></param>
+    private static void VerifyInitializeRollBackupsFromBaseFile(string sBaseFile)
+    {
+      ArrayList alFiles = MakeTestDataFromString(sBaseFile, "0,1,2");
 
-            int iExpectedCurSizeRollBackups = 2;
-            VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups);
-        }
+      int iExpectedCurSizeRollBackups = 2;
+      VerifyInitializeRollBackupsFromBaseFile(sBaseFile, alFiles, iExpectedCurSizeRollBackups);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountUpFixed()
-        {
-            ArrayList alFiles = MakeTestDataFromString("3,4,5");
-            int iExpectedValue = 5;
-            InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountUpFixed()
+    {
+      ArrayList alFiles = MakeTestDataFromString("3,4,5");
+      int iExpectedValue = 5;
+      InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountUpFixed2()
-        {
-            ArrayList alFiles = MakeTestDataFromString("0,3");
-            int iExpectedValue = 3;
-            InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountUpFixed2()
+    {
+      ArrayList alFiles = MakeTestDataFromString("0,3");
+      int iExpectedValue = 3;
+      InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("3,0,1"), iExpectedValue);
+    }
 
-        /// <summary>
-        /// Verifies that count stays at 0 for the zero backups case
-        /// when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountUpZeroBackups()
-        {
-            ArrayList alFiles = MakeTestDataFromString("0,3");
-            int iExpectedValue = 0;
-            InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue);
-        }
+    /// <summary>
+    /// Verifies that count stays at 0 for the zero backups case
+    /// when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountUpZeroBackups()
+    {
+      ArrayList alFiles = MakeTestDataFromString("0,3");
+      int iExpectedValue = 0;
+      InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,1"), iExpectedValue);
+    }
 
-        /// <summary>
-        /// Verifies that count stays at 0 for the zero backups case
-        /// when counting down
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownZeroBackups()
-        {
-            ArrayList alFiles = MakeTestDataFromString("0,3");
-            int iExpectedValue = 0;
-            InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue);
-        }
+    /// <summary>
+    /// Verifies that count stays at 0 for the zero backups case
+    /// when counting down
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownZeroBackups()
+    {
+      ArrayList alFiles = MakeTestDataFromString("0,3");
+      int iExpectedValue = 0;
+      InitializeAndVerifyExpectedValue(alFiles, c_fileName, CreateRollingFileAppender("0,0,-1"), iExpectedValue);
+    }
 
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed()
-        {
-            ArrayList alFiles = MakeTestDataFromString("4,5,6");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed()
+    {
+      ArrayList alFiles = MakeTestDataFromString("4,5,6");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 0);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed2()
-        {
-            ArrayList alFiles = MakeTestDataFromString("1,5,6");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed2()
+    {
+      ArrayList alFiles = MakeTestDataFromString("1,5,6");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 1);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed3()
-        {
-            ArrayList alFiles = MakeTestDataFromString("2,5,6");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed3()
+    {
+      ArrayList alFiles = MakeTestDataFromString("2,5,6");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed4()
-        {
-            ArrayList alFiles = MakeTestDataFromString("3,5,6");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed4()
+    {
+      ArrayList alFiles = MakeTestDataFromString("3,5,6");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed5()
-        {
-            ArrayList alFiles = MakeTestDataFromString("1,2,3");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed5()
+    {
+      ArrayList alFiles = MakeTestDataFromString("1,2,3");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed6()
-        {
-            ArrayList alFiles = MakeTestDataFromString("1,2");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed6()
+    {
+      ArrayList alFiles = MakeTestDataFromString("1,2");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 2);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownFixed7()
-        {
-            ArrayList alFiles = MakeTestDataFromString("2,3");
-            VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownFixed7()
+    {
+      ArrayList alFiles = MakeTestDataFromString("2,3");
+      VerifyInitializeDownFixedExpectedValue(alFiles, c_fileName, 3);
+    }
 
-        private static void InitializeAndVerifyExpectedValue(ArrayList alFiles,
-            string sBaseFile,
-            RollingFileAppender rfa,
-            int iExpectedValue)
-        {
-            InitializeRollBackups(rfa, sBaseFile, alFiles);
-            Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa));
-        }
+    private static void InitializeAndVerifyExpectedValue(ArrayList alFiles,
+        string sBaseFile,
+        RollingFileAppender rfa,
+        int iExpectedValue)
+    {
+      InitializeRollBackups(rfa, sBaseFile, alFiles);
+      Assert.AreEqual(iExpectedValue, GetFieldCurSizeRollBackups(rfa));
+    }
 
-        /// <summary>
-        /// Tests the count down case, with infinite max backups, to see that
-        /// initialization of the rolling file appender results in the expected value
-        /// </summary>
-        /// <param name="alFiles"></param>
-        /// <param name="sBaseFile"></param>
-        /// <param name="iExpectedValue"></param>
-        private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles,
-            string sBaseFile,
-            int iExpectedValue)
-        {
-            InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,-1"), iExpectedValue);
-        }
+    /// <summary>
+    /// Tests the count down case, with infinite max backups, to see that
+    /// initialization of the rolling file appender results in the expected value
+    /// </summary>
+    /// <param name="alFiles"></param>
+    /// <param name="sBaseFile"></param>
+    /// <param name="iExpectedValue"></param>
+    private static void VerifyInitializeDownInfiniteExpectedValue(ArrayList alFiles,
+        string sBaseFile,
+        int iExpectedValue)
+    {
+      InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,-1"), iExpectedValue);
+    }
 
-        /// <summary>
-        /// Creates a RollingFileAppender with the desired values, where the
-        /// values are passed as a comma separated string, with 3 parameters,
-        /// m_maxSizeRollBackups, m_curSizeRollBackups, CountDirection
-        /// </summary>
-        /// <param name="sParams"></param>
-        /// <returns></returns>
-        private static RollingFileAppender CreateRollingFileAppender(string sParams)
-        {
-            string[] asParams = sParams.Split(',');
-            if (null == asParams || asParams.Length != 3)
-            {
-                throw new ArgumentOutOfRangeException(sParams, sParams,
-                    "Must have 3 comma separated params: MaxSizeRollBackups, CurSizeRollBackups, CountDirection");
-            }
+    /// <summary>
+    /// Creates a RollingFileAppender with the desired values, where the
+    /// values are passed as a comma separated string, with 3 parameters,
+    /// m_maxSizeRollBackups, m_curSizeRollBackups, CountDirection
+    /// </summary>
+    /// <param name="sParams"></param>
+    /// <returns></returns>
+    private static RollingFileAppender CreateRollingFileAppender(string sParams)
+    {
+      string[] asParams = sParams.Split(',');
+      if (null == asParams || asParams.Length != 3)
+      {
+        throw new ArgumentOutOfRangeException(sParams, sParams,
+            "Must have 3 comma separated params: MaxSizeRollBackups, CurSizeRollBackups, CountDirection");
+      }
 
-            RollingFileAppender rfa = new RollingFileAppender();
-            rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
-            SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim()));
-            SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim()));
-            rfa.CountDirection = Int32.Parse(asParams[2].Trim());
+      RollingFileAppender rfa = new RollingFileAppender();
+      rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
+      SetFieldMaxSizeRollBackups(rfa, Int32.Parse(asParams[0].Trim()));
+      SetFieldCurSizeRollBackups(rfa, Int32.Parse(asParams[1].Trim()));
+      rfa.CountDirection = Int32.Parse(asParams[2].Trim());
 
-            return rfa;
-        }
+      return rfa;
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting down
-        /// and infinite backups are selected
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownInfinite()
-        {
-            ArrayList alFiles = MakeTestDataFromString("2,3");
-            VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting down
+    /// and infinite backups are selected
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownInfinite()
+    {
+      ArrayList alFiles = MakeTestDataFromString("2,3");
+      VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 3);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting down
-        /// and infinite backups are selected
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownInfinite2()
-        {
-            ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
-            VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting down
+    /// and infinite backups are selected
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownInfinite2()
+    {
+      ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
+      VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting down
-        /// and infinite backups are selected
-        /// </summary>
-        [Test]
-        public void TestInitializeCountDownInfinite3()
-        {
-            ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
-            VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting down
+    /// and infinite backups are selected
+    /// </summary>
+    [Test]
+    public void TestInitializeCountDownInfinite3()
+    {
+      ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
+      VerifyInitializeDownInfiniteExpectedValue(alFiles, c_fileName, 10);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// and infinite backups are selected
-        /// </summary>
-        [Test]
-        public void TestInitializeCountUpInfinite()
-        {
-            ArrayList alFiles = MakeTestDataFromString("2,3");
-            VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// and infinite backups are selected
+    /// </summary>
+    [Test]
+    public void TestInitializeCountUpInfinite()
+    {
+      ArrayList alFiles = MakeTestDataFromString("2,3");
+      VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 3);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// and infinite backups are selected
-        /// </summary>
-        [Test]
-        public void TestInitializeCountUpInfinite2()
-        {
-            ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
-            VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// and infinite backups are selected
+    /// </summary>
+    [Test]
+    public void TestInitializeCountUpInfinite2()
+    {
+      ArrayList alFiles = MakeTestDataFromString("2,3,4,5,6,7,8,9,10");
+      VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
+    }
 
-        /// <summary>
-        /// Verifies that count goes to the highest when counting up
-        /// and infinite backups are selected
-        /// </summary>
-        [Test]
-        public void TestInitializeCountUpInfinite3()
-        {
-            ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
-            VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
-        }
+    /// <summary>
+    /// Verifies that count goes to the highest when counting up
+    /// and infinite backups are selected
+    /// </summary>
+    [Test]
+    public void TestInitializeCountUpInfinite3()
+    {
+      ArrayList alFiles = MakeTestDataFromString("9,10,3,4,5,7,9,6,1,2,8");
+      VerifyInitializeUpInfiniteExpectedValue(alFiles, c_fileName, 10);
+    }
 
-        /// <summary>
-        /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
-        /// </summary>
-        /// <param name="filename">The filename to log to</param>
-        /// <param name="lockModel">The locking model to use.</param>
-        /// <param name="handler">The error handler to use.</param>
-        /// <returns>A configured ILogger</returns>
-        private static ILogger CreateLogger(string filename,
-            FileAppender.LockingModelBase lockModel,
-            IErrorHandler handler)
-        {
-            return CreateLogger(filename, lockModel, handler, 100000, 0);
-        }
+    /// <summary>
+    /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
+    /// </summary>
+    /// <param name="filename">The filename to log to</param>
+    /// <param name="lockModel">The locking model to use.</param>
+    /// <param name="handler">The error handler to use.</param>
+    /// <returns>A configured ILogger</returns>
+    private static ILogger CreateLogger(string filename,
+        FileAppender.LockingModelBase lockModel,
+        IErrorHandler handler)
+    {
+      return CreateLogger(filename, lockModel, handler, 100000, 0);
+    }
 
-        /// <summary>
-        /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
-        /// </summary>
-        /// <param name="filename">The filename to log to</param>
-        /// <param name="lockModel">The locking model to use.</param>
-        /// <param name="handler">The error handler to use.</param>
-        /// <param name="maxFileSize">Maximum file size for roll</param>
-        /// <param name="maxSizeRollBackups">Maximum number of roll backups</param>
-        /// <returns>A configured ILogger</returns>
-        private static ILogger CreateLogger(string filename,
-            FileAppender.LockingModelBase lockModel,
-            IErrorHandler handler,
-            int maxFileSize,
-            int maxSizeRollBackups)
-        {
-            Repository.Hierarchy.Hierarchy h =
-                (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository");
+    /// <summary>
+    /// Creates a logger hierarchy, configures a rolling file appender and returns an ILogger
+    /// </summary>
+    /// <param name="filename">The filename to log to</param>
+    /// <param name="lockModel">The locking model to use.</param>
+    /// <param name="handler">The error handler to use.</param>
+    /// <param name="maxFileSize">Maximum file size for roll</param>
+    /// <param name="maxSizeRollBackups">Maximum number of roll backups</param>
+    /// <returns>A configured ILogger</returns>
+    private static ILogger CreateLogger(string filename,
+        FileAppender.LockingModelBase lockModel,
+        IErrorHandler handler,
+        int maxFileSize,
+        int maxSizeRollBackups)
+    {
+      Repository.Hierarchy.Hierarchy h =
+          (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository");
 
-            RollingFileAppender appender = new RollingFileAppender();
-            appender.File = filename;
-            appender.AppendToFile = false;
-            appender.CountDirection = 0;
-            appender.RollingStyle = RollingFileAppender.RollingMode.Size;
-            appender.MaxFileSize = maxFileSize;
-            appender.Encoding = Encoding.ASCII;
-            appender.ErrorHandler = handler;
-            appender.MaxSizeRollBackups = maxSizeRollBackups;
-            if (lockModel != null)
-            {
-                appender.LockingModel = lockModel;
-            }
+      RollingFileAppender appender = new RollingFileAppender();
+      appender.File = filename;
+      appender.AppendToFile = false;
+      appender.CountDirection = 0;
+      appender.RollingStyle = RollingFileAppender.RollingMode.Size;
+      appender.MaxFileSize = maxFileSize;
+      appender.Encoding = Encoding.ASCII;
+      appender.ErrorHandler = handler;
+      appender.MaxSizeRollBackups = maxSizeRollBackups;
+      if (lockModel != null)
+      {
+        appender.LockingModel = lockModel;
+      }
 
-            PatternLayout layout = new PatternLayout();
-            layout.ConversionPattern = "%m%n";
-            layout.ActivateOptions();
+      PatternLayout layout = new PatternLayout();
+      layout.ConversionPattern = "%m%n";
+      layout.ActivateOptions();
 
-            appender.Layout = layout;
-            appender.ActivateOptions();
+      appender.Layout = layout;
+      appender.ActivateOptions();
 
-            h.Root.AddAppender(appender);
-            h.Configured = true;
+      h.Root.AddAppender(appender);
+      h.Configured = true;
 
-            ILogger log = h.GetLogger("Logger");
-            return log;
-        }
+      ILogger log = h.GetLogger("Logger");
+      return log;
+    }
 
-        /// <summary>
-        /// Destroys the logger hierarchy created by <see cref="RollingFileAppenderTest.CreateLogger"/>
-        /// </summary>
-        private static void DestroyLogger()
-        {
-            Repository.Hierarchy.Hierarchy h =
-                (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository");
-            h.ResetConfiguration();
-            //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary
-            LoggerManager.RepositorySelector =
-                new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
-        }
+    /// <summary>
+    /// Destroys the logger hierarchy created by <see cref="RollingFileAppenderTest.CreateLogger"/>
+    /// </summary>
+    private static void DestroyLogger()
+    {
+      Repository.Hierarchy.Hierarchy h =
+          (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository");
+      h.ResetConfiguration();
+      //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary
+      LoggerManager.RepositorySelector =
+          new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
+    }
 
-        private static void AssertFileEquals(string filename, string contents)
-        {
-            FileInfo fileinfo = new FileInfo(filename);
-            StreamReader sr = new StreamReader(fileinfo.OpenRead());
-            string logcont = sr.ReadToEnd();
-            sr.Close();
+    private static void AssertFileEquals(string filename, string contents)
+    {
+      FileInfo fileinfo = new FileInfo(filename);
+      StreamReader sr = new StreamReader(fileinfo.OpenRead());
+      string logcont = sr.ReadToEnd();
+      sr.Close();
 
-            Assert.AreEqual(contents, logcont, "Log contents is not what is expected");
+      Assert.AreEqual(contents, logcont, "Log contents is not what is expected");
 
-            File.Delete(filename);
-        }
+      File.Delete(filename);
+    }
 
-        /// <summary>
-        /// Verifies that logging a message actually produces output
-        /// </summary>
-        [Test]
-        public void TestLogOutput()
-        {
-            string filename = "test_simple.log";
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+    /// <summary>
+    /// Verifies that logging a message actually produces output
+    /// </summary>
+    [Test]
+    public void TestLogOutput()
+    {
+      string filename = "test_simple.log";
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            AssertFileEquals(filename,
-                "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
-            Assert.AreEqual("", sh.Message, "Unexpected error message");
-        }
+      AssertFileEquals(filename,
+          "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a locked file fails gracefully
-        /// </summary>
-        [Test]
-        public void TestExclusiveLockFails()
-        {
-            string filename = "test_exclusive_lock_fails.log";
+    /// <summary>
+    /// Verifies that attempting to log to a locked file fails gracefully
+    /// </summary>
+    [Test]
+    public void TestExclusiveLockFails()
+    {
+      string filename = "test_exclusive_lock_fails.log";
 
-            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+      FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
-            fs.Close();
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
+      fs.Close();
 
-            AssertFileEquals(filename, "Test");
-            Assert.AreEqual(sh.Message.Substring(0, 30), "Unable to acquire lock on file",
-                "Expecting an error message");
-        }
+      AssertFileEquals(filename, "Test");
+      Assert.AreEqual(sh.Message.Substring(0, 30), "Unable to acquire lock on file",
+          "Expecting an error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a locked file recovers if the lock is released
-        /// </summary>
-        [Test]
-        public void TestExclusiveLockRecovers()
-        {
-            string filename = "test_exclusive_lock_recovers.log";
+    /// <summary>
+    /// Verifies that attempting to log to a locked file recovers if the lock is released
+    /// </summary>
+    [Test]
+    public void TestExclusiveLockRecovers()
+    {
+      string filename = "test_exclusive_lock_recovers.log";
 
-            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+      FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            fs.Close();
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      fs.Close();
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
-            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
-                "Expecting an error message");
-        }
+      AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
+      Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+          "Expecting an error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a file with ExclusiveLock really locks the file
-        /// </summary>
-        [Test]
-        public void TestExclusiveLockLocks()
-        {
-            string filename = "test_exclusive_lock_locks.log";
-            bool locked = false;
+    /// <summary>
+    /// Verifies that attempting to log to a file with ExclusiveLock really locks the file
+    /// </summary>
+    [Test]
+    public void TestExclusiveLockLocks()
+    {
+      string filename = "test_exclusive_lock_locks.log";
+      bool locked = false;
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.ExclusiveLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
 
-            try
-            {
-                FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-                fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
-                fs.Close();
-            }
-            catch (IOException e1)
-            {
+      try
+      {
+        FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+        fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+        fs.Close();
+      }
+      catch (IOException e1)
+      {
 #if MONO
-				Assert.AreEqual("Sharing violation on path ", e1.Message.Substring(0, 26), "Unexpected exception");
+        Assert.AreEqual("Sharing violation on path ", e1.Message.Substring(0, 26), "Unexpected exception");
 #else
-                Assert.AreEqual("The process cannot access the file ", e1.Message.Substring(0, 35),
-                    "Unexpected exception");
+        Assert.AreEqual("The process cannot access the file ", e1.Message.Substring(0, 35),
+            "Unexpected exception");
 #endif
-                locked = true;
-            }
+        locked = true;
+      }
 
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            Assert.IsTrue(locked, "File was not locked");
+      Assert.IsTrue(locked, "File was not locked");
 #if !MONO || MONO_3_5 || MONO_4_0 // at least on Linux with Mono 2.4 exclusive locking doesn't work as one would expect
-            AssertFileEquals(filename,
-                "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
+      AssertFileEquals(filename,
+          "This is a message" + Environment.NewLine + "This is a message 2" + Environment.NewLine);
 #endif
-            Assert.AreEqual("", sh.Message, "Unexpected error message");
-        }
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
 
 
-        /// <summary>
-        /// Verifies that attempting to log to a locked file fails gracefully
-        /// </summary>
-        [Test]
-        public void TestMinimalLockFails()
-        {
-            string filename = "test_minimal_lock_fails.log";
+    /// <summary>
+    /// Verifies that attempting to log to a locked file fails gracefully
+    /// </summary>
+    [Test]
+    public void TestMinimalLockFails()
+    {
+      string filename = "test_minimal_lock_fails.log";
 
-            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+      FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
-            fs.Close();
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
+      fs.Close();
 
-            AssertFileEquals(filename, "Test");
-            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
-                "Expecting an error message");
-        }
+      AssertFileEquals(filename, "Test");
+      Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+          "Expecting an error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a locked file recovers if the lock is released
-        /// </summary>
-        [Test]
-        public void TestMinimalLockRecovers()
-        {
-            string filename = "test_minimal_lock_recovers.log";
+    /// <summary>
+    /// Verifies that attempting to log to a locked file recovers if the lock is released
+    /// </summary>
+    [Test]
+    public void TestMinimalLockRecovers()
+    {
+      string filename = "test_minimal_lock_recovers.log";
 
-            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+      FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            fs.Close();
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      fs.Close();
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
-            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
-                "Expecting an error message");
-        }
+      AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
+      Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+          "Expecting an error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a file with MinimalLock doesn't lock the file
-        /// </summary>
-        [Test]
-        public void TestMinimalLockUnlocks()
-        {
-            string filename = "test_minimal_lock_unlocks.log";
-            bool locked;
+    /// <summary>
+    /// Verifies that attempting to log to a file with MinimalLock doesn't lock the file
+    /// </summary>
+    [Test]
+    public void TestMinimalLockUnlocks()
+    {
+      string filename = "test_minimal_lock_unlocks.log";
+      bool locked;
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.MinimalLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
 
-            locked = true;
-            FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
-            fs.Close();
+      locked = true;
+      FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
+      fs.Close();
 
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            Assert.IsTrue(locked, "File was not locked");
-            AssertFileEquals(filename,
-                "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" +
-                Environment.NewLine);
-            Assert.AreEqual("", sh.Message, "Unexpected error message");
-        }
+      Assert.IsTrue(locked, "File was not locked");
+      AssertFileEquals(filename,
+          "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" +
+          Environment.NewLine);
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
 
 #if !NETCF
-        /// <summary>
-        /// Verifies that attempting to log to a locked file fails gracefully
-        /// </summary>
-        [Test]
-        public void TestInterProcessLockFails()
-        {
-            string filename = "test_interprocess_lock_fails.log";
+    /// <summary>
+    /// Verifies that attempting to log to a locked file fails gracefully
+    /// </summary>
+    [Test]
+    public void TestInterProcessLockFails()
+    {
+      string filename = "test_interprocess_lock_fails.log";
 
-            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+      FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
-            fs.Close();
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
+      fs.Close();
 
-            AssertFileEquals(filename, "Test");
-            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
-                "Expecting an error message");
-        }
+      AssertFileEquals(filename, "Test");
+      Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+          "Expecting an error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a locked file recovers if the lock is released
-        /// </summary>
-        [Test]
-        public void TestInterProcessLockRecovers()
-        {
-            string filename = "test_interprocess_lock_recovers.log";
+    /// <summary>
+    /// Verifies that attempting to log to a locked file recovers if the lock is released
+    /// </summary>
+    [Test]
+    public void TestInterProcessLockRecovers()
+    {
+      string filename = "test_interprocess_lock_recovers.log";
 
-            FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
-            fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
+      FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
+      fs.Write(Encoding.ASCII.GetBytes("Test"), 0, 4);
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
-            fs.Close();
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      fs.Close();
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
-            Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
-                "Expecting an error message");
-        }
+      AssertFileEquals(filename, "This is a message 2" + Environment.NewLine);
+      Assert.AreEqual("Unable to acquire lock on file", sh.Message.Substring(0, 30),
+          "Expecting an error message");
+    }
 
-        /// <summary>
-        /// Verifies that attempting to log to a file with InterProcessLock really locks the file
-        /// </summary>
-        [Test]
-        public void TestInterProcessLockUnlocks()
-        {
-            string filename = "test_interprocess_lock_unlocks.log";
-            bool locked;
+    /// <summary>
+    /// Verifies that attempting to log to a file with InterProcessLock really locks the file
+    /// </summary>
+    [Test]
+    public void TestInterProcessLockUnlocks()
+    {
+      string filename = "test_interprocess_lock_unlocks.log";
+      bool locked;
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh);
-            log.Log(GetType(), Level.Info, "This is a message", null);
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh);
+      log.Log(GetType(), Level.Info, "This is a message", null);
 
-            locked = true;
-            FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
-            fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
-            fs.Close();
+      locked = true;
+      FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
+      fs.Write(Encoding.ASCII.GetBytes("Test" + Environment.NewLine), 0, 4 + Environment.NewLine.Length);
+      fs.Close();
 
-            log.Log(GetType(), Level.Info, "This is a message 2", null);
-            DestroyLogger();
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-            Assert.IsTrue(locked, "File was not locked");
-            AssertFileEquals(filename,
-                "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" +
-                Environment.NewLine);
-            Assert.AreEqual("", sh.Message, "Unexpected error message");
-        }
+      Assert.IsTrue(locked, "File was not locked");
+      AssertFileEquals(filename,
+          "This is a message" + Environment.NewLine + "Test" + Environment.NewLine + "This is a message 2" +
+          Environment.NewLine);
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
 
-        /// <summary>
-        /// Verifies that rolling file works
-        /// </summary>
-        [Test]
-        public void TestInterProcessLockRoll()
-        {
-            string filename = "test_interprocess_lock_roll.log";
+    /// <summary>
+    /// Verifies that rolling file works
+    /// </summary>
+    [Test]
+    public void TestInterProcessLockRoll()
+    {
+      string filename = "test_interprocess_lock_roll.log";
 
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh, 1, 2);
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, new FileAppender.InterProcessLock(), sh, 1, 2);
 
-            Assert.DoesNotThrow(delegate
-            {
-                log.Log(GetType(), Level.Info, "A", null);
-            });
-            Assert.DoesNotThrow(delegate
-            {
-                log.Log(GetType(), Level.Info, "A", null);
-            });
+      Assert.DoesNotThrow(delegate
+      {
+        log.Log(GetType(), Level.Info, "A", null);
+      });
+      Assert.DoesNotThrow(delegate
+      {
+        log.Log(GetType(), Level.Info, "A", null);
+      });
 
-            DestroyLogger();
+      DestroyLogger();
 
-            AssertFileEquals(filename, "A" + Environment.NewLine);
-            AssertFileEquals(filename + ".1", "A" + Environment.NewLine);
-            Assert.IsEmpty(sh.Message);
-        }
+      AssertFileEquals(filename, "A" + Environment.NewLine);
+      AssertFileEquals(filename + ".1", "A" + Environment.NewLine);
+      Assert.IsEmpty(sh.Message);
+    }
 #endif
 
-        /// <summary>
-        /// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour
-        /// </summary>
-        [Test]
-        public void TestDefaultLockingModel()
-        {
-            string filename = "test_default.log";
-
-            SilentErrorHandler sh = new SilentErrorHandler();
-            ILogger log = CreateLogger(filename, null, sh);
-
-            IAppender[] appenders = log.Repository.GetAppenders();
-            Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured");
-
-            RollingFileAppender rfa = (RollingFileAppender)(appenders[0]);
-            Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(),
-                "The LockingModel is of an unexpected type");
-
-            DestroyLogger();
-        }
-
-        /// <summary>
-        /// Tests the count up case, with infinite max backups , to see that
-        /// initialization of the rolling file appender results in the expected value
-        /// </summary>
-        /// <param name="alFiles"></param>
-        /// <param name="sBaseFile"></param>
-        /// <param name="iExpectedValue"></param>
-        private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles,
-            string sBaseFile,
-            int iExpectedValue)
-        {
-            InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,1"), iExpectedValue);
-        }
-
-
-        /// <summary>
-        /// Tests the count down case, with max backups limited to 3, to see that
-        /// initialization of the rolling file appender results in the expected value
-        /// </summary>
-        /// <param name="alFiles"></param>
-        /// <param name="sBaseFile"></param>
-        /// <param name="iExpectedValue"></param>
-        private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles,
-            string sBaseFile,
-            int iExpectedValue)
-        {
-            InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("3,0,-1"), iExpectedValue);
-        }
-
-        /// <summary>
-        /// Turns a string of comma separated numbers into a collection of filenames
-        /// generated from the numbers.  
-        /// 
-        /// Defaults to filename in _fileName variable.
-        /// 
-        /// </summary>
-        /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
-        /// <returns></returns>
-        private static ArrayList MakeTestDataFromString(string sFileNumbers)
-        {
-            return MakeTestDataFromString(c_fileName, sFileNumbers);
-        }
-
-        /// <summary>
-        /// Turns a string of comma separated numbers into a collection of filenames
-        /// generated from the numbers
-        /// 
-        /// Uses the input filename.
-        /// </summary>
-        /// <param name="sFileName">Name of file to combine with numbers when generating counted file names</param>
-        /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
-        /// <returns></returns>
-        private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers)
-        {
-            ArrayList alFiles = new ArrayList();
-
-            string[] sNumbers = sFileNumbers.Split(',');
-            foreach (string sNumber in sNumbers)
-            {
-                Int32 iValue = Int32.Parse(sNumber.Trim());
-                alFiles.Add(MakeFileName(sFileName, iValue));
-            }
-
-            return alFiles;
-        }
-
-        /// <summary>
-        /// Tests that the current backup index is correctly detected
-        /// for a file with no extension
-        /// </summary>
-        [Test]
-        public void TestInitializeRollBackups2()
-        {
-            VerifyInitializeRollBackupsFromBaseFile("LogFile");
-        }
-
-        /// <summary>
-        /// Tests that the current backup index is correctly detected
-        /// for a file with a .log extension
-        /// </summary>
-        [Test]
-        public void TestInitializeRollBackups3()
-        {
-            VerifyInitializeRollBackupsFromBaseFile("LogFile.log");
-        }
-
-        /// <summary>
-        /// Makes sure that the initialization can detect the backup
-        /// number correctly.
-        /// </summary>
-        /// <param name="iBackups"></param>
-        /// <param name="iMaxSizeRollBackups"></param>
-        public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups)
-        {
-            string sBaseFile = "LogFile.log";
-            ArrayList arrFiles = new ArrayList();
-            arrFiles.Add("junk1");
-            for (int i = 0; i < iBackups; i++)
-            {
-                arrFiles.Add(MakeFileName(sBaseFile, i));
-            }
-
-            RollingFileAppender rfa = new RollingFileAppender();
-            rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
-            SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups);
-            SetFieldCurSizeRollBackups(rfa, 0);
-            InitializeRollBackups(rfa, sBaseFile, arrFiles);
-
-            // iBackups	/ Meaning
-            // 0 = none
-            // 1 = file.log
-            // 2 = file.log.1
-            // 3 = file.log.2
-            if (0 == iBackups ||
-                1 == iBackups)
-            {
-                Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa));
-            }
-            else
-            {
-                Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa));
-            }
-        }
-
-        /// <summary>
-        /// Tests that the current backup index is correctly detected,
-        /// and gets no bigger than the max backups setting
-        /// </summary>
-        [Test]
-        public void TestInitializeRollBackups4()
-        {
-            const int iMaxRollBackups = 5;
-            VerifyInitializeRollBackups(0, iMaxRollBackups);
-            VerifyInitializeRollBackups(1, iMaxRollBackups);
-            VerifyInitializeRollBackups(2, iMaxRollBackups);
-            VerifyInitializeRollBackups(3, iMaxRollBackups);
-            VerifyInitializeRollBackups(4, iMaxRollBackups);
-            VerifyInitializeRollBackups(5, iMaxRollBackups);
-            VerifyInitializeRollBackups(6, iMaxRollBackups);
-            // Final we cap out at the max value
-            VerifyInitializeRollBackups(7, iMaxRollBackups);
-            VerifyInitializeRollBackups(8, iMaxRollBackups);
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Test,
-         Ignore("Not Implemented: Want to test counted files limited up, to see that others are ?? ignored? deleted?")]
-        public void TestInitialization3()
-        {
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Test,
-         Ignore(
-             "Not Implemented: Want to test counted files limited down, to see that others are ?? ignored? deleted?")]
-        public void TestInitialization4()
-        {
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Test,
-         Ignore("Not Implemented: Want to test dated files with a limit, to see that others are ?? ignored? deleted?")]
-        public void TestInitialization5()
-        {
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Test,
-         Ignore("Not Implemented: Want to test dated files with no limit, to see that others are ?? ignored? deleted?")]
-        public void TestInitialization6()
-        {
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Test,
-         Ignore(
-             "Not Implemented: Want to test dated files with mixed dates existing, to see that other dates do not matter")]
-        public void TestInitialization7()
-        {
-        }
-
-
-        //
-        // Helper functions to dig into the appender
-        //
-
-        private static ArrayList GetExistingFiles(string baseFilePath)
-        {
-            return GetExistingFiles(baseFilePath, false);
-        }
-
-        private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension)
-        {
-            RollingFileAppender appender = new RollingFileAppender();
-            appender.PreserveLogFileNameExtension = preserveLogFileNameExtension;
-            appender.SecurityContext = NullSecurityContext.Instance;
-
-            return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath);
-        }
-
-        private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles)
-        {
-            Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles);
-        }
-
-        private static int GetFieldCurSizeRollBackups(RollingFileAppender appender)
-        {
-            return (int)Utils.GetField(appender, "m_curSizeRollBackups");
-        }
-
-        private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val)
-        {
-            Utils.SetField(appender, "m_curSizeRollBackups", val);
-        }
-
-        private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val)
-        {
-            Utils.SetField(appender, "m_maxSizeRollBackups", val);
-        }
-
-        private static string GetTestMessage()
-        {
-            switch (Environment.NewLine.Length)
-            {
-                case 2:
-                    return c_testMessage98Chars;
-
-                case 1:
-                    return c_testMessage99Chars;
-
-                default:
-                    throw new Exception("Unexpected Environment.NewLine.Length");
-            }
-        }
-    }
-
-    [TestFixture]
-    public class RollingFileAppenderSubClassTest : RollingFileAppender
+    /// <summary>
+    /// Verify that the default LockModel is ExclusiveLock, to maintain backwards compatibility with previous behaviour
+    /// </summary>
+    [Test]
+    public void TestDefaultLockingModel()
     {
-        [Test]
-        public void TestComputeCheckPeriod()
-        {
-            RollingFileAppender rfa = new RollingFileAppender();
+      string filename = "test_default.log";
 
-            Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"),
-                "TopOfMinute pattern");
-            Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern");
-            Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern");
-            Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern");
-            Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern");
+      SilentErrorHandler sh = new SilentErrorHandler();
+      ILogger log = CreateLogger(filename, null, sh);
 
-            // Test invalid roll point
-            Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern");
-        }
+      IAppender[] appenders = log.Repository.GetAppenders();
+      Assert.AreEqual(1, appenders.Length, "The wrong number of appenders are configured");
 
-        private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern)
-        {
-            return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern);
-        }
+      RollingFileAppender rfa = (RollingFileAppender)(appenders[0]);
+      Assert.AreEqual(typeof(log4net.Appender.FileAppender.ExclusiveLock), rfa.LockingModel.GetType(),
+          "The LockingModel is of an unexpected type");
+
+      DestroyLogger();
     }
+
+    /// <summary>
+    /// Tests the count up case, with infinite max backups , to see that
+    /// initialization of the rolling file appender results in the expected value
+    /// </summary>
+    /// <param name="alFiles"></param>
+    /// <param name="sBaseFile"></param>
+    /// <param name="iExpectedValue"></param>
+    private static void VerifyInitializeUpInfiniteExpectedValue(ArrayList alFiles,
+        string sBaseFile,
+        int iExpectedValue)
+    {
+      InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("-1,0,1"), iExpectedValue);
+    }
+
+
+    /// <summary>
+    /// Tests the count down case, with max backups limited to 3, to see that
+    /// initialization of the rolling file appender results in the expected value
+    /// </summary>
+    /// <param name="alFiles"></param>
+    /// <param name="sBaseFile"></param>
+    /// <param name="iExpectedValue"></param>
+    private static void VerifyInitializeDownFixedExpectedValue(ArrayList alFiles,
+        string sBaseFile,
+        int iExpectedValue)
+    {
+      InitializeAndVerifyExpectedValue(alFiles, sBaseFile, CreateRollingFileAppender("3,0,-1"), iExpectedValue);
+    }
+
+    /// <summary>
+    /// Turns a string of comma separated numbers into a collection of filenames
+    /// generated from the numbers.  
+    /// 
+    /// Defaults to filename in _fileName variable.
+    /// 
+    /// </summary>
+    /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
+    /// <returns></returns>
+    private static ArrayList MakeTestDataFromString(string sFileNumbers)
+    {
+      return MakeTestDataFromString(c_fileName, sFileNumbers);
+    }
+
+    /// <summary>
+    /// Turns a string of comma separated numbers into a collection of filenames
+    /// generated from the numbers
+    /// 
+    /// Uses the input filename.
+    /// </summary>
+    /// <param name="sFileName">Name of file to combine with numbers when generating counted file names</param>
+    /// <param name="sFileNumbers">Comma separated list of numbers for counted file names</param>
+    /// <returns></returns>
+    private static ArrayList MakeTestDataFromString(string sFileName, string sFileNumbers)
+    {
+      ArrayList alFiles = new ArrayList();
+
+      string[] sNumbers = sFileNumbers.Split(',');
+      foreach (string sNumber in sNumbers)
+      {
+        Int32 iValue = Int32.Parse(sNumber.Trim());
+        alFiles.Add(MakeFileName(sFileName, iValue));
+      }
+
+      return alFiles;
+    }
+
+    /// <summary>
+    /// Tests that the current backup index is correctly detected
+    /// for a file with no extension
+    /// </summary>
+    [Test]
+    public void TestInitializeRollBackups2()
+    {
+      VerifyInitializeRollBackupsFromBaseFile("LogFile");
+    }
+
+    /// <summary>
+    /// Tests that the current backup index is correctly detected
+    /// for a file with a .log extension
+    /// </summary>
+    [Test]
+    public void TestInitializeRollBackups3()
+    {
+      VerifyInitializeRollBackupsFromBaseFile("LogFile.log");
+    }
+
+    /// <summary>
+    /// Makes sure that the initialization can detect the backup
+    /// number correctly.
+    /// </summary>
+    /// <param name="iBackups"></param>
+    /// <param name="iMaxSizeRollBackups"></param>
+    public void VerifyInitializeRollBackups(int iBackups, int iMaxSizeRollBackups)
+    {
+      string sBaseFile = "LogFile.log";
+      ArrayList arrFiles = new ArrayList();
+      arrFiles.Add("junk1");
+      for (int i = 0; i < iBackups; i++)
+      {
+        arrFiles.Add(MakeFileName(sBaseFile, i));
+      }
+
+      RollingFileAppender rfa = new RollingFileAppender();
+      rfa.RollingStyle = RollingFileAppender.RollingMode.Size;
+      SetFieldMaxSizeRollBackups(rfa, iMaxSizeRollBackups);
+      SetFieldCurSizeRollBackups(rfa, 0);
+      InitializeRollBackups(rfa, sBaseFile, arrFiles);
+
+      // iBackups  / Meaning
+      // 0 = none
+      // 1 = file.log
+      // 2 = file.log.1
+      // 3 = file.log.2
+      if (0 == iBackups ||
+          1 == iBackups)
+      {
+        Assert.AreEqual(0, GetFieldCurSizeRollBackups(rfa));
+      }
+      else
+      {
+        Assert.AreEqual(Math.Min(iBackups - 1, iMaxSizeRollBackups), GetFieldCurSizeRollBackups(rfa));
+      }
+    }
+
+    /// <summary>
+    /// Tests that the current backup index is correctly detected,
+    /// and gets no bigger than the max backups setting
+    /// </summary>
+    [Test]
+    public void TestInitializeRollBackups4()
+    {
+      const int iMaxRollBackups = 5;
+      VerifyInitializeRollBackups(0, iMaxRollBackups);
+      VerifyInitializeRollBackups(1, iMaxRollBackups);
+      VerifyInitializeRollBackups(2, iMaxRollBackups);
+      VerifyInitializeRollBackups(3, iMaxRollBackups);
+      VerifyInitializeRollBackups(4, iMaxRollBackups);
+      VerifyInitializeRollBackups(5, iMaxRollBackups);
+      VerifyInitializeRollBackups(6, iMaxRollBackups);
+      // Final we cap out at the max value
+      VerifyInitializeRollBackups(7, iMaxRollBackups);
+      VerifyInitializeRollBackups(8, iMaxRollBackups);
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [Test,
+     Ignore("Not Implemented: Want to test counted files limited up, to see that others are ?? ignored? deleted?")]
+    public void TestInitialization3()
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [Test,
+     Ignore(
+         "Not Implemented: Want to test counted files limited down, to see that others are ?? ignored? deleted?")]
+    public void TestInitialization4()
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [Test,
+     Ignore("Not Implemented: Want to test dated files with a limit, to see that others are ?? ignored? deleted?")]
+    public void TestInitialization5()
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [Test,
+     Ignore("Not Implemented: Want to test dated files with no limit, to see that others are ?? ignored? deleted?")]
+    public void TestInitialization6()
+    {
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    [Test,
+     Ignore(
+         "Not Implemented: Want to test dated files with mixed dates existing, to see that other dates do not matter")]
+    public void TestInitialization7()
+    {
+    }
+
+
+    //
+    // Helper functions to dig into the appender
+    //
+
+    private static ArrayList GetExistingFiles(string baseFilePath)
+    {
+      return GetExistingFiles(baseFilePath, false);
+    }
+
+    private static ArrayList GetExistingFiles(string baseFilePath, bool preserveLogFileNameExtension)
+    {
+      RollingFileAppender appender = new RollingFileAppender();
+      appender.PreserveLogFileNameExtension = preserveLogFileNameExtension;
+      appender.SecurityContext = NullSecurityContext.Instance;
+
+      return (ArrayList)Utils.InvokeMethod(appender, "GetExistingFiles", baseFilePath);
+    }
+
+    private static void InitializeRollBackups(RollingFileAppender appender, string baseFile, ArrayList arrayFiles)
+    {
+      Utils.InvokeMethod(appender, "InitializeRollBackups", baseFile, arrayFiles);
+    }
+
+    private static int GetFieldCurSizeRollBackups(RollingFileAppender appender)
+    {
+      return (int)Utils.GetField(appender, "m_curSizeRollBackups");
+    }
+
+    private static void SetFieldCurSizeRollBackups(RollingFileAppender appender, int val)
+    {
+      Utils.SetField(appender, "m_curSizeRollBackups", val);
+    }
+
+    private static void SetFieldMaxSizeRollBackups(RollingFileAppender appender, int val)
+    {
+      Utils.SetField(appender, "m_maxSizeRollBackups", val);
+    }
+
+    private static string GetTestMessage()
+    {
+      switch (Environment.NewLine.Length)
+      {
+        case 2:
+          return c_testMessage98Chars;
+
+        case 1:
+          return c_testMessage99Chars;
+
+        default:
+          throw new Exception("Unexpected Environment.NewLine.Length");
+      }
+    }
+  }
+
+  [TestFixture]
+  public class RollingFileAppenderSubClassTest : RollingFileAppender
+  {
+    [Test]
+    public void TestComputeCheckPeriod()
+    {
+      RollingFileAppender rfa = new RollingFileAppender();
+
+      Assert.AreEqual(RollPoint.TopOfMinute, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH:mm"),
+          "TopOfMinute pattern");
+      Assert.AreEqual(RollPoint.TopOfHour, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd HH"), "TopOfHour pattern");
+      Assert.AreEqual(RollPoint.HalfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd tt"), "HalfDay pattern");
+      Assert.AreEqual(RollPoint.TopOfDay, InvokeComputeCheckPeriod(rfa, ".yyyy-MM-dd"), "TopOfDay pattern");
+      Assert.AreEqual(RollPoint.TopOfMonth, InvokeComputeCheckPeriod(rfa, ".yyyy-MM"), "TopOfMonth pattern");
+
+      // Test invalid roll point
+      Assert.AreEqual(RollPoint.InvalidRollPoint, InvokeComputeCheckPeriod(rfa, "..."), "TopOfMonth pattern");
+    }
+
+    private static RollPoint InvokeComputeCheckPeriod(RollingFileAppender rollingFileAppender, string datePattern)
+    {
+      return (RollPoint)Utils.InvokeMethod(rollingFileAppender, "ComputeCheckPeriod", datePattern);
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/SmtpPickupDirAppenderTest.cs b/src/log4net.Tests/Appender/SmtpPickupDirAppenderTest.cs
index 6fbb082..6ebc75a 100644
--- a/src/log4net.Tests/Appender/SmtpPickupDirAppenderTest.cs
+++ b/src/log4net.Tests/Appender/SmtpPickupDirAppenderTest.cs
@@ -31,219 +31,219 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="SmtpPickupDirAppender"/> class.
-	/// </summary>
-	[TestFixture]
-	public class SmtpPickupDirAppenderTest
-	{
-		private readonly string _testPickupDir;
+  /// <summary>
+  /// Used for internal unit testing the <see cref="SmtpPickupDirAppender"/> class.
+  /// </summary>
+  [TestFixture]
+  public class SmtpPickupDirAppenderTest
+  {
+    private readonly string _testPickupDir;
 
-		private class SilentErrorHandler : IErrorHandler
-		{
-			private StringBuilder m_buffer = new StringBuilder();
+    private class SilentErrorHandler : IErrorHandler
+    {
+      private StringBuilder m_buffer = new StringBuilder();
 
-			public string Message
-			{
-				get { return m_buffer.ToString(); }
-			}
+      public string Message
+      {
+        get { return m_buffer.ToString(); }
+      }
 
-			public void Error(string message)
-			{
-				m_buffer.Append(message + "\n");
-			}
+      public void Error(string message)
+      {
+        m_buffer.Append(message + "\n");
+      }
 
-			public void Error(string message, Exception e)
-			{
-				m_buffer.Append(message + "\n" + e.Message + "\n");
-			}
+      public void Error(string message, Exception e)
+      {
+        m_buffer.Append(message + "\n" + e.Message + "\n");
+      }
 
-			public void Error(string message, Exception e, ErrorCode errorCode)
-			{
-				m_buffer.Append(message + "\n" + e.Message + "\n");
-			}
-		}
+      public void Error(string message, Exception e, ErrorCode errorCode)
+      {
+        m_buffer.Append(message + "\n" + e.Message + "\n");
+      }
+    }
 
-		public SmtpPickupDirAppenderTest()
-		{
-			_testPickupDir = Path.Combine(Directory.GetCurrentDirectory(), "SmtpPickupDirAppenderTest_PickupDir");
-		}
-		/// <summary>
-		/// Sets up variables used for the tests
-		/// </summary>
-		private void InitializePickupDir()
-		{
-			Directory.CreateDirectory(_testPickupDir);
-		}
+    public SmtpPickupDirAppenderTest()
+    {
+      _testPickupDir = Path.Combine(Directory.GetCurrentDirectory(), "SmtpPickupDirAppenderTest_PickupDir");
+    }
+    /// <summary>
+    /// Sets up variables used for the tests
+    /// </summary>
+    private void InitializePickupDir()
+    {
+      Directory.CreateDirectory(_testPickupDir);
+    }
 
-		/// <summary>
-		/// Shuts down any loggers in the hierarchy, along
-		/// with all appenders, and deletes any test files used
-		/// for logging.
-		/// </summary>
-		private void ResetLogger()
-		{
-			// Regular users should not use the clear method lightly!
-			Utils.GetRepository().ResetConfiguration();
-			Utils.GetRepository().Shutdown();
-			((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
-		}
+    /// <summary>
+    /// Shuts down any loggers in the hierarchy, along
+    /// with all appenders, and deletes any test files used
+    /// for logging.
+    /// </summary>
+    private void ResetLogger()
+    {
+      // Regular users should not use the clear method lightly!
+      Utils.GetRepository().ResetConfiguration();
+      Utils.GetRepository().Shutdown();
+      ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
+    }
 
-		/// <summary>
-		/// Any initialization that happens before each test can
-		/// go here
-		/// </summary>
-		[SetUp]
-		public void SetUp()
-		{
-			ResetLogger();
-			DeleteTestFiles();
-			InitializePickupDir();
-		}
+    /// <summary>
+    /// Any initialization that happens before each test can
+    /// go here
+    /// </summary>
+    [SetUp]
+    public void SetUp()
+    {
+      ResetLogger();
+      DeleteTestFiles();
+      InitializePickupDir();
+    }
 
-		/// <summary>
-		/// Any steps that happen after each test go here
-		/// </summary>
-		[TearDown]
-		public void TearDown()
-		{
-			ResetLogger();
-			DeleteTestFiles();
-		}
+    /// <summary>
+    /// Any steps that happen after each test go here
+    /// </summary>
+    [TearDown]
+    public void TearDown()
+    {
+      ResetLogger();
+      DeleteTestFiles();
+    }
 
-		/// <summary>
-		/// Removes all test files that exist
-		/// </summary>
-		private void DeleteTestFiles()
-		{
-			if (Directory.Exists(_testPickupDir))
-			{
-				Directory.Delete(_testPickupDir, true);
-			}
-		}
+    /// <summary>
+    /// Removes all test files that exist
+    /// </summary>
+    private void DeleteTestFiles()
+    {
+      if (Directory.Exists(_testPickupDir))
+      {
+        Directory.Delete(_testPickupDir, true);
+      }
+    }
 
-		/// <summary>
-		/// Creates a logger hierarchy, configures a SMTP pickup dir appender and returns an ILogger
-		/// </summary>
-		/// <param name="appender">The appender to use</param>
-		/// <returns>A configured ILogger</returns>
-		private ILogger CreateLogger(SmtpPickupDirAppender appender)
-		{
-			Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository");
+    /// <summary>
+    /// Creates a logger hierarchy, configures a SMTP pickup dir appender and returns an ILogger
+    /// </summary>
+    /// <param name="appender">The appender to use</param>
+    /// <returns>A configured ILogger</returns>
+    private ILogger CreateLogger(SmtpPickupDirAppender appender)
+    {
+      Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.CreateRepository("TestRepository");
 
-			PatternLayout layout = new PatternLayout();
-			layout.ConversionPattern = "%m%n";
-			layout.ActivateOptions();
+      PatternLayout layout = new PatternLayout();
+      layout.ConversionPattern = "%m%n";
+      layout.ActivateOptions();
 
-			appender.Layout = layout;
-			appender.ActivateOptions();
+      appender.Layout = layout;
+      appender.ActivateOptions();
 
-			h.Root.AddAppender(appender);
-			h.Configured = true;
+      h.Root.AddAppender(appender);
+      h.Configured = true;
 
-			ILogger log = h.GetLogger("Logger");
-			return log;
-		}
+      ILogger log = h.GetLogger("Logger");
+      return log;
+    }
 
-		/// <summary>
-		/// Create an appender to use for the logger
-		/// </summary>
-		/// <param name="handler">The error handler to use.</param>
-		/// <returns></returns>
-		private SmtpPickupDirAppender CreateSmtpPickupDirAppender(IErrorHandler handler)
-		{
-			SmtpPickupDirAppender appender = new SmtpPickupDirAppender();
-			appender.PickupDir = _testPickupDir;
-			appender.ErrorHandler = handler;
-			return appender;
-		}
+    /// <summary>
+    /// Create an appender to use for the logger
+    /// </summary>
+    /// <param name="handler">The error handler to use.</param>
+    /// <returns></returns>
+    private SmtpPickupDirAppender CreateSmtpPickupDirAppender(IErrorHandler handler)
+    {
+      SmtpPickupDirAppender appender = new SmtpPickupDirAppender();
+      appender.PickupDir = _testPickupDir;
+      appender.ErrorHandler = handler;
+      return appender;
+    }
 
-		/// <summary>
-		/// Destroys the logger hierarchy created by <see cref="SmtpPickupDirAppenderTest.CreateLogger"/>
-		/// </summary>
-		private static void DestroyLogger()
-		{
-			Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository");
-			h.ResetConfiguration();
-			//Replace the repository selector so that we can recreate the hierarchy with the same name if necessary
-			LoggerManager.RepositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
-		}
+    /// <summary>
+    /// Destroys the logger hierarchy created by <see cref="SmtpPickupDirAppenderTest.CreateLogger"/>
+    /// </summary>
+    private static void DestroyLogger()
+    {
+      Repository.Hierarchy.Hierarchy h = (Repository.Hierarchy.Hierarchy)LogManager.GetRepository("TestRepository");
+      h.ResetConfiguration();
+      //Replace the repository selector so that we can recreate the hierarchy with the same name if necessary
+      LoggerManager.RepositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
+    }
 
-		/// <summary>
-		/// Tests if the sent message contained the date header.
-		/// </summary>
-		[Test]
-		public void TestOutputContainsSentDate()
-		{
-			SilentErrorHandler sh = new SilentErrorHandler();
-			SmtpPickupDirAppender appender = CreateSmtpPickupDirAppender(sh);
-			ILogger log = CreateLogger(appender);
-			log.Log(GetType(), Level.Info, "This is a message", null);
-			log.Log(GetType(), Level.Info, "This is a message 2", null);
-			DestroyLogger();
+    /// <summary>
+    /// Tests if the sent message contained the date header.
+    /// </summary>
+    [Test]
+    public void TestOutputContainsSentDate()
+    {
+      SilentErrorHandler sh = new SilentErrorHandler();
+      SmtpPickupDirAppender appender = CreateSmtpPickupDirAppender(sh);
+      ILogger log = CreateLogger(appender);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-			Assert.AreEqual(1, Directory.GetFiles(_testPickupDir).Length);
-			string[] fileContent = File.ReadAllLines((Directory.GetFiles(_testPickupDir)[0]));
-			bool hasDateHeader = false;
-			const string dateHeaderStart = "Date: ";
-			foreach (string line in fileContent)
-			{
-				if(line.StartsWith(dateHeaderStart))
-				{
-					string datePart = line.Substring(dateHeaderStart.Length);
-					DateTime date = DateTime.ParseExact(datePart, "r", System.Globalization.CultureInfo.InvariantCulture);
-					double diff = Math.Abs( (DateTime.UtcNow - date).TotalMilliseconds);
-					Assert.LessOrEqual(diff, 1000, "Times should be equal, allowing a diff of one second to make test robust");
-					hasDateHeader = true;
-				}
-			}
-			Assert.IsTrue(hasDateHeader, "Output must contains a date header");
+      Assert.AreEqual(1, Directory.GetFiles(_testPickupDir).Length);
+      string[] fileContent = File.ReadAllLines((Directory.GetFiles(_testPickupDir)[0]));
+      bool hasDateHeader = false;
+      const string dateHeaderStart = "Date: ";
+      foreach (string line in fileContent)
+      {
+        if (line.StartsWith(dateHeaderStart))
+        {
+          string datePart = line.Substring(dateHeaderStart.Length);
+          DateTime date = DateTime.ParseExact(datePart, "r", System.Globalization.CultureInfo.InvariantCulture);
+          double diff = Math.Abs((DateTime.UtcNow - date).TotalMilliseconds);
+          Assert.LessOrEqual(diff, 1000, "Times should be equal, allowing a diff of one second to make test robust");
+          hasDateHeader = true;
+        }
+      }
+      Assert.IsTrue(hasDateHeader, "Output must contains a date header");
 
-			Assert.AreEqual("", sh.Message, "Unexpected error message");
-		}
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
 
-		/// <summary>
-		/// Verifies that file extension is applied to output file name.
-		/// </summary>
-		[Test]
-		public void TestConfigurableFileExtension()
-		{
-			const string fileExtension = "eml";
-			SilentErrorHandler sh = new SilentErrorHandler();
-			SmtpPickupDirAppender appender = CreateSmtpPickupDirAppender(sh);
-			appender.FileExtension = fileExtension;
-			ILogger log = CreateLogger(appender);
-			log.Log(GetType(), Level.Info, "This is a message", null);
-			log.Log(GetType(), Level.Info, "This is a message 2", null);
-			DestroyLogger();
+    /// <summary>
+    /// Verifies that file extension is applied to output file name.
+    /// </summary>
+    [Test]
+    public void TestConfigurableFileExtension()
+    {
+      const string fileExtension = "eml";
+      SilentErrorHandler sh = new SilentErrorHandler();
+      SmtpPickupDirAppender appender = CreateSmtpPickupDirAppender(sh);
+      appender.FileExtension = fileExtension;
+      ILogger log = CreateLogger(appender);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-			Assert.AreEqual(1, Directory.GetFiles(_testPickupDir).Length);
-			FileInfo fileInfo = new FileInfo(Directory.GetFiles(_testPickupDir)[0]);
-			Assert.AreEqual("." + fileExtension, fileInfo.Extension);
-			Assert.DoesNotThrow(delegate { new Guid(fileInfo.Name.Substring(0, fileInfo.Name.Length - fileInfo.Extension.Length)); }); // Assert that filename before extension is a guid
+      Assert.AreEqual(1, Directory.GetFiles(_testPickupDir).Length);
+      FileInfo fileInfo = new FileInfo(Directory.GetFiles(_testPickupDir)[0]);
+      Assert.AreEqual("." + fileExtension, fileInfo.Extension);
+      Assert.DoesNotThrow(delegate { new Guid(fileInfo.Name.Substring(0, fileInfo.Name.Length - fileInfo.Extension.Length)); }); // Assert that filename before extension is a guid
 
-			Assert.AreEqual("", sh.Message, "Unexpected error message");
-		}
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
 
-		/// <summary>
-		/// Verifies that logging a message actually produces output
-		/// </summary>
-		[Test]
-		public void TestDefaultFileNameIsAGuid()
-		{
-			SilentErrorHandler sh = new SilentErrorHandler();
-			SmtpPickupDirAppender appender = CreateSmtpPickupDirAppender(sh);
-			ILogger log = CreateLogger(appender);
-			log.Log(GetType(), Level.Info, "This is a message", null);
-			log.Log(GetType(), Level.Info, "This is a message 2", null);
-			DestroyLogger();
+    /// <summary>
+    /// Verifies that logging a message actually produces output
+    /// </summary>
+    [Test]
+    public void TestDefaultFileNameIsAGuid()
+    {
+      SilentErrorHandler sh = new SilentErrorHandler();
+      SmtpPickupDirAppender appender = CreateSmtpPickupDirAppender(sh);
+      ILogger log = CreateLogger(appender);
+      log.Log(GetType(), Level.Info, "This is a message", null);
+      log.Log(GetType(), Level.Info, "This is a message 2", null);
+      DestroyLogger();
 
-			Assert.AreEqual(1, Directory.GetFiles(_testPickupDir).Length);
-			FileInfo fileInfo = new FileInfo(Directory.GetFiles(_testPickupDir)[0]);
-			Assert.IsEmpty(fileInfo.Extension);
-			Assert.DoesNotThrow(delegate { new Guid(fileInfo.Name); }); // Assert that filename is a guid
+      Assert.AreEqual(1, Directory.GetFiles(_testPickupDir).Length);
+      FileInfo fileInfo = new FileInfo(Directory.GetFiles(_testPickupDir)[0]);
+      Assert.IsEmpty(fileInfo.Extension);
+      Assert.DoesNotThrow(delegate { new Guid(fileInfo.Name); }); // Assert that filename is a guid
 
-			Assert.AreEqual("", sh.Message, "Unexpected error message");
-		}
-	}
+      Assert.AreEqual("", sh.Message, "Unexpected error message");
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/StringAppender.cs b/src/log4net.Tests/Appender/StringAppender.cs
index 977099c..83602f8 100644
--- a/src/log4net.Tests/Appender/StringAppender.cs
+++ b/src/log4net.Tests/Appender/StringAppender.cs
@@ -24,53 +24,53 @@
 
 namespace log4net.Tests.Appender
 {
-	/// <summary>
-	/// Write events to a string
-	/// </summary>
-	/// <author>Nicko Cadell</author>
-	public class StringAppender : AppenderSkeleton
-	{
-		private StringBuilder m_buf = new StringBuilder();
+  /// <summary>
+  /// Write events to a string
+  /// </summary>
+  /// <author>Nicko Cadell</author>
+  public class StringAppender : AppenderSkeleton
+  {
+    private StringBuilder m_buf = new StringBuilder();
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="StringAppender" /> class.
-		/// </summary>
-		public StringAppender()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="StringAppender" /> class.
+    /// </summary>
+    public StringAppender()
+    {
+    }
 
-		/// <summary>
-		/// Get the string logged so far
-		/// </summary>
-		/// <returns></returns>
-		public string GetString()
-		{
-			return m_buf.ToString();
-		}
+    /// <summary>
+    /// Get the string logged so far
+    /// </summary>
+    /// <returns></returns>
+    public string GetString()
+    {
+      return m_buf.ToString();
+    }
 
-		/// <summary>
-		/// Reset the string
-		/// </summary>
-		public void Reset()
-		{
-			m_buf.Length = 0;
-		}
+    /// <summary>
+    /// Reset the string
+    /// </summary>
+    public void Reset()
+    {
+      m_buf.Length = 0;
+    }
 
-		/// <summary>
-		/// </summary>
-		/// <param name="loggingEvent">the event to log</param>
-		protected override void Append(LoggingEvent loggingEvent)
-		{
-			m_buf.Append(RenderLoggingEvent(loggingEvent));
-		}
+    /// <summary>
+    /// </summary>
+    /// <param name="loggingEvent">the event to log</param>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      m_buf.Append(RenderLoggingEvent(loggingEvent));
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
-	}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Appender/TraceAppenderTest.cs b/src/log4net.Tests/Appender/TraceAppenderTest.cs
index 21e8fbd..a164f74 100644
--- a/src/log4net.Tests/Appender/TraceAppenderTest.cs
+++ b/src/log4net.Tests/Appender/TraceAppenderTest.cs
@@ -29,84 +29,84 @@
 
 namespace log4net.Tests.Appender
 {
-    [TestFixture]
-    public class TraceAppenderTest
+  [TestFixture]
+  public class TraceAppenderTest
+  {
+    [Test]
+    public void DefaultCategoryTest()
     {
-        [Test]
-        public void DefaultCategoryTest()
-        {
-            CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
-            Trace.Listeners.Clear();
-            Trace.Listeners.Add(categoryTraceListener);
+      CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
+      Trace.Listeners.Clear();
+      Trace.Listeners.Add(categoryTraceListener);
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 
-            TraceAppender traceAppender = new TraceAppender();
-            traceAppender.Layout = new SimpleLayout();
-            traceAppender.ActivateOptions();
+      TraceAppender traceAppender = new TraceAppender();
+      traceAppender.Layout = new SimpleLayout();
+      traceAppender.ActivateOptions();
 
-            BasicConfigurator.Configure(rep, traceAppender);
+      BasicConfigurator.Configure(rep, traceAppender);
 
-            ILog log = LogManager.GetLogger(rep.Name, GetType());
-            log.Debug("Message");
+      ILog log = LogManager.GetLogger(rep.Name, GetType());
+      log.Debug("Message");
 
-            Assert.AreEqual(
-                GetType().ToString(),
-                categoryTraceListener.Category);
-        }
+      Assert.AreEqual(
+          GetType().ToString(),
+          categoryTraceListener.Category);
+    }
 
 #if !NETSTANDARD1_3 // "LocationInfo can't get method names on NETSTANDARD1_3 due to unavailable stack frame APIs"
-        [Test]
-        public void MethodNameCategoryTest()
-        {
-            CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
-            Trace.Listeners.Clear();
-            Trace.Listeners.Add(categoryTraceListener);
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-
-            TraceAppender traceAppender = new TraceAppender();
-            PatternLayout methodLayout = new PatternLayout("%method");
-            methodLayout.ActivateOptions();
-            traceAppender.Category = methodLayout;
-            traceAppender.Layout = new SimpleLayout();
-            traceAppender.ActivateOptions();
-
-            BasicConfigurator.Configure(rep, traceAppender);
-
-            ILog log = LogManager.GetLogger(rep.Name, GetType());
-            log.Debug("Message");
-
-            Assert.AreEqual(
-                System.Reflection.MethodInfo.GetCurrentMethod().Name,
-                categoryTraceListener.Category);
-        }
-#endif
-    }
-
-    public class CategoryTraceListener : TraceListener
+    [Test]
+    public void MethodNameCategoryTest()
     {
-        private string lastCategory;
+      CategoryTraceListener categoryTraceListener = new CategoryTraceListener();
+      Trace.Listeners.Clear();
+      Trace.Listeners.Add(categoryTraceListener);
 
-        public override void Write(string message)
-        {
-            // empty
-        }
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 
-        public override void WriteLine(string message)
-        {
-            Write(message);
-        }
+      TraceAppender traceAppender = new TraceAppender();
+      PatternLayout methodLayout = new PatternLayout("%method");
+      methodLayout.ActivateOptions();
+      traceAppender.Category = methodLayout;
+      traceAppender.Layout = new SimpleLayout();
+      traceAppender.ActivateOptions();
 
-        public override void Write(string message, string category)
-        {
-            lastCategory = category;
-            base.Write(message, category);
-        }
+      BasicConfigurator.Configure(rep, traceAppender);
 
-        public string Category
-        {
-            get { return lastCategory; }
-        }
+      ILog log = LogManager.GetLogger(rep.Name, GetType());
+      log.Debug("Message");
+
+      Assert.AreEqual(
+          System.Reflection.MethodInfo.GetCurrentMethod().Name,
+          categoryTraceListener.Category);
     }
+#endif
+  }
+
+  public class CategoryTraceListener : TraceListener
+  {
+    private string lastCategory;
+
+    public override void Write(string message)
+    {
+      // empty
+    }
+
+    public override void WriteLine(string message)
+    {
+      Write(message);
+    }
+
+    public override void Write(string message, string category)
+    {
+      lastCategory = category;
+      base.Write(message, category);
+    }
+
+    public string Category
+    {
+      get { return lastCategory; }
+    }
+  }
 }
diff --git a/src/log4net.Tests/Context/LogicalThreadContextTest.cs b/src/log4net.Tests/Context/LogicalThreadContextTest.cs
index 103e00b..ca8a7c1 100644
--- a/src/log4net.Tests/Context/LogicalThreadContextTest.cs
+++ b/src/log4net.Tests/Context/LogicalThreadContextTest.cs
@@ -32,313 +32,313 @@
 
 namespace log4net.Tests.Context
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="LogicalThreadContext"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="LogicalThreadContext"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class LogicalThreadContextTest
-	{
-		[TearDown]
-		public void TearDown()
-		{
-			Utils.RemovePropertyFromAllContexts();
-		}
+  /// <summary>
+  /// Used for internal unit testing the <see cref="LogicalThreadContext"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="LogicalThreadContext"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class LogicalThreadContextTest
+  {
+    [TearDown]
+    public void TearDown()
+    {
+      Utils.RemovePropertyFromAllContexts();
+    }
 
-		[Test]
-		public void TestLogicalThreadPropertiesPatternBasicGetSet()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public void TestLogicalThreadPropertiesPatternBasicGetSet()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogicalThreadPropertiesPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogicalThreadPropertiesPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread properties value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread properties value set");
+      stringAppender.Reset();
 
-			LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = "val1";
+      LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = "val1";
 
-			log1.Info("TestMessage");
-			Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread properties value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread properties value set");
+      stringAppender.Reset();
 
-			LogicalThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
+      LogicalThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread properties value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread properties value removed");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public async Task TestLogicalThreadPropertiesPatternAsyncAwait()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public async Task TestLogicalThreadPropertiesPatternAsyncAwait()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogicalThreadPropertiesPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogicalThreadPropertiesPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
+      stringAppender.Reset();
 
-			string testValueForCurrentContext = "Outer";
-			LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = testValueForCurrentContext;
+      string testValueForCurrentContext = "Outer";
+      LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = testValueForCurrentContext;
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(testValueForCurrentContext, stringAppender.GetString(), "Test logical thread properties value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(testValueForCurrentContext, stringAppender.GetString(), "Test logical thread properties value set");
+      stringAppender.Reset();
 
-			var strings = await Task.WhenAll(Enumerable.Range(0, 10).Select(x => SomeWorkProperties(x.ToString())));
+      var strings = await Task.WhenAll(Enumerable.Range(0, 10).Select(x => SomeWorkProperties(x.ToString())));
 
-			// strings should be ["00AA0BB0", "01AA1BB1", "02AA2BB2", ...]
-			for (int i = 0; i < strings.Length; i++)
-			{
-				Assert.AreEqual(string.Format("{0}{1}AA{1}BB{1}", testValueForCurrentContext, i), strings[i], "Test logical thread properties expected sequence");
-			}
+      // strings should be ["00AA0BB0", "01AA1BB1", "02AA2BB2", ...]
+      for (int i = 0; i < strings.Length; i++)
+      {
+        Assert.AreEqual(string.Format("{0}{1}AA{1}BB{1}", testValueForCurrentContext, i), strings[i], "Test logical thread properties expected sequence");
+      }
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(testValueForCurrentContext, stringAppender.GetString(), "Test logical thread properties value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(testValueForCurrentContext, stringAppender.GetString(), "Test logical thread properties value set");
+      stringAppender.Reset();
 
-			LogicalThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
+      LogicalThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread properties value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread properties value removed");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogicalThreadStackPattern()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public void TestLogicalThreadStackPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
+      stringAppender.Reset();
 
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
-			{
-				log1.Info("TestMessage");
-				Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread stack value set");
-				stringAppender.Reset();
-			}
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread stack value set");
+        stringAppender.Reset();
+      }
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogicalThreadStackPattern2()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public void TestLogicalThreadStackPattern2()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
+      stringAppender.Reset();
 
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
-			{
-				log1.Info("TestMessage");
-				Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread stack value set");
-				stringAppender.Reset();
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread stack value set");
+        stringAppender.Reset();
 
-				using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2"))
-				{
-					log1.Info("TestMessage");
-					Assert.AreEqual("val1 val2", stringAppender.GetString(), "Test logical thread stack value pushed 2nd val");
-					stringAppender.Reset();
-				}
-			}
+        using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2"))
+        {
+          log1.Info("TestMessage");
+          Assert.AreEqual("val1 val2", stringAppender.GetString(), "Test logical thread stack value pushed 2nd val");
+          stringAppender.Reset();
+        }
+      }
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogicalThreadStackPatternNullVal()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public void TestLogicalThreadStackPatternNullVal()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
+      stringAppender.Reset();
 
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
-			{
-				log1.Info("TestMessage");
-				Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value set");
-				stringAppender.Reset();
-			}
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value set");
+        stringAppender.Reset();
+      }
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogicalThreadStackPatternNullVal2()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public void TestLogicalThreadStackPatternNullVal2()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
+      stringAppender.Reset();
 
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
-			{
-				log1.Info("TestMessage");
-				Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread stack value set");
-				stringAppender.Reset();
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual("val1", stringAppender.GetString(), "Test logical thread stack value set");
+        stringAppender.Reset();
 
-				using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
-				{
-					log1.Info("TestMessage");
-					Assert.AreEqual("val1 ", stringAppender.GetString(), "Test logical thread stack value pushed null");
-					stringAppender.Reset();
-				}
-			}
+        using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
+        {
+          log1.Info("TestMessage");
+          Assert.AreEqual("val1 ", stringAppender.GetString(), "Test logical thread stack value pushed null");
+          stringAppender.Reset();
+        }
+      }
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread stack value removed");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public async Task TestLogicalThreadStackPatternAsyncAwait()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    [Test]
+    public async Task TestLogicalThreadStackPatternAsyncAwait()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogicalThreadStackPattern");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogicalThreadStackPattern");
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
-			stringAppender.Reset();
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no logical thread stack value set");
+      stringAppender.Reset();
 
-			string testValueForCurrentContext = "Outer";
-			string[] strings = null;
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(testValueForCurrentContext))
-			{
-				log1.Info("TestMessage");
-				Assert.AreEqual(testValueForCurrentContext, stringAppender.GetString(), "Test logical thread stack value set");
-				stringAppender.Reset();
+      string testValueForCurrentContext = "Outer";
+      string[] strings = null;
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(testValueForCurrentContext))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual(testValueForCurrentContext, stringAppender.GetString(), "Test logical thread stack value set");
+        stringAppender.Reset();
 
-				strings = await Task.WhenAll(Enumerable.Range(0, 10).Select(x => SomeWorkStack(x.ToString())));
-			}
+        strings = await Task.WhenAll(Enumerable.Range(0, 10).Select(x => SomeWorkStack(x.ToString())));
+      }
 
-			// strings should be ["Outer 0 AOuter 0 AOuter 0Outer 0 BOuter 0 B Outer 0", ...]
-			for (int i = 0; i < strings.Length; i++)
-			{
-				Assert.AreEqual(string.Format("{0} {1} A{0} {1} A{0} {1}{0} {1} B{0} {1} B{0} {1}", testValueForCurrentContext, i), strings[i], "Test logical thread properties expected sequence");
-			}
+      // strings should be ["Outer 0 AOuter 0 AOuter 0Outer 0 BOuter 0 B Outer 0", ...]
+      for (int i = 0; i < strings.Length; i++)
+      {
+        Assert.AreEqual(string.Format("{0} {1} A{0} {1} A{0} {1}{0} {1} B{0} {1} B{0} {1}", testValueForCurrentContext, i), strings[i], "Test logical thread properties expected sequence");
+      }
 
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread properties value removed");
-			stringAppender.Reset();
-		}
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test logical thread properties value removed");
+      stringAppender.Reset();
+    }
 
-		static async Task<string> SomeWorkProperties(string propertyName)
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    static async Task<string> SomeWorkProperties(string propertyName)
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log = LogManager.GetLogger(rep.Name, "TestLogicalThreadStackPattern");
-			log.Info("TestMessage");
+      ILog log = LogManager.GetLogger(rep.Name, "TestLogicalThreadStackPattern");
+      log.Info("TestMessage");
 
-			// set a new one
-			LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = propertyName;
-			log.Info("TestMessage");
+      // set a new one
+      LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = propertyName;
+      log.Info("TestMessage");
 
-			await MoreWorkProperties(log, "A");
-			log.Info("TestMessage");
-			await MoreWorkProperties(log, "B");
-			log.Info("TestMessage");
-			return stringAppender.GetString();
-		}
+      await MoreWorkProperties(log, "A");
+      log.Info("TestMessage");
+      await MoreWorkProperties(log, "B");
+      log.Info("TestMessage");
+      return stringAppender.GetString();
+    }
 
-		static async Task MoreWorkProperties(ILog log, string propertyName)
-		{
-			LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = propertyName;
-			log.Info("TestMessage");
-			await Task.Delay(1);
-			log.Info("TestMessage");
-		}
+    static async Task MoreWorkProperties(ILog log, string propertyName)
+    {
+      LogicalThreadContext.Properties[Utils.PROPERTY_KEY] = propertyName;
+      log.Info("TestMessage");
+      await Task.Delay(1);
+      log.Info("TestMessage");
+    }
 
-		static async Task<string> SomeWorkStack(string stackName)
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+    static async Task<string> SomeWorkStack(string stackName)
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log = LogManager.GetLogger(rep.Name, "TestLogicalThreadStackPattern");
+      ILog log = LogManager.GetLogger(rep.Name, "TestLogicalThreadStackPattern");
 
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(stackName))
-			{
-				log.Info("TestMessage");
-				Assert.AreEqual(string.Format("Outer {0}", stackName), stringAppender.GetString(), "Test logical thread stack value set");
-				stringAppender.Reset();
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(stackName))
+      {
+        log.Info("TestMessage");
+        Assert.AreEqual(string.Format("Outer {0}", stackName), stringAppender.GetString(), "Test logical thread stack value set");
+        stringAppender.Reset();
 
-				await MoreWorkStack(log, "A");
-				log.Info("TestMessage");
-				await MoreWorkStack(log, "B");
-				log.Info("TestMessage");
-			}
+        await MoreWorkStack(log, "A");
+        log.Info("TestMessage");
+        await MoreWorkStack(log, "B");
+        log.Info("TestMessage");
+      }
 
-			return stringAppender.GetString();
-		}
+      return stringAppender.GetString();
+    }
 
-		static async Task MoreWorkStack(ILog log, string stackName)
-		{
-			using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(stackName))
-			{
-				log.Info("TestMessage");
-				await Task.Delay(1);
-				log.Info("TestMessage");
-			}
-		}
-	}
+    static async Task MoreWorkStack(ILog log, string stackName)
+    {
+      using (LogicalThreadContext.Stacks[Utils.PROPERTY_KEY].Push(stackName))
+      {
+        log.Info("TestMessage");
+        await Task.Delay(1);
+        log.Info("TestMessage");
+      }
+    }
+  }
 }
 #endif
diff --git a/src/log4net.Tests/Context/ThreadContextTest.cs b/src/log4net.Tests/Context/ThreadContextTest.cs
index 951d32d..b34af13 100644
--- a/src/log4net.Tests/Context/ThreadContextTest.cs
+++ b/src/log4net.Tests/Context/ThreadContextTest.cs
@@ -33,249 +33,249 @@
 
 namespace log4net.Tests.Context
 {
-    /// <summary>
-    /// Used for internal unit testing the <see cref="ThreadContext"/> class.
-    /// </summary>
-    /// <remarks>
-    /// Used for internal unit testing the <see cref="ThreadContext"/> class.
-    /// </remarks>
-    [TestFixture]
-    public class ThreadContextTest
+  /// <summary>
+  /// Used for internal unit testing the <see cref="ThreadContext"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="ThreadContext"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class ThreadContextTest
+  {
+    [TearDown]
+    public void TearDown()
     {
-        [TearDown]
-        public void TearDown()
-        {
-            Utils.RemovePropertyFromAllContexts();
-        }
-
-        [Test]
-        public void TestThreadPropertiesPattern()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread properties value set");
-            stringAppender.Reset();
-
-            ThreadContext.Properties[Utils.PROPERTY_KEY] = "val1";
-
-            log1.Info("TestMessage");
-            Assert.AreEqual("val1", stringAppender.GetString(), "Test thread properties value set");
-            stringAppender.Reset();
-
-            ThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread properties value removed");
-            stringAppender.Reset();
-        }
-
-        [Test]
-        public void TestThreadStackPattern()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
-            stringAppender.Reset();
-
-            using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
-            {
-                log1.Info("TestMessage");
-                Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set");
-                stringAppender.Reset();
-            }
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
-            stringAppender.Reset();
-        }
-
-        [Test]
-        public void TestThreadStackPattern2()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
-            stringAppender.Reset();
-
-            using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
-            {
-                log1.Info("TestMessage");
-                Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set");
-                stringAppender.Reset();
-
-                using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2"))
-                {
-                    log1.Info("TestMessage");
-                    Assert.AreEqual("val1 val2", stringAppender.GetString(), "Test thread stack value pushed 2nd val");
-                    stringAppender.Reset();
-                }
-            }
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
-            stringAppender.Reset();
-        }
-
-        [Test]
-        public void TestThreadStackPatternNullVal()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
-            stringAppender.Reset();
-
-            using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
-            {
-                log1.Info("TestMessage");
-                Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value set");
-                stringAppender.Reset();
-            }
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
-            stringAppender.Reset();
-        }
-
-        [Test]
-        public void TestThreadStackPatternNullVal2()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
-            stringAppender.Reset();
-
-            using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
-            {
-                log1.Info("TestMessage");
-                Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set");
-                stringAppender.Reset();
-
-                using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
-                {
-                    log1.Info("TestMessage");
-                    Assert.AreEqual("val1 ", stringAppender.GetString(), "Test thread stack value pushed null");
-                    stringAppender.Reset();
-                }
-            }
-
-            log1.Info("TestMessage");
-            Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
-            stringAppender.Reset();
-        }
-
-        private static string TestBackgroundThreadContextPropertyRepository;
-
-        [Test]
-        public void TestBackgroundThreadContextProperty()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = new PatternLayout("%property{DateTimeTodayToString}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(TestBackgroundThreadContextPropertyRepository =
-                "TestBackgroundThreadContextPropertyRepository" + Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            Thread thread = new Thread(new ThreadStart(ExecuteBackgroundThread));
-            thread.Start();
-
-            Thread.CurrentThread.Join(2000);
-        }
-
-        private static void ExecuteBackgroundThread()
-        {
-            ILog log = LogManager.GetLogger(TestBackgroundThreadContextPropertyRepository, "ExecuteBackGroundThread");
-            ThreadContext.Properties["DateTimeTodayToString"] = DateTime.Today.ToString();
-
-            log.Info("TestMessage");
-
-            Repository.Hierarchy.Hierarchy hierarchyLoggingRepository =
-                (Repository.Hierarchy.Hierarchy) log.Logger.Repository;
-            StringAppender stringAppender = (StringAppender) hierarchyLoggingRepository.Root.Appenders[0];
-
-            Assert.AreEqual(DateTime.Today.ToString(), stringAppender.GetString());
-        }
-
-        [Test]
-        public void PropertiesShouldBeThreadSafe()
-        {
-            // Arrange
-            var threads = new List<Thread>();
-            var flags = new List<FlagContainer>();
-            
-            // Act
-            for (var i = 0; i < 256; i++)
-            {
-                var t = new Thread(SpinAndCheck);
-                var flag = new FlagContainer();
-                t.Start(flag);
-                flags.Add(flag);
-                threads.Add(t);
-            }
-
-            foreach (var t in threads)
-            {
-                t.Join();
-            }
-
-            // Assert
-            Expect(flags)
-                .To.Contain.All.Matched.By(o => o.Flag == false);
-        }
-
-        public class FlagContainer
-        {
-            public bool Flag { get; set; }
-        }
-
-        private void SpinAndCheck(object obj)
-        {
-            var container = obj as FlagContainer;
-            var threadid = Thread.CurrentThread.ManagedThreadId;
-            for (var i = 0; i < 100000; i++)
-            {
-                ThreadContext.Properties["threadid"] = threadid;
-                Thread.Sleep(0);
-                if ((int) ThreadContext.Properties["threadid"] != threadid)
-                {
-                    container.Flag = true;
-                    break;
-                }
-            }
-        }
+      Utils.RemovePropertyFromAllContexts();
     }
+
+    [Test]
+    public void TestThreadPropertiesPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread properties value set");
+      stringAppender.Reset();
+
+      ThreadContext.Properties[Utils.PROPERTY_KEY] = "val1";
+
+      log1.Info("TestMessage");
+      Assert.AreEqual("val1", stringAppender.GetString(), "Test thread properties value set");
+      stringAppender.Reset();
+
+      ThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread properties value removed");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void TestThreadStackPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
+      stringAppender.Reset();
+
+      using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set");
+        stringAppender.Reset();
+      }
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void TestThreadStackPattern2()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
+      stringAppender.Reset();
+
+      using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set");
+        stringAppender.Reset();
+
+        using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val2"))
+        {
+          log1.Info("TestMessage");
+          Assert.AreEqual("val1 val2", stringAppender.GetString(), "Test thread stack value pushed 2nd val");
+          stringAppender.Reset();
+        }
+      }
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void TestThreadStackPatternNullVal()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
+      stringAppender.Reset();
+
+      using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value set");
+        stringAppender.Reset();
+      }
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void TestThreadStackPatternNullVal2()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadStackPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread stack value set");
+      stringAppender.Reset();
+
+      using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push("val1"))
+      {
+        log1.Info("TestMessage");
+        Assert.AreEqual("val1", stringAppender.GetString(), "Test thread stack value set");
+        stringAppender.Reset();
+
+        using (ThreadContext.Stacks[Utils.PROPERTY_KEY].Push(null))
+        {
+          log1.Info("TestMessage");
+          Assert.AreEqual("val1 ", stringAppender.GetString(), "Test thread stack value pushed null");
+          stringAppender.Reset();
+        }
+      }
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread stack value removed");
+      stringAppender.Reset();
+    }
+
+    private static string TestBackgroundThreadContextPropertyRepository;
+
+    [Test]
+    public void TestBackgroundThreadContextProperty()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%property{DateTimeTodayToString}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(TestBackgroundThreadContextPropertyRepository =
+          "TestBackgroundThreadContextPropertyRepository" + Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      Thread thread = new Thread(new ThreadStart(ExecuteBackgroundThread));
+      thread.Start();
+
+      Thread.CurrentThread.Join(2000);
+    }
+
+    private static void ExecuteBackgroundThread()
+    {
+      ILog log = LogManager.GetLogger(TestBackgroundThreadContextPropertyRepository, "ExecuteBackGroundThread");
+      ThreadContext.Properties["DateTimeTodayToString"] = DateTime.Today.ToString();
+
+      log.Info("TestMessage");
+
+      Repository.Hierarchy.Hierarchy hierarchyLoggingRepository =
+          (Repository.Hierarchy.Hierarchy)log.Logger.Repository;
+      StringAppender stringAppender = (StringAppender)hierarchyLoggingRepository.Root.Appenders[0];
+
+      Assert.AreEqual(DateTime.Today.ToString(), stringAppender.GetString());
+    }
+
+    [Test]
+    public void PropertiesShouldBeThreadSafe()
+    {
+      // Arrange
+      var threads = new List<Thread>();
+      var flags = new List<FlagContainer>();
+
+      // Act
+      for (var i = 0; i < 256; i++)
+      {
+        var t = new Thread(SpinAndCheck);
+        var flag = new FlagContainer();
+        t.Start(flag);
+        flags.Add(flag);
+        threads.Add(t);
+      }
+
+      foreach (var t in threads)
+      {
+        t.Join();
+      }
+
+      // Assert
+      Expect(flags)
+          .To.Contain.All.Matched.By(o => o.Flag == false);
+    }
+
+    public class FlagContainer
+    {
+      public bool Flag { get; set; }
+    }
+
+    private void SpinAndCheck(object obj)
+    {
+      var container = obj as FlagContainer;
+      var threadid = Thread.CurrentThread.ManagedThreadId;
+      for (var i = 0; i < 100000; i++)
+      {
+        ThreadContext.Properties["threadid"] = threadid;
+        Thread.Sleep(0);
+        if ((int)ThreadContext.Properties["threadid"] != threadid)
+        {
+          container.Flag = true;
+          break;
+        }
+      }
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Core/EvaluatorTest.cs b/src/log4net.Tests/Core/EvaluatorTest.cs
index 0dbc5dc..30a31de 100644
--- a/src/log4net.Tests/Core/EvaluatorTest.cs
+++ b/src/log4net.Tests/Core/EvaluatorTest.cs
@@ -27,118 +27,118 @@
 
 namespace log4net.Tests.Core
 {
-	[TestFixture]
-	public class EvaluatorTest
-	{
-		private BufferingForwardingAppender m_bufferingForwardingAppender;
-		private CountingAppender m_countingAppender;
-		private Repository.Hierarchy.Hierarchy m_hierarchy;
+  [TestFixture]
+  public class EvaluatorTest
+  {
+    private BufferingForwardingAppender m_bufferingForwardingAppender;
+    private CountingAppender m_countingAppender;
+    private Repository.Hierarchy.Hierarchy m_hierarchy;
 
-		[SetUp]
-		public void SetupRepository()
-		{
-			m_hierarchy = new Repository.Hierarchy.Hierarchy();
+    [SetUp]
+    public void SetupRepository()
+    {
+      m_hierarchy = new Repository.Hierarchy.Hierarchy();
 
-			m_countingAppender = new CountingAppender();
-			m_countingAppender.ActivateOptions();
+      m_countingAppender = new CountingAppender();
+      m_countingAppender.ActivateOptions();
 
-			m_bufferingForwardingAppender = new BufferingForwardingAppender();
-			m_bufferingForwardingAppender.AddAppender(m_countingAppender);
+      m_bufferingForwardingAppender = new BufferingForwardingAppender();
+      m_bufferingForwardingAppender.AddAppender(m_countingAppender);
 
-			m_bufferingForwardingAppender.BufferSize = 5;
-			m_bufferingForwardingAppender.ClearFilters();
-			m_bufferingForwardingAppender.Fix = FixFlags.Partial;
-			m_bufferingForwardingAppender.Lossy = false;
-			m_bufferingForwardingAppender.LossyEvaluator = null;
-			m_bufferingForwardingAppender.Threshold = Level.All;
-		}
+      m_bufferingForwardingAppender.BufferSize = 5;
+      m_bufferingForwardingAppender.ClearFilters();
+      m_bufferingForwardingAppender.Fix = FixFlags.Partial;
+      m_bufferingForwardingAppender.Lossy = false;
+      m_bufferingForwardingAppender.LossyEvaluator = null;
+      m_bufferingForwardingAppender.Threshold = Level.All;
+    }
 
-		[Test]
-		public void TestLevelEvaluator()
-		{
-			m_bufferingForwardingAppender.Evaluator = new LevelEvaluator(Level.Info);
-			m_bufferingForwardingAppender.ActivateOptions();
-			log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
+    [Test]
+    public void TestLevelEvaluator()
+    {
+      m_bufferingForwardingAppender.Evaluator = new LevelEvaluator(Level.Info);
+      m_bufferingForwardingAppender.ActivateOptions();
+      log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
 
-			ILogger logger = m_hierarchy.GetLogger("TestLevelEvaluator");
+      ILogger logger = m_hierarchy.GetLogger("TestLevelEvaluator");
 
-			logger.Log(typeof(EvaluatorTest), Level.Debug, "Debug message logged", null);
-			logger.Log(typeof(EvaluatorTest), Level.Debug, "Debug message logged", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
+      logger.Log(typeof(EvaluatorTest), Level.Debug, "Debug message logged", null);
+      logger.Log(typeof(EvaluatorTest), Level.Debug, "Debug message logged", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
 
-			logger.Log(typeof(EvaluatorTest), Level.Info, "Info message logged", null);
-			Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 events flushed on Info message.");
-		}
+      logger.Log(typeof(EvaluatorTest), Level.Info, "Info message logged", null);
+      Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 events flushed on Info message.");
+    }
 
 #if !NETSTANDARD1_3
-		[Test]
-		public void TestExceptionEvaluator()
-		{
-			m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(ApplicationException), true);
-			m_bufferingForwardingAppender.ActivateOptions();
-			log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
+    [Test]
+    public void TestExceptionEvaluator()
+    {
+      m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(ApplicationException), true);
+      m_bufferingForwardingAppender.ActivateOptions();
+      log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
 
-			ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluator");
+      ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluator");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
-			Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 events flushed on ApplicationException message.");
-		}
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
+      Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 events flushed on ApplicationException message.");
+    }
 
-		[Test]
-		public void TestExceptionEvaluatorTriggerOnSubClass()
-		{
-			m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(Exception), true);
-			m_bufferingForwardingAppender.ActivateOptions();
-			log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
+    [Test]
+    public void TestExceptionEvaluatorTriggerOnSubClass()
+    {
+      m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(Exception), true);
+      m_bufferingForwardingAppender.ActivateOptions();
+      log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
 
-			ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluatorTriggerOnSubClass");
+      ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluatorTriggerOnSubClass");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
-			Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 events flushed on ApplicationException message.");
-		}
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
+      Assert.AreEqual(3, m_countingAppender.Counter, "Test 3 events flushed on ApplicationException message.");
+    }
 
-		[Test]
-		public void TestExceptionEvaluatorNoTriggerOnSubClass()
-		{
-			m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(Exception), false);
-			m_bufferingForwardingAppender.ActivateOptions();
-			log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
+    [Test]
+    public void TestExceptionEvaluatorNoTriggerOnSubClass()
+    {
+      m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(Exception), false);
+      m_bufferingForwardingAppender.ActivateOptions();
+      log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
 
-			ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluatorNoTriggerOnSubClass");
+      ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluatorNoTriggerOnSubClass");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 events buffered");
-		}
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 events buffered");
+    }
 
-		[Test]
-		public void TestInvalidExceptionEvaluator()
-		{
-			// warning: String is not a subclass of Exception
-			m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(String), false);
-			m_bufferingForwardingAppender.ActivateOptions();
-			log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
+    [Test]
+    public void TestInvalidExceptionEvaluator()
+    {
+      // warning: String is not a subclass of Exception
+      m_bufferingForwardingAppender.Evaluator = new ExceptionEvaluator(typeof(String), false);
+      m_bufferingForwardingAppender.ActivateOptions();
+      log4net.Config.BasicConfigurator.Configure(m_hierarchy, m_bufferingForwardingAppender);
 
-			ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluatorNoTriggerOnSubClass");
+      ILogger logger = m_hierarchy.GetLogger("TestExceptionEvaluatorNoTriggerOnSubClass");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", null);
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 2 events buffered");
 
-			logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
-			Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 events buffered");
-		}
+      logger.Log(typeof(EvaluatorTest), Level.Warn, "Warn message logged", new ApplicationException());
+      Assert.AreEqual(0, m_countingAppender.Counter, "Test 3 events buffered");
+    }
 #endif
-	}
+  }
 }
diff --git a/src/log4net.Tests/Core/FixingTest.cs b/src/log4net.Tests/Core/FixingTest.cs
index d122344..1431ce0 100644
--- a/src/log4net.Tests/Core/FixingTest.cs
+++ b/src/log4net.Tests/Core/FixingTest.cs
@@ -29,145 +29,149 @@
 
 namespace log4net.Tests.Core
 {
-	/// <summary>
-	/// </<summary>
-	[TestFixture]
-	public class FixingTest
-	{
-        const string TEST_REPOSITORY = "Test Repository";
+  /// <summary>
+  /// </<summary>
+  [TestFixture]
+  public class FixingTest
+  {
+    const string TEST_REPOSITORY = "Test Repository";
 
-        [OneTimeSetUp]
-		public void CreateRepository()
-		{
-            bool exists = false;
-            Repository.ILoggerRepository[] repositories = LogManager.GetAllRepositories();
-            if (repositories != null) {
-                foreach (Repository.ILoggerRepository r in repositories) {
-                    if (r.Name == TEST_REPOSITORY) {
-                        exists = true;
-                        break;
-                    }
-                }
-            }
-            if (!exists) {
-                LogManager.CreateRepository(TEST_REPOSITORY);
-            }
+    [OneTimeSetUp]
+    public void CreateRepository()
+    {
+      bool exists = false;
+      Repository.ILoggerRepository[] repositories = LogManager.GetAllRepositories();
+      if (repositories != null)
+      {
+        foreach (Repository.ILoggerRepository r in repositories)
+        {
+          if (r.Name == TEST_REPOSITORY)
+          {
+            exists = true;
+            break;
+          }
+        }
+      }
+      if (!exists)
+      {
+        LogManager.CreateRepository(TEST_REPOSITORY);
+      }
 
-			// write-once
-			if (Thread.CurrentThread.Name == null)
-			{
-				Thread.CurrentThread.Name = "Log4Net Test thread";
-			}
-		}
+      // write-once
+      if (Thread.CurrentThread.Name == null)
+      {
+        Thread.CurrentThread.Name = "Log4Net Test thread";
+      }
+    }
 
-		[Test]
-		public void All_ShouldContainAllFlags()
-		{
-			// Arrange
-			// Act
-			var allFlags = Enum.GetValues(typeof(FixFlags)).Cast<FixFlags>()
-				.Except(new[] { FixFlags.None })
-				.ToArray();
-			// Assert
-			foreach (var flag in allFlags)
-			{
-				Expect(FixFlags.All & flag)
-					.To.Equal(flag, () => $"FixFlags.All does not contain {flag}");
-			}
-		}
+    [Test]
+    public void All_ShouldContainAllFlags()
+    {
+      // Arrange
+      // Act
+      var allFlags = Enum.GetValues(typeof(FixFlags)).Cast<FixFlags>()
+        .Except(new[] { FixFlags.None })
+        .ToArray();
+      // Assert
+      foreach (var flag in allFlags)
+      {
+        Expect(FixFlags.All & flag)
+          .To.Equal(flag, () => $"FixFlags.All does not contain {flag}");
+      }
+    }
 
-		[Test]
-		public void TestUnfixedValues()
-		{
-			LoggingEventData loggingEventData = BuildStandardEventData();
+    [Test]
+    public void TestUnfixedValues()
+    {
+      LoggingEventData loggingEventData = BuildStandardEventData();
 
-			// LoggingEvents occur at distinct points in time
-			LoggingEvent loggingEvent = new LoggingEvent(
-				loggingEventData.LocationInfo.GetType(),
-				LogManager.GetRepository(TEST_REPOSITORY),
-				loggingEventData.LoggerName,
-				loggingEventData.Level,
-				loggingEventData.Message,
-				new Exception("This is the exception"));
+      // LoggingEvents occur at distinct points in time
+      LoggingEvent loggingEvent = new LoggingEvent(
+        loggingEventData.LocationInfo.GetType(),
+        LogManager.GetRepository(TEST_REPOSITORY),
+        loggingEventData.LoggerName,
+        loggingEventData.Level,
+        loggingEventData.Message,
+        new Exception("This is the exception"));
 
-			AssertExpectedLoggingEvent(loggingEvent, loggingEventData);
+      AssertExpectedLoggingEvent(loggingEvent, loggingEventData);
 
-			Assert.AreEqual(FixFlags.None, loggingEvent.Fix, "Fixed Fields is incorrect");
-		}
+      Assert.AreEqual(FixFlags.None, loggingEvent.Fix, "Fixed Fields is incorrect");
+    }
 
-		[Test]
-		public void TestAllFixedValues()
-		{
-			LoggingEventData loggingEventData = BuildStandardEventData();
+    [Test]
+    public void TestAllFixedValues()
+    {
+      LoggingEventData loggingEventData = BuildStandardEventData();
 
-			// LoggingEvents occur at distinct points in time
-			LoggingEvent loggingEvent = new LoggingEvent(
-				loggingEventData.LocationInfo.GetType(),
-				LogManager.GetRepository(TEST_REPOSITORY),
-				loggingEventData.LoggerName,
-				loggingEventData.Level,
-				loggingEventData.Message,
-				new Exception("This is the exception"));
+      // LoggingEvents occur at distinct points in time
+      LoggingEvent loggingEvent = new LoggingEvent(
+        loggingEventData.LocationInfo.GetType(),
+        LogManager.GetRepository(TEST_REPOSITORY),
+        loggingEventData.LoggerName,
+        loggingEventData.Level,
+        loggingEventData.Message,
+        new Exception("This is the exception"));
 
-			AssertExpectedLoggingEvent(loggingEvent, loggingEventData);
+      AssertExpectedLoggingEvent(loggingEvent, loggingEventData);
 
-			loggingEvent.Fix = FixFlags.All;
+      loggingEvent.Fix = FixFlags.All;
 
-			Assert.AreEqual(FixFlags.LocationInfo | FixFlags.UserName | FixFlags.Identity | FixFlags.Partial | FixFlags.Message | FixFlags.ThreadName | FixFlags.Exception | FixFlags.Domain | FixFlags.Properties, loggingEvent.Fix, "Fixed Fields is incorrect");
-		}
+      Assert.AreEqual(FixFlags.LocationInfo | FixFlags.UserName | FixFlags.Identity | FixFlags.Partial | FixFlags.Message | FixFlags.ThreadName | FixFlags.Exception | FixFlags.Domain | FixFlags.Properties, loggingEvent.Fix, "Fixed Fields is incorrect");
+    }
 
-		[Test]
-		public void TestNoFixedValues()
-		{
-			LoggingEventData loggingEventData = BuildStandardEventData();
+    [Test]
+    public void TestNoFixedValues()
+    {
+      LoggingEventData loggingEventData = BuildStandardEventData();
 
-			// LoggingEvents occur at distinct points in time
-			LoggingEvent loggingEvent = new LoggingEvent(
-				loggingEventData.LocationInfo.GetType(),
-				LogManager.GetRepository(TEST_REPOSITORY),
-				loggingEventData.LoggerName,
-				loggingEventData.Level,
-				loggingEventData.Message,
-				new Exception("This is the exception"));
+      // LoggingEvents occur at distinct points in time
+      LoggingEvent loggingEvent = new LoggingEvent(
+        loggingEventData.LocationInfo.GetType(),
+        LogManager.GetRepository(TEST_REPOSITORY),
+        loggingEventData.LoggerName,
+        loggingEventData.Level,
+        loggingEventData.Message,
+        new Exception("This is the exception"));
 
-			AssertExpectedLoggingEvent(loggingEvent, loggingEventData);
+      AssertExpectedLoggingEvent(loggingEvent, loggingEventData);
 
-			loggingEvent.Fix = FixFlags.None;
+      loggingEvent.Fix = FixFlags.None;
 
-			Assert.AreEqual(FixFlags.None, loggingEvent.Fix, "Fixed Fields is incorrect");
-		}
+      Assert.AreEqual(FixFlags.None, loggingEvent.Fix, "Fixed Fields is incorrect");
+    }
 
-		private static LoggingEventData BuildStandardEventData()
-		{
-			LoggingEventData loggingEventData = new LoggingEventData();
-			loggingEventData.LoggerName = typeof(FixingTest).FullName;
-			loggingEventData.Level = Level.Warn;
-			loggingEventData.Message = "Logging event works";
-			loggingEventData.Domain = "ReallySimpleApp";
-			loggingEventData.LocationInfo = new LocationInfo(typeof(FixingTest).Name, "Main", "Class1.cs", "29"); //Completely arbitary
-			loggingEventData.ThreadName = Thread.CurrentThread.Name;
-			loggingEventData.TimeStampUtc = DateTime.UtcNow.Date;
-			loggingEventData.ExceptionString = "Exception occured here";
-			loggingEventData.UserName = "TestUser";
-			return loggingEventData;
-		}
+    private static LoggingEventData BuildStandardEventData()
+    {
+      LoggingEventData loggingEventData = new LoggingEventData();
+      loggingEventData.LoggerName = typeof(FixingTest).FullName;
+      loggingEventData.Level = Level.Warn;
+      loggingEventData.Message = "Logging event works";
+      loggingEventData.Domain = "ReallySimpleApp";
+      loggingEventData.LocationInfo = new LocationInfo(typeof(FixingTest).Name, "Main", "Class1.cs", "29"); //Completely arbitary
+      loggingEventData.ThreadName = Thread.CurrentThread.Name;
+      loggingEventData.TimeStampUtc = DateTime.UtcNow.Date;
+      loggingEventData.ExceptionString = "Exception occured here";
+      loggingEventData.UserName = "TestUser";
+      return loggingEventData;
+    }
 
-		private static void AssertExpectedLoggingEvent(LoggingEvent loggingEvent, LoggingEventData loggingEventData)
-		{
-			Assert.AreEqual("ReallySimpleApp", loggingEventData.Domain, "Domain is incorrect");
-			Assert.AreEqual("System.Exception: This is the exception", loggingEvent.GetExceptionString(), "Exception is incorrect");
-			Assert.AreEqual(null, loggingEventData.Identity, "Identity is incorrect");
-			Assert.AreEqual(Level.Warn, loggingEventData.Level, "Level is incorrect");
+    private static void AssertExpectedLoggingEvent(LoggingEvent loggingEvent, LoggingEventData loggingEventData)
+    {
+      Assert.AreEqual("ReallySimpleApp", loggingEventData.Domain, "Domain is incorrect");
+      Assert.AreEqual("System.Exception: This is the exception", loggingEvent.GetExceptionString(), "Exception is incorrect");
+      Assert.AreEqual(null, loggingEventData.Identity, "Identity is incorrect");
+      Assert.AreEqual(Level.Warn, loggingEventData.Level, "Level is incorrect");
 #if !NETSTANDARD1_3 // NETSTANDARD1_3: LocationInfo can't get method names
-			Assert.AreEqual("get_LocationInformation", loggingEvent.LocationInformation.MethodName, "Location Info is incorrect");
+      Assert.AreEqual("get_LocationInformation", loggingEvent.LocationInformation.MethodName, "Location Info is incorrect");
 #endif
-			Assert.AreEqual("log4net.Tests.Core.FixingTest", loggingEventData.LoggerName, "LoggerName is incorrect");
-			Assert.AreEqual(LogManager.GetRepository(TEST_REPOSITORY), loggingEvent.Repository, "Repository is incorrect");
-			Assert.AreEqual(Thread.CurrentThread.Name, loggingEventData.ThreadName, "ThreadName is incorrect");
-            // This test is redundant as loggingEventData.TimeStamp is a value type and cannot be null
-            // Assert.IsNotNull(loggingEventData.TimeStampUtc, "TimeStamp is incorrect");
-			Assert.AreEqual("TestUser", loggingEventData.UserName, "UserName is incorrect");
-			Assert.AreEqual("Logging event works", loggingEvent.RenderedMessage, "Message is incorrect");
-		}
-	}
+      Assert.AreEqual("log4net.Tests.Core.FixingTest", loggingEventData.LoggerName, "LoggerName is incorrect");
+      Assert.AreEqual(LogManager.GetRepository(TEST_REPOSITORY), loggingEvent.Repository, "Repository is incorrect");
+      Assert.AreEqual(Thread.CurrentThread.Name, loggingEventData.ThreadName, "ThreadName is incorrect");
+      // This test is redundant as loggingEventData.TimeStamp is a value type and cannot be null
+      // Assert.IsNotNull(loggingEventData.TimeStampUtc, "TimeStamp is incorrect");
+      Assert.AreEqual("TestUser", loggingEventData.UserName, "UserName is incorrect");
+      Assert.AreEqual("Logging event works", loggingEvent.RenderedMessage, "Message is incorrect");
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Core/ShutdownTest.cs b/src/log4net.Tests/Core/ShutdownTest.cs
index 720a321..075a469 100644
--- a/src/log4net.Tests/Core/ShutdownTest.cs
+++ b/src/log4net.Tests/Core/ShutdownTest.cs
@@ -28,46 +28,46 @@
 
 namespace log4net.Tests.Core
 {
-	/// <summary>
-	/// </remarks>
-	[TestFixture]
-	public class ShutdownTest
-	{
-		/// <summary>
-		/// Test that a repository can be shutdown and reconfigured
-		/// </summary>
-		[Test]
-		public void TestShutdownAndReconfigure()
-		{
-			// Create unique repository
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+  /// <summary>
+  /// </remarks>
+  [TestFixture]
+  public class ShutdownTest
+  {
+    /// <summary>
+    /// Test that a repository can be shutdown and reconfigured
+    /// </summary>
+    [Test]
+    public void TestShutdownAndReconfigure()
+    {
+      // Create unique repository
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
 
-			// Create appender and configure repos
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%m");
-			BasicConfigurator.Configure(rep, stringAppender);
+      // Create appender and configure repos
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%m");
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			// Get logger from repos
-			ILog log1 = LogManager.GetLogger(rep.Name, "logger1");
+      // Get logger from repos
+      ILog log1 = LogManager.GetLogger(rep.Name, "logger1");
 
-			log1.Info("TestMessage1");
-			Assert.AreEqual("TestMessage1", stringAppender.GetString(), "Test logging configured");
-			stringAppender.Reset();
+      log1.Info("TestMessage1");
+      Assert.AreEqual("TestMessage1", stringAppender.GetString(), "Test logging configured");
+      stringAppender.Reset();
 
-			rep.Shutdown();
+      rep.Shutdown();
 
-			log1.Info("TestMessage2");
-			Assert.AreEqual("", stringAppender.GetString(), "Test not logging while shutdown");
-			stringAppender.Reset();
+      log1.Info("TestMessage2");
+      Assert.AreEqual("", stringAppender.GetString(), "Test not logging while shutdown");
+      stringAppender.Reset();
 
-			// Create new appender and configure
-			stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%m");
-			BasicConfigurator.Configure(rep, stringAppender);
+      // Create new appender and configure
+      stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%m");
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			log1.Info("TestMessage3");
-			Assert.AreEqual("TestMessage3", stringAppender.GetString(), "Test logging re-configured");
-			stringAppender.Reset();
-		}
-	}
+      log1.Info("TestMessage3");
+      Assert.AreEqual("TestMessage3", stringAppender.GetString(), "Test logging re-configured");
+      stringAppender.Reset();
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Core/StringFormatTest.cs b/src/log4net.Tests/Core/StringFormatTest.cs
index 16c7b5a..7aaf9b1 100644
--- a/src/log4net.Tests/Core/StringFormatTest.cs
+++ b/src/log4net.Tests/Core/StringFormatTest.cs
@@ -31,681 +31,681 @@
 
 namespace log4net.Tests.Core
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="PatternLayoutTest"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="PatternLayoutTest"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class StringFormatTest
-	{
+  /// <summary>
+  /// Used for internal unit testing the <see cref="PatternLayoutTest"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="PatternLayoutTest"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class StringFormatTest
+  {
 #if !NETSTANDARD1_3
-		private CultureInfo _currentCulture;
-		private CultureInfo _currentUICulture;
+    private CultureInfo _currentCulture;
+    private CultureInfo _currentUICulture;
 
-		[SetUp]
-		public void SetUp()
-		{
-			// set correct thread culture
-			_currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
-			_currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
-			System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
-		}
+    [SetUp]
+    public void SetUp()
+    {
+      // set correct thread culture
+      _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+      _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
+      System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
+    }
 
-		[TearDown]
-		public void TearDown()
-		{
-			// restore previous culture
-			System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
-			System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
-		}
+    [TearDown]
+    public void TearDown()
+    {
+      // restore previous culture
+      System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
+      System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
+    }
 #endif
 
-		[Test]
-		public void TestFormatString()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%message");
+    [Test]
+    public void TestFormatString()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestFormatString");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestFormatString");
 
-			// ***
-			log1.Info("TestMessage");
-			Assert.AreEqual("TestMessage", stringAppender.GetString(), "Test simple INFO event");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage");
+      Assert.AreEqual("TestMessage", stringAppender.GetString(), "Test simple INFO event");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.DebugFormat("Before {0} After", "Middle");
-			Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted DEBUG event");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("Before {0} After", "Middle");
+      Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted DEBUG event");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("Before {0} After", "Middle");
-			Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted INFO event");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("Before {0} After", "Middle");
+      Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted INFO event");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("Before {0} After", "Middle");
-			Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted WARN event");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("Before {0} After", "Middle");
+      Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted WARN event");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("Before {0} After", "Middle");
-			Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted ERROR event");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("Before {0} After", "Middle");
+      Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted ERROR event");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("Before {0} After", "Middle");
-			Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted FATAL event");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("Before {0} After", "Middle");
+      Assert.AreEqual("Before Middle After", stringAppender.GetString(), "Test simple formatted FATAL event");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.InfoFormat("Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("Before Middle After End", stringAppender.GetString(), "Test simple formatted INFO event 2");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("Before Middle After End", stringAppender.GetString(), "Test simple formatted INFO event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("IGNORE THIS WARNING - EXCEPTION EXPECTED Before {0} After {1} {2}", "Middle", "End");
-			Assert.AreEqual(STRING_FORMAT_ERROR, stringAppender.GetString(), "Test formatting error");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.InfoFormat("IGNORE THIS WARNING - EXCEPTION EXPECTED Before {0} After {1} {2}", "Middle", "End");
+      Assert.AreEqual(STRING_FORMAT_ERROR, stringAppender.GetString(), "Test formatting error");
+      stringAppender.Reset();
+    }
 
-		private const string STRING_FORMAT_ERROR = "<log4net.Error>Exception during StringFormat: Index (zero based) must be greater than or equal to zero and less than the size of the argument list. <format>IGNORE THIS WARNING - EXCEPTION EXPECTED Before {0} After {1} {2}</format><args>{Middle, End}</args></log4net.Error>";
+    private const string STRING_FORMAT_ERROR = "<log4net.Error>Exception during StringFormat: Index (zero based) must be greater than or equal to zero and less than the size of the argument list. <format>IGNORE THIS WARNING - EXCEPTION EXPECTED Before {0} After {1} {2}</format><args>{Middle, End}</args></log4net.Error>";
 
 
-		[Test]
-		public void TestLogFormatApi_Debug()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_Debug()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Debug");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Debug");
 
-			// ***
-			log1.Debug("TestMessage");
-			Assert.AreEqual("DEBUG:TestMessage", stringAppender.GetString(), "Test simple DEBUG event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Debug("TestMessage");
+      Assert.AreEqual("DEBUG:TestMessage", stringAppender.GetString(), "Test simple DEBUG event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Debug("TestMessage", null);
-			Assert.AreEqual("DEBUG:TestMessage", stringAppender.GetString(), "Test simple DEBUG event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Debug("TestMessage", null);
+      Assert.AreEqual("DEBUG:TestMessage", stringAppender.GetString(), "Test simple DEBUG event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Debug("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("DEBUG:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple DEBUG event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Debug("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("DEBUG:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple DEBUG event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat("a{0}", "1");
-			Assert.AreEqual("DEBUG:a1", stringAppender.GetString(), "Test formatted DEBUG event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}", "1");
+      Assert.AreEqual("DEBUG:a1", stringAppender.GetString(), "Test formatted DEBUG event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("DEBUG:a1b2", stringAppender.GetString(), "Test formatted DEBUG event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("DEBUG:a1b2", stringAppender.GetString(), "Test formatted DEBUG event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("DEBUG:a1b2c3", stringAppender.GetString(), "Test formatted DEBUG event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("DEBUG:a1b2c3", stringAppender.GetString(), "Test formatted DEBUG event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.DebugFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("DEBUG:aQbWcEdReTf", stringAppender.GetString(), "Test formatted DEBUG event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("DEBUG:aQbWcEdReTf", stringAppender.GetString(), "Test formatted DEBUG event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("DEBUG:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("DEBUG:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("DEBUG:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.DebugFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("DEBUG:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogFormatApi_NoDebug()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Threshold = Level.Info;
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_NoDebug()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Threshold = Level.Info;
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Debug");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Debug");
 
-			// ***
-			log1.Debug("TestMessage");
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple DEBUG event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Debug("TestMessage");
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple DEBUG event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Debug("TestMessage", null);
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple DEBUG event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Debug("TestMessage", null);
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple DEBUG event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Debug("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple DEBUG event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Debug("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple DEBUG event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat("a{0}", "1");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}", "1");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.DebugFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted DEBUG event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.DebugFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.DebugFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.DebugFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
 
-		[Test]
-		public void TestLogFormatApi_Info()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_Info()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Info");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Info");
 
-			// ***
-			log1.Info("TestMessage");
-			Assert.AreEqual("INFO:TestMessage", stringAppender.GetString(), "Test simple INFO event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage");
+      Assert.AreEqual("INFO:TestMessage", stringAppender.GetString(), "Test simple INFO event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Info("TestMessage", null);
-			Assert.AreEqual("INFO:TestMessage", stringAppender.GetString(), "Test simple INFO event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage", null);
+      Assert.AreEqual("INFO:TestMessage", stringAppender.GetString(), "Test simple INFO event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Info("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("INFO:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple INFO event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("INFO:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple INFO event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("a{0}", "1");
-			Assert.AreEqual("INFO:a1", stringAppender.GetString(), "Test formatted INFO event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}", "1");
+      Assert.AreEqual("INFO:a1", stringAppender.GetString(), "Test formatted INFO event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("INFO:a1b2", stringAppender.GetString(), "Test formatted INFO event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("INFO:a1b2", stringAppender.GetString(), "Test formatted INFO event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("INFO:a1b2c3", stringAppender.GetString(), "Test formatted INFO event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("INFO:a1b2c3", stringAppender.GetString(), "Test formatted INFO event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.InfoFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("INFO:aQbWcEdReTf", stringAppender.GetString(), "Test formatted INFO event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("INFO:aQbWcEdReTf", stringAppender.GetString(), "Test formatted INFO event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("INFO:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("INFO:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("INFO:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.InfoFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("INFO:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogFormatApi_NoInfo()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Threshold = Level.Warn;
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_NoInfo()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Threshold = Level.Warn;
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Info");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Info");
 
-			// ***
-			log1.Info("TestMessage");
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple INFO event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage");
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple INFO event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Info("TestMessage", null);
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple INFO event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage", null);
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple INFO event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Info("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple INFO event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Info("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple INFO event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("a{0}", "1");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}", "1");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.InfoFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted INFO event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.InfoFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.InfoFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.InfoFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
 
-		[Test]
-		public void TestLogFormatApi_Warn()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_Warn()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Warn");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Warn");
 
-			// ***
-			log1.Warn("TestMessage");
-			Assert.AreEqual("WARN:TestMessage", stringAppender.GetString(), "Test simple WARN event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Warn("TestMessage");
+      Assert.AreEqual("WARN:TestMessage", stringAppender.GetString(), "Test simple WARN event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Warn("TestMessage", null);
-			Assert.AreEqual("WARN:TestMessage", stringAppender.GetString(), "Test simple WARN event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Warn("TestMessage", null);
+      Assert.AreEqual("WARN:TestMessage", stringAppender.GetString(), "Test simple WARN event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Warn("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("WARN:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple WARN event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Warn("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("WARN:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple WARN event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("a{0}", "1");
-			Assert.AreEqual("WARN:a1", stringAppender.GetString(), "Test formatted WARN event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}", "1");
+      Assert.AreEqual("WARN:a1", stringAppender.GetString(), "Test formatted WARN event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("WARN:a1b2", stringAppender.GetString(), "Test formatted WARN event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("WARN:a1b2", stringAppender.GetString(), "Test formatted WARN event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("WARN:a1b2c3", stringAppender.GetString(), "Test formatted WARN event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("WARN:a1b2c3", stringAppender.GetString(), "Test formatted WARN event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.WarnFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("WARN:aQbWcEdReTf", stringAppender.GetString(), "Test formatted WARN event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("WARN:aQbWcEdReTf", stringAppender.GetString(), "Test formatted WARN event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("WARN:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("WARN:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("WARN:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.WarnFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("WARN:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogFormatApi_NoWarn()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Threshold = Level.Error;
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_NoWarn()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Threshold = Level.Error;
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Warn");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Warn");
 
-			// ***
-			log1.Warn("TestMessage");
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple WARN event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Warn("TestMessage");
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple WARN event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Warn("TestMessage", null);
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple WARN event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Warn("TestMessage", null);
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple WARN event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Warn("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple WARN event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Warn("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple WARN event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("a{0}", "1");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}", "1");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.WarnFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted WARN event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.WarnFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.WarnFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.WarnFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
 
-		[Test]
-		public void TestLogFormatApi_Error()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_Error()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Error");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Error");
 
-			// ***
-			log1.Error("TestMessage");
-			Assert.AreEqual("ERROR:TestMessage", stringAppender.GetString(), "Test simple ERROR event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Error("TestMessage");
+      Assert.AreEqual("ERROR:TestMessage", stringAppender.GetString(), "Test simple ERROR event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Error("TestMessage", null);
-			Assert.AreEqual("ERROR:TestMessage", stringAppender.GetString(), "Test simple ERROR event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Error("TestMessage", null);
+      Assert.AreEqual("ERROR:TestMessage", stringAppender.GetString(), "Test simple ERROR event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Error("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("ERROR:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple ERROR event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Error("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("ERROR:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple ERROR event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("a{0}", "1");
-			Assert.AreEqual("ERROR:a1", stringAppender.GetString(), "Test formatted ERROR event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}", "1");
+      Assert.AreEqual("ERROR:a1", stringAppender.GetString(), "Test formatted ERROR event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("ERROR:a1b2", stringAppender.GetString(), "Test formatted ERROR event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("ERROR:a1b2", stringAppender.GetString(), "Test formatted ERROR event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("ERROR:a1b2c3", stringAppender.GetString(), "Test formatted ERROR event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("ERROR:a1b2c3", stringAppender.GetString(), "Test formatted ERROR event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.ErrorFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("ERROR:aQbWcEdReTf", stringAppender.GetString(), "Test formatted ERROR event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("ERROR:aQbWcEdReTf", stringAppender.GetString(), "Test formatted ERROR event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("ERROR:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("ERROR:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("ERROR:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.ErrorFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("ERROR:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogFormatApi_NoError()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Threshold = Level.Fatal;
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_NoError()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Threshold = Level.Fatal;
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Error");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Error");
 
-			// ***
-			log1.Error("TestMessage");
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple ERROR event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Error("TestMessage");
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple ERROR event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Error("TestMessage", null);
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple ERROR event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Error("TestMessage", null);
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple ERROR event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Error("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple ERROR event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Error("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple ERROR event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("a{0}", "1");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}", "1");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.ErrorFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted ERROR event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.ErrorFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.ErrorFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.ErrorFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
 
-		[Test]
-		public void TestLogFormatApi_Fatal()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_Fatal()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Fatal");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Fatal");
 
-			// ***
-			log1.Fatal("TestMessage");
-			Assert.AreEqual("FATAL:TestMessage", stringAppender.GetString(), "Test simple FATAL event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Fatal("TestMessage");
+      Assert.AreEqual("FATAL:TestMessage", stringAppender.GetString(), "Test simple FATAL event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Fatal("TestMessage", null);
-			Assert.AreEqual("FATAL:TestMessage", stringAppender.GetString(), "Test simple FATAL event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Fatal("TestMessage", null);
+      Assert.AreEqual("FATAL:TestMessage", stringAppender.GetString(), "Test simple FATAL event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Fatal("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("FATAL:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple FATAL event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Fatal("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("FATAL:TestMessageSystem.Exception: Exception message" + Environment.NewLine, stringAppender.GetString(), "Test simple FATAL event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("a{0}", "1");
-			Assert.AreEqual("FATAL:a1", stringAppender.GetString(), "Test formatted FATAL event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}", "1");
+      Assert.AreEqual("FATAL:a1", stringAppender.GetString(), "Test formatted FATAL event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("FATAL:a1b2", stringAppender.GetString(), "Test formatted FATAL event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("FATAL:a1b2", stringAppender.GetString(), "Test formatted FATAL event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("FATAL:a1b2c3", stringAppender.GetString(), "Test formatted FATAL event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("FATAL:a1b2c3", stringAppender.GetString(), "Test formatted FATAL event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.FatalFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("FATAL:aQbWcEdReTf", stringAppender.GetString(), "Test formatted FATAL event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("FATAL:aQbWcEdReTf", stringAppender.GetString(), "Test formatted FATAL event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("FATAL:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("FATAL:Before Middle After End", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("FATAL:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
+      // ***
+      log1.FatalFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("FATAL:Before Middle After End", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
 
-		[Test]
-		public void TestLogFormatApi_NoFatal()
-		{
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Threshold = Level.Off;
-			stringAppender.Layout = new PatternLayout("%level:%message");
+    [Test]
+    public void TestLogFormatApi_NoFatal()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Threshold = Level.Off;
+      stringAppender.Layout = new PatternLayout("%level:%message");
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
 
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Fatal");
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogFormatApi_Fatal");
 
-			// ***
-			log1.Fatal("TestMessage");
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple FATAL event 1");
-			stringAppender.Reset();
+      // ***
+      log1.Fatal("TestMessage");
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple FATAL event 1");
+      stringAppender.Reset();
 
-			// ***
-			log1.Fatal("TestMessage", null);
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple FATAL event 2");
-			stringAppender.Reset();
+      // ***
+      log1.Fatal("TestMessage", null);
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple FATAL event 2");
+      stringAppender.Reset();
 
-			// ***
-			log1.Fatal("TestMessage", new Exception("Exception message"));
-			Assert.AreEqual("", stringAppender.GetString(), "Test simple FATAL event 3");
-			stringAppender.Reset();
+      // ***
+      log1.Fatal("TestMessage", new Exception("Exception message"));
+      Assert.AreEqual("", stringAppender.GetString(), "Test simple FATAL event 3");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("a{0}", "1");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 1 parm");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}", "1");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 1 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("a{0}b{1}", "1", "2");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 2 parm");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}b{1}", "1", "2");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 2 parm");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat("a{0}b{1}c{2}", "1", "2", "3");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 3 parm");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}b{1}c{2}", "1", "2", "3");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 3 parm");
+      stringAppender.Reset();
 
 
-			// ***
-			log1.FatalFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 5 parms (only 4 used)");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat("a{0}b{1}c{2}d{3}e{4}f", "Q", "W", "E", "R", "T", "Y");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatted FATAL event with 5 parms (only 4 used)");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat(null, "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
-			stringAppender.Reset();
+      // ***
+      log1.FatalFormat(null, "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with null provider");
+      stringAppender.Reset();
 
-			// ***
-			log1.FatalFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
-			Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
-			stringAppender.Reset();
-		}
-	}
+      // ***
+      log1.FatalFormat(new CultureInfo("en"), "Before {0} After {1}", "Middle", "End");
+      Assert.AreEqual("", stringAppender.GetString(), "Test formatting with 'en' provider");
+      stringAppender.Reset();
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Filter/FilterTest.cs b/src/log4net.Tests/Filter/FilterTest.cs
index 7c9539e..7e9d2cf 100644
--- a/src/log4net.Tests/Filter/FilterTest.cs
+++ b/src/log4net.Tests/Filter/FilterTest.cs
@@ -31,15 +31,15 @@
 
 namespace log4net.Tests.Filter
 {
-    [TestFixture]
-    public class FilterTest
+  [TestFixture]
+  public class FilterTest
+  {
+    [Test]
+    public void FilterConfigurationTest()
     {
-        [Test]
-        public void FilterConfigurationTest()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            #region Load log4netConfig
-            log4netConfig.LoadXml(@"
+      XmlDocument log4netConfig = new XmlDocument();
+      #region Load log4netConfig
+      log4netConfig.LoadXml(@"
             <log4net>
             <appender name=""MemoryAppender"" type=""log4net.Appender.MemoryAppender, log4net"">
                 <filter type=""log4net.Tests.Filter.MultiplePropertyFilter, log4net.Tests"">
@@ -58,61 +58,64 @@
                 <appender-ref ref=""MemoryAppender"" />
             </root>
             </log4net>");
-            #endregion
+      #endregion
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
 
-            IAppender[] appenders = LogManager.GetRepository(rep.Name).GetAppenders();
-            Assert.IsTrue(appenders.Length == 1);
+      IAppender[] appenders = LogManager.GetRepository(rep.Name).GetAppenders();
+      Assert.IsTrue(appenders.Length == 1);
 
-            IAppender appender = Array.Find(appenders, delegate(IAppender a) {
-                    return a.Name == "MemoryAppender";
-                });
-            Assert.IsNotNull(appender);
+      IAppender appender = Array.Find(appenders, delegate (IAppender a)
+      {
+        return a.Name == "MemoryAppender";
+      });
+      Assert.IsNotNull(appender);
 
-            MultiplePropertyFilter multiplePropertyFilter = 
-                ((AppenderSkeleton)appender).FilterHead as MultiplePropertyFilter;
+      MultiplePropertyFilter multiplePropertyFilter =
+          ((AppenderSkeleton)appender).FilterHead as MultiplePropertyFilter;
 
-            MultiplePropertyFilter.Condition[] conditions = multiplePropertyFilter.GetConditions();
-            Assert.AreEqual(2, conditions.Length);
-            Assert.AreEqual("ABC", conditions[0].Key);
-            Assert.AreEqual("123", conditions[0].StringToMatch);
-            Assert.AreEqual("DEF", conditions[1].Key);
-            Assert.AreEqual("456", conditions[1].StringToMatch);
-        }
+      MultiplePropertyFilter.Condition[] conditions = multiplePropertyFilter.GetConditions();
+      Assert.AreEqual(2, conditions.Length);
+      Assert.AreEqual("ABC", conditions[0].Key);
+      Assert.AreEqual("123", conditions[0].StringToMatch);
+      Assert.AreEqual("DEF", conditions[1].Key);
+      Assert.AreEqual("456", conditions[1].StringToMatch);
     }
+  }
 
-    public class MultiplePropertyFilter : FilterSkeleton
+  public class MultiplePropertyFilter : FilterSkeleton
+  {
+    private readonly List<Condition> _conditions = new List<Condition>();
+
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
     {
-        private readonly List<Condition> _conditions = new List<Condition>();
-
-        public override FilterDecision Decide(LoggingEvent loggingEvent)
-        {
-            return FilterDecision.Accept;
-        }
-
-        public Condition[] GetConditions()
-        {
-            return _conditions.ToArray();
-        }
-
-        public void AddCondition(Condition condition)
-        {
-            _conditions.Add(condition);
-        }
-        
-        public class Condition
-        {
-            private string key, stringToMatch;
-            public string Key {
-                get { return key; }
-                set { key = value; }
-            }
-            public string StringToMatch {
-                get { return stringToMatch; }
-                set { stringToMatch = value; }
-            }
-        }
+      return FilterDecision.Accept;
     }
+
+    public Condition[] GetConditions()
+    {
+      return _conditions.ToArray();
+    }
+
+    public void AddCondition(Condition condition)
+    {
+      _conditions.Add(condition);
+    }
+
+    public class Condition
+    {
+      private string key, stringToMatch;
+      public string Key
+      {
+        get { return key; }
+        set { key = value; }
+      }
+      public string StringToMatch
+      {
+        get { return stringToMatch; }
+        set { stringToMatch = value; }
+      }
+    }
+  }
 }
diff --git a/src/log4net.Tests/Hierarchy/Hierarchy.cs b/src/log4net.Tests/Hierarchy/Hierarchy.cs
index 3755d7b..94dd017 100644
--- a/src/log4net.Tests/Hierarchy/Hierarchy.cs
+++ b/src/log4net.Tests/Hierarchy/Hierarchy.cs
@@ -30,15 +30,15 @@
 
 namespace log4net.Tests.Hierarchy
 {
-    [TestFixture]
-    public class Hierarchy
+  [TestFixture]
+  public class Hierarchy
+  {
+    [Test]
+    public void SetRepositoryPropertiesInConfigFile()
     {
-        [Test]
-        public void SetRepositoryPropertiesInConfigFile()
-        {
-            // LOG4NET-53: Allow repository properties to be set in the config file
-            XmlDocument log4netConfig = new XmlDocument();
-            log4netConfig.LoadXml(@"
+      // LOG4NET-53: Allow repository properties to be set in the config file
+      XmlDocument log4netConfig = new XmlDocument();
+      log4netConfig.LoadXml(@"
                 <log4net>
                   <property>
                     <key value=""two-plus-two"" />
@@ -53,58 +53,58 @@
                   </root>
                 </log4net>");
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
 
-            Assert.AreEqual("4", rep.Properties["two-plus-two"]);
-            Assert.IsNull(rep.Properties["one-plus-one"]);
-        }
+      Assert.AreEqual("4", rep.Properties["two-plus-two"]);
+      Assert.IsNull(rep.Properties["one-plus-one"]);
+    }
 
-        [Test]
-        public void AddingMultipleAppenders()
-        {
-            CountingAppender alpha = new CountingAppender();
-            CountingAppender beta = new CountingAppender();
+    [Test]
+    public void AddingMultipleAppenders()
+    {
+      CountingAppender alpha = new CountingAppender();
+      CountingAppender beta = new CountingAppender();
 
-            Repository.Hierarchy.Hierarchy hierarchy = 
-                (Repository.Hierarchy.Hierarchy)Utils.GetRepository();
+      Repository.Hierarchy.Hierarchy hierarchy =
+          (Repository.Hierarchy.Hierarchy)Utils.GetRepository();
 
-            hierarchy.Root.AddAppender(alpha);
-            hierarchy.Root.AddAppender(beta);
-            hierarchy.Configured = true;
+      hierarchy.Root.AddAppender(alpha);
+      hierarchy.Root.AddAppender(beta);
+      hierarchy.Configured = true;
 
-            ILog log = LogManager.GetLogger(GetType());
-            log.Debug("Hello World");
+      ILog log = LogManager.GetLogger(GetType());
+      log.Debug("Hello World");
 
-            Assert.AreEqual(1, alpha.Counter);
-            Assert.AreEqual(1, beta.Counter);
-        }
+      Assert.AreEqual(1, alpha.Counter);
+      Assert.AreEqual(1, beta.Counter);
+    }
 
-        [Test]
-        public void AddingMultipleAppenders2()
-        {
-            CountingAppender alpha = new CountingAppender();
-            CountingAppender beta = new CountingAppender();
+    [Test]
+    public void AddingMultipleAppenders2()
+    {
+      CountingAppender alpha = new CountingAppender();
+      CountingAppender beta = new CountingAppender();
 
 #if NETSTANDARD1_3
             BasicConfigurator.Configure(Utils.GetRepository(), alpha, beta);
 #else
-            BasicConfigurator.Configure(alpha, beta);
+      BasicConfigurator.Configure(alpha, beta);
 #endif
 
-            ILog log = LogManager.GetLogger(GetType());
-            log.Debug("Hello World");
+      ILog log = LogManager.GetLogger(GetType());
+      log.Debug("Hello World");
 
-            Assert.AreEqual(1, alpha.Counter);
-            Assert.AreEqual(1, beta.Counter);
-        }
+      Assert.AreEqual(1, alpha.Counter);
+      Assert.AreEqual(1, beta.Counter);
+    }
 
-        [Test]
-	// LOG4NET-343
-        public void LoggerNameCanConsistOfASingleDot()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            log4netConfig.LoadXml(@"
+    [Test]
+    // LOG4NET-343
+    public void LoggerNameCanConsistOfASingleDot()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      log4netConfig.LoadXml(@"
                 <log4net>
                   <appender name=""StringAppender"" type=""log4net.Tests.Appender.StringAppender, log4net.Tests"">
                     <layout type=""log4net.Layout.SimpleLayout"" />
@@ -118,15 +118,15 @@
                   </logger>
                 </log4net>");
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
-        }
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+    }
 
-        [Test]
-        public void LoggerNameCanConsistOfASingleNonDot()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            log4netConfig.LoadXml(@"
+    [Test]
+    public void LoggerNameCanConsistOfASingleNonDot()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      log4netConfig.LoadXml(@"
                 <log4net>
                   <appender name=""StringAppender"" type=""log4net.Tests.Appender.StringAppender, log4net.Tests"">
                     <layout type=""log4net.Layout.SimpleLayout"" />
@@ -140,15 +140,15 @@
                   </logger>
                 </log4net>");
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
-        }
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+    }
 
-        [Test]
-        public void LoggerNameCanContainSequenceOfDots()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            log4netConfig.LoadXml(@"
+    [Test]
+    public void LoggerNameCanContainSequenceOfDots()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      log4netConfig.LoadXml(@"
                 <log4net>
                   <appender name=""StringAppender"" type=""log4net.Tests.Appender.StringAppender, log4net.Tests"">
                     <layout type=""log4net.Layout.SimpleLayout"" />
@@ -162,8 +162,8 @@
                   </logger>
                 </log4net>");
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
-        }
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
     }
+  }
 }
diff --git a/src/log4net.Tests/Hierarchy/Logger.cs b/src/log4net.Tests/Hierarchy/Logger.cs
index aa51d89..3d383f7 100644
--- a/src/log4net.Tests/Hierarchy/Logger.cs
+++ b/src/log4net.Tests/Hierarchy/Logger.cs
@@ -30,291 +30,291 @@
 
 namespace log4net.Tests.Hierarchy
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="Logger"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Internal unit test. Uses the NUnit test harness.
-	/// </remarks>
-	[TestFixture]
-	public class LoggerTest
-	{
-		private Logger log;
+  /// <summary>
+  /// Used for internal unit testing the <see cref="Logger"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Internal unit test. Uses the NUnit test harness.
+  /// </remarks>
+  [TestFixture]
+  public class LoggerTest
+  {
+    private Logger log;
 
-		// A short message.
-		private static string MSG = "M";
+    // A short message.
+    private static string MSG = "M";
 
-		/// <summary>
-		/// Any initialization that happens before each test can
-		/// go here
-		/// </summary>
-		[SetUp]
-		public void SetUp()
-		{
-		}
+    /// <summary>
+    /// Any initialization that happens before each test can
+    /// go here
+    /// </summary>
+    [SetUp]
+    public void SetUp()
+    {
+    }
 
-		/// <summary>
-		/// Any steps that happen after each test go here
-		/// </summary>
-		[TearDown]
-		public void TearDown()
-		{
-			// Regular users should not use the clear method lightly!
-			Utils.GetRepository().ResetConfiguration();
-			Utils.GetRepository().Shutdown();
-			((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
-		}
+    /// <summary>
+    /// Any steps that happen after each test go here
+    /// </summary>
+    [TearDown]
+    public void TearDown()
+    {
+      // Regular users should not use the clear method lightly!
+      Utils.GetRepository().ResetConfiguration();
+      Utils.GetRepository().Shutdown();
+      ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Clear();
+    }
 
-		/// <summary>
-		/// Add an appender and see if it can be retrieved.
-		/// </summary>
-		[Test]
-		public void TestAppender1()
-		{
-			log = (Logger)Utils.GetLogger("test").Logger;
-			CountingAppender a1 = new CountingAppender();
-			a1.Name = "testAppender1";
-			log.AddAppender(a1);
+    /// <summary>
+    /// Add an appender and see if it can be retrieved.
+    /// </summary>
+    [Test]
+    public void TestAppender1()
+    {
+      log = (Logger)Utils.GetLogger("test").Logger;
+      CountingAppender a1 = new CountingAppender();
+      a1.Name = "testAppender1";
+      log.AddAppender(a1);
 
-			IEnumerator enumAppenders = ((IEnumerable)log.Appenders).GetEnumerator();
-			Assert.IsTrue(enumAppenders.MoveNext());
-			CountingAppender aHat = (CountingAppender)enumAppenders.Current;
-			Assert.AreEqual(a1, aHat);
-		}
+      IEnumerator enumAppenders = ((IEnumerable)log.Appenders).GetEnumerator();
+      Assert.IsTrue(enumAppenders.MoveNext());
+      CountingAppender aHat = (CountingAppender)enumAppenders.Current;
+      Assert.AreEqual(a1, aHat);
+    }
 
-		/// <summary>
-		/// Add an appender X, Y, remove X and check if Y is the only
-		/// remaining appender.
-		/// </summary>
-		[Test]
-		public void TestAppender2()
-		{
-			CountingAppender a1 = new CountingAppender();
-			a1.Name = "testAppender2.1";
-			CountingAppender a2 = new CountingAppender();
-			a2.Name = "testAppender2.2";
+    /// <summary>
+    /// Add an appender X, Y, remove X and check if Y is the only
+    /// remaining appender.
+    /// </summary>
+    [Test]
+    public void TestAppender2()
+    {
+      CountingAppender a1 = new CountingAppender();
+      a1.Name = "testAppender2.1";
+      CountingAppender a2 = new CountingAppender();
+      a2.Name = "testAppender2.2";
 
-			log = (Logger)Utils.GetLogger("test").Logger;
-			log.AddAppender(a1);
-			log.AddAppender(a2);
+      log = (Logger)Utils.GetLogger("test").Logger;
+      log.AddAppender(a1);
+      log.AddAppender(a2);
 
-			CountingAppender aHat = (CountingAppender)log.GetAppender(a1.Name);
-			Assert.AreEqual(a1, aHat);
+      CountingAppender aHat = (CountingAppender)log.GetAppender(a1.Name);
+      Assert.AreEqual(a1, aHat);
 
-			aHat = (CountingAppender)log.GetAppender(a2.Name);
-			Assert.AreEqual(a2, aHat);
+      aHat = (CountingAppender)log.GetAppender(a2.Name);
+      Assert.AreEqual(a2, aHat);
 
-			log.RemoveAppender("testAppender2.1");
+      log.RemoveAppender("testAppender2.1");
 
-			IEnumerator enumAppenders = ((IEnumerable)log.Appenders).GetEnumerator();
-			Assert.IsTrue(enumAppenders.MoveNext());
-			aHat = (CountingAppender)enumAppenders.Current;
-			Assert.AreEqual(a2, aHat);
-			Assert.IsTrue(!enumAppenders.MoveNext());
+      IEnumerator enumAppenders = ((IEnumerable)log.Appenders).GetEnumerator();
+      Assert.IsTrue(enumAppenders.MoveNext());
+      aHat = (CountingAppender)enumAppenders.Current;
+      Assert.AreEqual(a2, aHat);
+      Assert.IsTrue(!enumAppenders.MoveNext());
 
-			aHat = (CountingAppender)log.GetAppender(a2.Name);
-			Assert.AreEqual(a2, aHat);
-		}
+      aHat = (CountingAppender)log.GetAppender(a2.Name);
+      Assert.AreEqual(a2, aHat);
+    }
 
-		/// <summary>
-		/// Test if logger a.b inherits its appender from a.
-		/// </summary>
-		[Test]
-		public void TestAdditivity1()
-		{
-			Logger a = (Logger)Utils.GetLogger("a").Logger;
-			Logger ab = (Logger)Utils.GetLogger("a.b").Logger;
-			CountingAppender ca = new CountingAppender();
+    /// <summary>
+    /// Test if logger a.b inherits its appender from a.
+    /// </summary>
+    [Test]
+    public void TestAdditivity1()
+    {
+      Logger a = (Logger)Utils.GetLogger("a").Logger;
+      Logger ab = (Logger)Utils.GetLogger("a.b").Logger;
+      CountingAppender ca = new CountingAppender();
 
-			a.AddAppender(ca);
-			a.Repository.Configured = true;
+      a.AddAppender(ca);
+      a.Repository.Configured = true;
 
-			Assert.AreEqual(ca.Counter, 0);
-			ab.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(ca.Counter, 1);
-			ab.Log(Level.Info, MSG, null);
-			Assert.AreEqual(ca.Counter, 2);
-			ab.Log(Level.Warn, MSG, null);
-			Assert.AreEqual(ca.Counter, 3);
-			ab.Log(Level.Error, MSG, null);
-			Assert.AreEqual(ca.Counter, 4);
-		}
+      Assert.AreEqual(ca.Counter, 0);
+      ab.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(ca.Counter, 1);
+      ab.Log(Level.Info, MSG, null);
+      Assert.AreEqual(ca.Counter, 2);
+      ab.Log(Level.Warn, MSG, null);
+      Assert.AreEqual(ca.Counter, 3);
+      ab.Log(Level.Error, MSG, null);
+      Assert.AreEqual(ca.Counter, 4);
+    }
 
-		/// <summary>
-		/// Test multiple additivity.
-		/// </summary>
-		[Test]
-		public void TestAdditivity2()
-		{
-			Logger a = (Logger)Utils.GetLogger("a").Logger;
-			Logger ab = (Logger)Utils.GetLogger("a.b").Logger;
-			Logger abc = (Logger)Utils.GetLogger("a.b.c").Logger;
-			Logger x = (Logger)Utils.GetLogger("x").Logger;
+    /// <summary>
+    /// Test multiple additivity.
+    /// </summary>
+    [Test]
+    public void TestAdditivity2()
+    {
+      Logger a = (Logger)Utils.GetLogger("a").Logger;
+      Logger ab = (Logger)Utils.GetLogger("a.b").Logger;
+      Logger abc = (Logger)Utils.GetLogger("a.b.c").Logger;
+      Logger x = (Logger)Utils.GetLogger("x").Logger;
 
-			CountingAppender ca1 = new CountingAppender();
-			CountingAppender ca2 = new CountingAppender();
+      CountingAppender ca1 = new CountingAppender();
+      CountingAppender ca2 = new CountingAppender();
 
-			a.AddAppender(ca1);
-			abc.AddAppender(ca2);
-			a.Repository.Configured = true;
+      a.AddAppender(ca1);
+      abc.AddAppender(ca2);
+      a.Repository.Configured = true;
 
-			Assert.AreEqual(ca1.Counter, 0);
-			Assert.AreEqual(ca2.Counter, 0);
+      Assert.AreEqual(ca1.Counter, 0);
+      Assert.AreEqual(ca2.Counter, 0);
 
-			ab.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(ca1.Counter, 1);
-			Assert.AreEqual(ca2.Counter, 0);
+      ab.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(ca1.Counter, 1);
+      Assert.AreEqual(ca2.Counter, 0);
 
-			abc.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(ca1.Counter, 2);
-			Assert.AreEqual(ca2.Counter, 1);
+      abc.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(ca1.Counter, 2);
+      Assert.AreEqual(ca2.Counter, 1);
 
-			x.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(ca1.Counter, 2);
-			Assert.AreEqual(ca2.Counter, 1);
-		}
+      x.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(ca1.Counter, 2);
+      Assert.AreEqual(ca2.Counter, 1);
+    }
 
-		/// <summary>
-		/// Test additivity flag.
-		/// </summary>
-		[Test]
-		public void TestAdditivity3()
-		{
-			Logger root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
-			Logger a = (Logger)Utils.GetLogger("a").Logger;
-			Logger ab = (Logger)Utils.GetLogger("a.b").Logger;
-			Logger abc = (Logger)Utils.GetLogger("a.b.c").Logger;
+    /// <summary>
+    /// Test additivity flag.
+    /// </summary>
+    [Test]
+    public void TestAdditivity3()
+    {
+      Logger root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
+      Logger a = (Logger)Utils.GetLogger("a").Logger;
+      Logger ab = (Logger)Utils.GetLogger("a.b").Logger;
+      Logger abc = (Logger)Utils.GetLogger("a.b.c").Logger;
 
-			CountingAppender caRoot = new CountingAppender();
-			CountingAppender caA = new CountingAppender();
-			CountingAppender caABC = new CountingAppender();
+      CountingAppender caRoot = new CountingAppender();
+      CountingAppender caA = new CountingAppender();
+      CountingAppender caABC = new CountingAppender();
 
-			root.AddAppender(caRoot);
-			a.AddAppender(caA);
-			abc.AddAppender(caABC);
-			a.Repository.Configured = true;
+      root.AddAppender(caRoot);
+      a.AddAppender(caA);
+      abc.AddAppender(caABC);
+      a.Repository.Configured = true;
 
-			Assert.AreEqual(caRoot.Counter, 0);
-			Assert.AreEqual(caA.Counter, 0);
-			Assert.AreEqual(caABC.Counter, 0);
+      Assert.AreEqual(caRoot.Counter, 0);
+      Assert.AreEqual(caA.Counter, 0);
+      Assert.AreEqual(caABC.Counter, 0);
 
-			ab.Additivity = false;
+      ab.Additivity = false;
 
-			a.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 1);
-			Assert.AreEqual(caA.Counter, 1);
-			Assert.AreEqual(caABC.Counter, 0);
+      a.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 1);
+      Assert.AreEqual(caA.Counter, 1);
+      Assert.AreEqual(caABC.Counter, 0);
 
-			ab.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 1);
-			Assert.AreEqual(caA.Counter, 1);
-			Assert.AreEqual(caABC.Counter, 0);
+      ab.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 1);
+      Assert.AreEqual(caA.Counter, 1);
+      Assert.AreEqual(caABC.Counter, 0);
 
-			abc.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 1);
-			Assert.AreEqual(caA.Counter, 1);
-			Assert.AreEqual(caABC.Counter, 1);
-		}
+      abc.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 1);
+      Assert.AreEqual(caA.Counter, 1);
+      Assert.AreEqual(caABC.Counter, 1);
+    }
 
-		/// <summary>
-		/// Test the ability to disable a level of message
-		/// </summary>
-		[Test]
-		public void TestDisable1()
-		{
-			CountingAppender caRoot = new CountingAppender();
-			Logger root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
-			root.AddAppender(caRoot);
+    /// <summary>
+    /// Test the ability to disable a level of message
+    /// </summary>
+    [Test]
+    public void TestDisable1()
+    {
+      CountingAppender caRoot = new CountingAppender();
+      Logger root = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository()).Root;
+      root.AddAppender(caRoot);
 
-			Repository.Hierarchy.Hierarchy h = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository());
-			h.Threshold = Level.Info;
-			h.Configured = true;
+      Repository.Hierarchy.Hierarchy h = ((Repository.Hierarchy.Hierarchy)Utils.GetRepository());
+      h.Threshold = Level.Info;
+      h.Configured = true;
 
-			Assert.AreEqual(caRoot.Counter, 0);
+      Assert.AreEqual(caRoot.Counter, 0);
 
-			root.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 0);
-			root.Log(Level.Info, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 1);
-			root.Log(Level.Warn, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 2);
-			root.Log(Level.Warn, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 3);
+      root.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 0);
+      root.Log(Level.Info, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 1);
+      root.Log(Level.Warn, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 2);
+      root.Log(Level.Warn, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 3);
 
-			h.Threshold = Level.Warn;
-			root.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 3);
-			root.Log(Level.Info, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 3);
-			root.Log(Level.Warn, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 4);
-			root.Log(Level.Error, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 5);
-			root.Log(Level.Error, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
+      h.Threshold = Level.Warn;
+      root.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 3);
+      root.Log(Level.Info, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 3);
+      root.Log(Level.Warn, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 4);
+      root.Log(Level.Error, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 5);
+      root.Log(Level.Error, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
 
-			h.Threshold = Level.Off;
-			root.Log(Level.Debug, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
-			root.Log(Level.Info, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
-			root.Log(Level.Warn, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
-			root.Log(Level.Error, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
-			root.Log(Level.Fatal, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
-			root.Log(Level.Fatal, MSG, null);
-			Assert.AreEqual(caRoot.Counter, 6);
-		}
+      h.Threshold = Level.Off;
+      root.Log(Level.Debug, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
+      root.Log(Level.Info, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
+      root.Log(Level.Warn, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
+      root.Log(Level.Error, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
+      root.Log(Level.Fatal, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
+      root.Log(Level.Fatal, MSG, null);
+      Assert.AreEqual(caRoot.Counter, 6);
+    }
 
-		/// <summary>
-		/// Tests the Exists method of the Logger class
-		/// </summary>
-		[Test]
-		public void TestExists()
-		{
-			object a = Utils.GetLogger("a");
-			object a_b = Utils.GetLogger("a.b");
-			object a_b_c = Utils.GetLogger("a.b.c");
+    /// <summary>
+    /// Tests the Exists method of the Logger class
+    /// </summary>
+    [Test]
+    public void TestExists()
+    {
+      object a = Utils.GetLogger("a");
+      object a_b = Utils.GetLogger("a.b");
+      object a_b_c = Utils.GetLogger("a.b.c");
 
-			object t;
+      object t;
 #if NETSTANDARD1_3
-			Assert.IsNull(LogManager.Exists(GetType().GetTypeInfo().Assembly, "xx"));
-			t = LogManager.Exists(GetType().GetTypeInfo().Assembly, "a");
-			Assert.AreSame(a, t);
-			t = LogManager.Exists(GetType().GetTypeInfo().Assembly, "a.b");
-			Assert.AreSame(a_b, t);
-			t = LogManager.Exists(GetType().GetTypeInfo().Assembly, "a.b.c");
-			Assert.AreSame(a_b_c, t);
+      Assert.IsNull(LogManager.Exists(GetType().GetTypeInfo().Assembly, "xx"));
+      t = LogManager.Exists(GetType().GetTypeInfo().Assembly, "a");
+      Assert.AreSame(a, t);
+      t = LogManager.Exists(GetType().GetTypeInfo().Assembly, "a.b");
+      Assert.AreSame(a_b, t);
+      t = LogManager.Exists(GetType().GetTypeInfo().Assembly, "a.b.c");
+      Assert.AreSame(a_b_c, t);
 #else
-			t = LogManager.Exists("xx");
-			Assert.IsNull(t);
-			t = LogManager.Exists("a");
-			Assert.AreSame(a, t);
-			t = LogManager.Exists("a.b");
-			Assert.AreSame(a_b, t);
-			t = LogManager.Exists("a.b.c");
-			Assert.AreSame(a_b_c, t);
+      t = LogManager.Exists("xx");
+      Assert.IsNull(t);
+      t = LogManager.Exists("a");
+      Assert.AreSame(a, t);
+      t = LogManager.Exists("a.b");
+      Assert.AreSame(a_b, t);
+      t = LogManager.Exists("a.b.c");
+      Assert.AreSame(a_b_c, t);
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Tests the chained level for a hierarchy
-		/// </summary>
-		[Test]
-		public void TestHierarchy1()
-		{
-			Repository.Hierarchy.Hierarchy h = new Repository.Hierarchy.Hierarchy();
-			h.Root.Level = Level.Error;
+    /// <summary>
+    /// Tests the chained level for a hierarchy
+    /// </summary>
+    [Test]
+    public void TestHierarchy1()
+    {
+      Repository.Hierarchy.Hierarchy h = new Repository.Hierarchy.Hierarchy();
+      h.Root.Level = Level.Error;
 
-			Logger a0 = (Logger)h.GetLogger("a");
-			Assert.AreEqual("a", a0.Name);
-			Assert.IsNull(a0.Level);
-			Assert.AreSame(Level.Error, a0.EffectiveLevel);
+      Logger a0 = (Logger)h.GetLogger("a");
+      Assert.AreEqual("a", a0.Name);
+      Assert.IsNull(a0.Level);
+      Assert.AreSame(Level.Error, a0.EffectiveLevel);
 
-			Logger a1 = (Logger)h.GetLogger("a");
-			Assert.AreSame(a0, a1);
-		}
-	}
+      Logger a1 = (Logger)h.GetLogger("a");
+      Assert.AreSame(a0, a1);
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Layout/DynamicPatternLayoutTest.cs b/src/log4net.Tests/Layout/DynamicPatternLayoutTest.cs
index ee79a0a..782935e 100644
--- a/src/log4net.Tests/Layout/DynamicPatternLayoutTest.cs
+++ b/src/log4net.Tests/Layout/DynamicPatternLayoutTest.cs
@@ -21,17 +21,21 @@
 
 using NUnit.Framework;
 
-namespace log4net.Tests.Layout {
-    /// <summary>
-    /// Used for internal unit testing the <see cref="DynamicPatternLayout"/> class.
-    /// </summary>
-    public class DynamicPatternLayoutTest : PatternLayoutTest {
-        protected override PatternLayout NewPatternLayout() {
-            return new DynamicPatternLayout();
-        }
-
-        protected override PatternLayout NewPatternLayout(string pattern) {
-            return new DynamicPatternLayout(pattern);
-        }
+namespace log4net.Tests.Layout
+{
+  /// <summary>
+  /// Used for internal unit testing the <see cref="DynamicPatternLayout"/> class.
+  /// </summary>
+  public class DynamicPatternLayoutTest : PatternLayoutTest
+  {
+    protected override PatternLayout NewPatternLayout()
+    {
+      return new DynamicPatternLayout();
     }
+
+    protected override PatternLayout NewPatternLayout(string pattern)
+    {
+      return new DynamicPatternLayout(pattern);
+    }
+  }
 }
diff --git a/src/log4net.Tests/Layout/PatternLayoutTest.cs b/src/log4net.Tests/Layout/PatternLayoutTest.cs
index 9c768ca..ebfbfd7 100644
--- a/src/log4net.Tests/Layout/PatternLayoutTest.cs
+++ b/src/log4net.Tests/Layout/PatternLayoutTest.cs
@@ -35,325 +35,329 @@
 
 namespace log4net.Tests.Layout
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="PatternLayout"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="PatternLayout"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class PatternLayoutTest
-	{
+  /// <summary>
+  /// Used for internal unit testing the <see cref="PatternLayout"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="PatternLayout"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class PatternLayoutTest
+  {
 #if !NETSTANDARD1_3
-		private CultureInfo _currentCulture;
-		private CultureInfo _currentUICulture;
+    private CultureInfo _currentCulture;
+    private CultureInfo _currentUICulture;
 
-		[SetUp]
-		public void SetUp()
-		{
-			// set correct thread culture
-			_currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
-			_currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
-			System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
-		}
-
-
-        [TearDown]
-        public void TearDown() {
-			Utils.RemovePropertyFromAllContexts();
-			// restore previous culture
-			System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
-			System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
-        }
-#endif
-
-        protected virtual PatternLayout NewPatternLayout() {
-            return new PatternLayout();
-        }
-
-        protected virtual PatternLayout NewPatternLayout(string pattern) {
-            return new PatternLayout(pattern);
-        }
-
-        [Test]
-		public void TestThreadPropertiesPattern()
-		{
-			StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = NewPatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
-
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread properties value set");
-			stringAppender.Reset();
-
-			ThreadContext.Properties[Utils.PROPERTY_KEY] = "val1";
-
-			log1.Info("TestMessage");
-			Assert.AreEqual("val1", stringAppender.GetString(), "Test thread properties value set");
-			stringAppender.Reset();
-
-			ThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
-
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread properties value removed");
-			stringAppender.Reset();
-		}
-
-#if !NETSTANDARD1_3
-        [Test]
-        public void TestStackTracePattern()
-        {
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = NewPatternLayout("%stacktrace{2}");
-
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestStackTracePattern");
-
-            log1.Info("TestMessage");
-            StringAssert.EndsWith("PatternLayoutTest.TestStackTracePattern", stringAppender.GetString(), "stack trace value set");
-            stringAppender.Reset();
-        }
-#endif
-
-		[Test]
-		public void TestGlobalPropertiesPattern()
-		{
-			StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = NewPatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
-
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestGlobalProperiesPattern");
-
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no global properties value set");
-			stringAppender.Reset();
-
-			GlobalContext.Properties[Utils.PROPERTY_KEY] = "val1";
-
-			log1.Info("TestMessage");
-			Assert.AreEqual("val1", stringAppender.GetString(), "Test global properties value set");
-			stringAppender.Reset();
-
-			GlobalContext.Properties.Remove(Utils.PROPERTY_KEY);
-
-			log1.Info("TestMessage");
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test global properties value removed");
-			stringAppender.Reset();
-		}
-
-		[Test]
-		public void TestAddingCustomPattern()
-		{
-			StringAppender stringAppender = new StringAppender();
-			PatternLayout layout = NewPatternLayout();
-
-			layout.AddConverter("TestAddingCustomPattern", typeof(TestMessagePatternConverter));
-			layout.ConversionPattern = "%TestAddingCustomPattern";
-			layout.ActivateOptions();
-
-			stringAppender.Layout = layout;
-
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
-
-			log1.Info("TestMessage");
-			Assert.AreEqual("TestMessage", stringAppender.GetString(), "%TestAddingCustomPattern not registered");
-			stringAppender.Reset();
-		}
-
-        [Test]
-        public void NamedPatternConverterWithoutPrecisionShouldReturnFullName()
-        {
-            StringAppender stringAppender = new StringAppender();
-            PatternLayout layout = NewPatternLayout();
-            layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
-            layout.ConversionPattern = "%message-as-name";
-            layout.ActivateOptions();
-            stringAppender.Layout = layout;
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
-
-            log1.Info("NoDots");
-            Assert.AreEqual("NoDots", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("One.Dot");
-            Assert.AreEqual("One.Dot", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("Tw.o.Dots");
-            Assert.AreEqual("Tw.o.Dots", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("TrailingDot.");
-            Assert.AreEqual("TrailingDot.", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info(".LeadingDot");
-            Assert.AreEqual(".LeadingDot", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            // empty string and other evil combinations as tests for of-by-one mistakes in index calculations
-            log1.Info(string.Empty);
-            Assert.AreEqual(string.Empty, stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info(".");
-            Assert.AreEqual(".", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("x");
-            Assert.AreEqual("x", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-        }
-
-        [Test]
-        public void NamedPatternConverterWithPrecision1ShouldStripLeadingStuffIfPresent()
-        {
-            StringAppender stringAppender = new StringAppender();
-            PatternLayout layout = NewPatternLayout();
-            layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
-            layout.ConversionPattern = "%message-as-name{1}";
-            layout.ActivateOptions();
-            stringAppender.Layout = layout;
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
-
-            log1.Info("NoDots");
-            Assert.AreEqual("NoDots", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("One.Dot");
-            Assert.AreEqual("Dot", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("Tw.o.Dots");
-            Assert.AreEqual("Dots", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("TrailingDot.");
-            Assert.AreEqual("TrailingDot.", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info(".LeadingDot");
-            Assert.AreEqual("LeadingDot", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            // empty string and other evil combinations as tests for of-by-one mistakes in index calculations
-            log1.Info(string.Empty);
-            Assert.AreEqual(string.Empty, stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("x");
-            Assert.AreEqual("x", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info(".");
-            Assert.AreEqual(".", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-        }
-
-        [Test]
-        public void NamedPatternConverterWithPrecision2ShouldStripLessLeadingStuffIfPresent() {
-            StringAppender stringAppender = new StringAppender();
-            PatternLayout layout = NewPatternLayout();
-            layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
-            layout.ConversionPattern = "%message-as-name{2}";
-            layout.ActivateOptions();
-            stringAppender.Layout = layout;
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
-
-            log1.Info("NoDots");
-            Assert.AreEqual("NoDots", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("One.Dot");
-            Assert.AreEqual("One.Dot", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("Tw.o.Dots");
-            Assert.AreEqual("o.Dots", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("TrailingDot.");
-            Assert.AreEqual("TrailingDot.", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info(".LeadingDot");
-            Assert.AreEqual("LeadingDot", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            // empty string and other evil combinations as tests for of-by-one mistakes in index calculations
-            log1.Info(string.Empty);
-            Assert.AreEqual(string.Empty, stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info("x");
-            Assert.AreEqual("x", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-
-            log1.Info(".");
-            Assert.AreEqual(".", stringAppender.GetString(), "%message-as-name not registered");
-            stringAppender.Reset();
-        }
-
-        /// <summary>
-		/// Converter to include event message
-		/// </summary>
-		private class TestMessagePatternConverter : PatternLayoutConverter
-		{
-			/// <summary>
-			/// Convert the pattern to the rendered message
-			/// </summary>
-			/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-			/// <param name="loggingEvent">the event being logged</param>
-			/// <returns>the relevant location information</returns>
-			protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-			{
-				loggingEvent.WriteRenderedMessage(writer);
-			}
-		}
-
-		[Test]
-		public void TestExceptionPattern()
-		{
-			StringAppender stringAppender = new StringAppender();
-			PatternLayout layout = NewPatternLayout("%exception{stacktrace}");
-			stringAppender.Layout = layout;
-
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestExceptionPattern");
-
-			Exception exception = new Exception("Oh no!");
-			log1.Info("TestMessage", exception);
-
-			Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString());
-
-			stringAppender.Reset();
-		}
-
-        private class MessageAsNamePatternConverter : NamedPatternConverter
-        {
-            protected override string GetFullyQualifiedName(LoggingEvent loggingEvent)
-            {
-                return loggingEvent.MessageObject.ToString();
-            }
-        }
+    [SetUp]
+    public void SetUp()
+    {
+      // set correct thread culture
+      _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+      _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
+      System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
     }
+
+
+    [TearDown]
+    public void TearDown()
+    {
+      Utils.RemovePropertyFromAllContexts();
+      // restore previous culture
+      System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
+      System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
+    }
+#endif
+
+    protected virtual PatternLayout NewPatternLayout()
+    {
+      return new PatternLayout();
+    }
+
+    protected virtual PatternLayout NewPatternLayout(string pattern)
+    {
+      return new PatternLayout(pattern);
+    }
+
+    [Test]
+    public void TestThreadPropertiesPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = NewPatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no thread properties value set");
+      stringAppender.Reset();
+
+      ThreadContext.Properties[Utils.PROPERTY_KEY] = "val1";
+
+      log1.Info("TestMessage");
+      Assert.AreEqual("val1", stringAppender.GetString(), "Test thread properties value set");
+      stringAppender.Reset();
+
+      ThreadContext.Properties.Remove(Utils.PROPERTY_KEY);
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test thread properties value removed");
+      stringAppender.Reset();
+    }
+
+#if !NETSTANDARD1_3
+    [Test]
+    public void TestStackTracePattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = NewPatternLayout("%stacktrace{2}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestStackTracePattern");
+
+      log1.Info("TestMessage");
+      StringAssert.EndsWith("PatternLayoutTest.TestStackTracePattern", stringAppender.GetString(), "stack trace value set");
+      stringAppender.Reset();
+    }
+#endif
+
+    [Test]
+    public void TestGlobalPropertiesPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = NewPatternLayout("%property{" + Utils.PROPERTY_KEY + "}");
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestGlobalProperiesPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test no global properties value set");
+      stringAppender.Reset();
+
+      GlobalContext.Properties[Utils.PROPERTY_KEY] = "val1";
+
+      log1.Info("TestMessage");
+      Assert.AreEqual("val1", stringAppender.GetString(), "Test global properties value set");
+      stringAppender.Reset();
+
+      GlobalContext.Properties.Remove(Utils.PROPERTY_KEY);
+
+      log1.Info("TestMessage");
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString(), "Test global properties value removed");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void TestAddingCustomPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      PatternLayout layout = NewPatternLayout();
+
+      layout.AddConverter("TestAddingCustomPattern", typeof(TestMessagePatternConverter));
+      layout.ConversionPattern = "%TestAddingCustomPattern";
+      layout.ActivateOptions();
+
+      stringAppender.Layout = layout;
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
+
+      log1.Info("TestMessage");
+      Assert.AreEqual("TestMessage", stringAppender.GetString(), "%TestAddingCustomPattern not registered");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void NamedPatternConverterWithoutPrecisionShouldReturnFullName()
+    {
+      StringAppender stringAppender = new StringAppender();
+      PatternLayout layout = NewPatternLayout();
+      layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
+      layout.ConversionPattern = "%message-as-name";
+      layout.ActivateOptions();
+      stringAppender.Layout = layout;
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
+
+      log1.Info("NoDots");
+      Assert.AreEqual("NoDots", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("One.Dot");
+      Assert.AreEqual("One.Dot", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("Tw.o.Dots");
+      Assert.AreEqual("Tw.o.Dots", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("TrailingDot.");
+      Assert.AreEqual("TrailingDot.", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info(".LeadingDot");
+      Assert.AreEqual(".LeadingDot", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      // empty string and other evil combinations as tests for of-by-one mistakes in index calculations
+      log1.Info(string.Empty);
+      Assert.AreEqual(string.Empty, stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info(".");
+      Assert.AreEqual(".", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("x");
+      Assert.AreEqual("x", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void NamedPatternConverterWithPrecision1ShouldStripLeadingStuffIfPresent()
+    {
+      StringAppender stringAppender = new StringAppender();
+      PatternLayout layout = NewPatternLayout();
+      layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
+      layout.ConversionPattern = "%message-as-name{1}";
+      layout.ActivateOptions();
+      stringAppender.Layout = layout;
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
+
+      log1.Info("NoDots");
+      Assert.AreEqual("NoDots", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("One.Dot");
+      Assert.AreEqual("Dot", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("Tw.o.Dots");
+      Assert.AreEqual("Dots", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("TrailingDot.");
+      Assert.AreEqual("TrailingDot.", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info(".LeadingDot");
+      Assert.AreEqual("LeadingDot", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      // empty string and other evil combinations as tests for of-by-one mistakes in index calculations
+      log1.Info(string.Empty);
+      Assert.AreEqual(string.Empty, stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("x");
+      Assert.AreEqual("x", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info(".");
+      Assert.AreEqual(".", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+    }
+
+    [Test]
+    public void NamedPatternConverterWithPrecision2ShouldStripLessLeadingStuffIfPresent()
+    {
+      StringAppender stringAppender = new StringAppender();
+      PatternLayout layout = NewPatternLayout();
+      layout.AddConverter("message-as-name", typeof(MessageAsNamePatternConverter));
+      layout.ConversionPattern = "%message-as-name{2}";
+      layout.ActivateOptions();
+      stringAppender.Layout = layout;
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestAddingCustomPattern");
+
+      log1.Info("NoDots");
+      Assert.AreEqual("NoDots", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("One.Dot");
+      Assert.AreEqual("One.Dot", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("Tw.o.Dots");
+      Assert.AreEqual("o.Dots", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("TrailingDot.");
+      Assert.AreEqual("TrailingDot.", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info(".LeadingDot");
+      Assert.AreEqual("LeadingDot", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      // empty string and other evil combinations as tests for of-by-one mistakes in index calculations
+      log1.Info(string.Empty);
+      Assert.AreEqual(string.Empty, stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info("x");
+      Assert.AreEqual("x", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+
+      log1.Info(".");
+      Assert.AreEqual(".", stringAppender.GetString(), "%message-as-name not registered");
+      stringAppender.Reset();
+    }
+
+    /// <summary>
+    /// Converter to include event message
+    /// </summary>
+    private class TestMessagePatternConverter : PatternLayoutConverter
+    {
+      /// <summary>
+      /// Convert the pattern to the rendered message
+      /// </summary>
+      /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+      /// <param name="loggingEvent">the event being logged</param>
+      /// <returns>the relevant location information</returns>
+      protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+      {
+        loggingEvent.WriteRenderedMessage(writer);
+      }
+    }
+
+    [Test]
+    public void TestExceptionPattern()
+    {
+      StringAppender stringAppender = new StringAppender();
+      PatternLayout layout = NewPatternLayout("%exception{stacktrace}");
+      stringAppender.Layout = layout;
+
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestExceptionPattern");
+
+      Exception exception = new Exception("Oh no!");
+      log1.Info("TestMessage", exception);
+
+      Assert.AreEqual(SystemInfo.NullText, stringAppender.GetString());
+
+      stringAppender.Reset();
+    }
+
+    private class MessageAsNamePatternConverter : NamedPatternConverter
+    {
+      protected override string GetFullyQualifiedName(LoggingEvent loggingEvent)
+      {
+        return loggingEvent.MessageObject.ToString();
+      }
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Layout/XmlLayoutTest.cs b/src/log4net.Tests/Layout/XmlLayoutTest.cs
index 39ca33d..6160dc5 100644
--- a/src/log4net.Tests/Layout/XmlLayoutTest.cs
+++ b/src/log4net.Tests/Layout/XmlLayoutTest.cs
@@ -33,340 +33,349 @@
 
 namespace log4net.Tests.Layout
 {
-	[TestFixture]
-	public class XmlLayoutTest
-	{
+  [TestFixture]
+  public class XmlLayoutTest
+  {
 #if !NETSTANDARD1_3
-		private CultureInfo _currentCulture;
-		private CultureInfo _currentUICulture;
+    private CultureInfo _currentCulture;
+    private CultureInfo _currentUICulture;
 
-		[SetUp]
-		public void SetUp()
-		{
-			// set correct thread culture
-			_currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
-			_currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
-			System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
-		}
+    [SetUp]
+    public void SetUp()
+    {
+      // set correct thread culture
+      _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
+      _currentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
+      System.Threading.Thread.CurrentThread.CurrentCulture = System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;
+    }
 
-		[TearDown]
-		public void TearDown()
-		{
-			// restore previous culture
-			System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
-			System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
-		}
+    [TearDown]
+    public void TearDown()
+    {
+      // restore previous culture
+      System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;
+      System.Threading.Thread.CurrentThread.CurrentUICulture = _currentUICulture;
+    }
 #endif
 
-		/// <summary>
-		/// Build a basic <see cref="LoggingEventData"/> object with some default values.
-		/// </summary>
-		/// <returns>A useful LoggingEventData object</returns>
-		private LoggingEventData CreateBaseEvent()
-		{
-			LoggingEventData ed = new LoggingEventData();
-			ed.Domain = "Tests";
-			ed.ExceptionString = "";
-			ed.Identity = "TestRunner";
-			ed.Level = Level.Info;
-			ed.LocationInfo = new LocationInfo(GetType());
-			ed.LoggerName = "TestLogger";
-			ed.Message = "Test message";
-			ed.ThreadName = "TestThread";
-			ed.TimeStampUtc = DateTime.Today.ToUniversalTime();
-			ed.UserName = "TestRunner";
-			ed.Properties = new PropertiesDictionary();
+    /// <summary>
+    /// Build a basic <see cref="LoggingEventData"/> object with some default values.
+    /// </summary>
+    /// <returns>A useful LoggingEventData object</returns>
+    private LoggingEventData CreateBaseEvent()
+    {
+      LoggingEventData ed = new LoggingEventData();
+      ed.Domain = "Tests";
+      ed.ExceptionString = "";
+      ed.Identity = "TestRunner";
+      ed.Level = Level.Info;
+      ed.LocationInfo = new LocationInfo(GetType());
+      ed.LoggerName = "TestLogger";
+      ed.Message = "Test message";
+      ed.ThreadName = "TestThread";
+      ed.TimeStampUtc = DateTime.Today.ToUniversalTime();
+      ed.UserName = "TestRunner";
+      ed.Properties = new PropertiesDictionary();
 
-			return ed;
-		}
+      return ed;
+    }
 
-		private static string CreateEventNode(string message)
-		{
-			return String.Format("<event logger=\"TestLogger\" timestamp=\"{0}\" level=\"INFO\" thread=\"TestThread\" domain=\"Tests\" identity=\"TestRunner\" username=\"TestRunner\"><message>{1}</message></event>" + Environment.NewLine,
+    private static string CreateEventNode(string message)
+    {
+      return String.Format("<event logger=\"TestLogger\" timestamp=\"{0}\" level=\"INFO\" thread=\"TestThread\" domain=\"Tests\" identity=\"TestRunner\" username=\"TestRunner\"><message>{1}</message></event>" + Environment.NewLine,
 #if NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0 || NETSTANDARD
-			                     XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local),
+                           XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local),
 #else
-			                     XmlConvert.ToString(DateTime.Today),
+                           XmlConvert.ToString(DateTime.Today),
 #endif
-			                     message);
-		}
+                           message);
+    }
 
-		private static string CreateEventNode(string key, string value)
-		{
-			return String.Format("<event logger=\"TestLogger\" timestamp=\"{0}\" level=\"INFO\" thread=\"TestThread\" domain=\"Tests\" identity=\"TestRunner\" username=\"TestRunner\"><message>Test message</message><properties><data name=\"{1}\" value=\"{2}\" /></properties></event>" + Environment.NewLine,
+    private static string CreateEventNode(string key, string value)
+    {
+      return String.Format("<event logger=\"TestLogger\" timestamp=\"{0}\" level=\"INFO\" thread=\"TestThread\" domain=\"Tests\" identity=\"TestRunner\" username=\"TestRunner\"><message>Test message</message><properties><data name=\"{1}\" value=\"{2}\" /></properties></event>" + Environment.NewLine,
 #if NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0 || NETSTANDARD
-			                     XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local),
+                           XmlConvert.ToString(DateTime.Today, XmlDateTimeSerializationMode.Local),
 #else
-			                     XmlConvert.ToString(DateTime.Today),
+                           XmlConvert.ToString(DateTime.Today),
 #endif
-			                     key,
-			                     value);
-		}
+                           key,
+                           value);
+    }
 
-		[Test]
-		public void TestBasicEventLogging()
-		{
-			TextWriter writer = new StringWriter();
-			XmlLayout layout = new XmlLayout();
-			LoggingEventData evt = CreateBaseEvent();
+    [Test]
+    public void TestBasicEventLogging()
+    {
+      TextWriter writer = new StringWriter();
+      XmlLayout layout = new XmlLayout();
+      LoggingEventData evt = CreateBaseEvent();
 
-			layout.Format(writer, new LoggingEvent(evt));
+      layout.Format(writer, new LoggingEvent(evt));
 
-			string expected = CreateEventNode("Test message");
+      string expected = CreateEventNode("Test message");
 
-			Assert.AreEqual(expected, writer.ToString());
-		}
+      Assert.AreEqual(expected, writer.ToString());
+    }
 
-		[Test]
-		public void TestIllegalCharacterMasking()
-		{
-			TextWriter writer = new StringWriter();
-			XmlLayout layout = new XmlLayout();
-			LoggingEventData evt = CreateBaseEvent();
+    [Test]
+    public void TestIllegalCharacterMasking()
+    {
+      TextWriter writer = new StringWriter();
+      XmlLayout layout = new XmlLayout();
+      LoggingEventData evt = CreateBaseEvent();
 
-			evt.Message = "This is a masked char->\uFFFF";
+      evt.Message = "This is a masked char->\uFFFF";
 
-			layout.Format(writer, new LoggingEvent(evt));
+      layout.Format(writer, new LoggingEvent(evt));
 
-			string expected = CreateEventNode("This is a masked char-&gt;?");
+      string expected = CreateEventNode("This is a masked char-&gt;?");
 
-			Assert.AreEqual(expected, writer.ToString());
-		}
+      Assert.AreEqual(expected, writer.ToString());
+    }
 
-		[Test]
-		public void TestCDATAEscaping1()
-		{
-			TextWriter writer = new StringWriter();
-			XmlLayout layout = new XmlLayout();
-			LoggingEventData evt = CreateBaseEvent();
+    [Test]
+    public void TestCDATAEscaping1()
+    {
+      TextWriter writer = new StringWriter();
+      XmlLayout layout = new XmlLayout();
+      LoggingEventData evt = CreateBaseEvent();
 
-			//The &'s trigger the use of a cdata block
-			evt.Message = "&&&&&&&Escape this ]]>. End here.";
+      //The &'s trigger the use of a cdata block
+      evt.Message = "&&&&&&&Escape this ]]>. End here.";
 
-			layout.Format(writer, new LoggingEvent(evt));
+      layout.Format(writer, new LoggingEvent(evt));
 
-			string expected = CreateEventNode("<![CDATA[&&&&&&&Escape this ]]>]]<![CDATA[>. End here.]]>");
+      string expected = CreateEventNode("<![CDATA[&&&&&&&Escape this ]]>]]<![CDATA[>. End here.]]>");
 
-			Assert.AreEqual(expected, writer.ToString());
-		}
+      Assert.AreEqual(expected, writer.ToString());
+    }
 
-		[Test]
-		public void TestCDATAEscaping2()
-		{
-			TextWriter writer = new StringWriter();
-			XmlLayout layout = new XmlLayout();
-			LoggingEventData evt = CreateBaseEvent();
+    [Test]
+    public void TestCDATAEscaping2()
+    {
+      TextWriter writer = new StringWriter();
+      XmlLayout layout = new XmlLayout();
+      LoggingEventData evt = CreateBaseEvent();
 
-			//The &'s trigger the use of a cdata block
-			evt.Message = "&&&&&&&Escape the end ]]>";
+      //The &'s trigger the use of a cdata block
+      evt.Message = "&&&&&&&Escape the end ]]>";
 
-			layout.Format(writer, new LoggingEvent(evt));
+      layout.Format(writer, new LoggingEvent(evt));
 
-			string expected = CreateEventNode("<![CDATA[&&&&&&&Escape the end ]]>]]&gt;");
+      string expected = CreateEventNode("<![CDATA[&&&&&&&Escape the end ]]>]]&gt;");
 
-			Assert.AreEqual(expected, writer.ToString());
-		}
+      Assert.AreEqual(expected, writer.ToString());
+    }
 
-		[Test]
-		public void TestCDATAEscaping3()
-		{
-			TextWriter writer = new StringWriter();
-			XmlLayout layout = new XmlLayout();
-			LoggingEventData evt = CreateBaseEvent();
+    [Test]
+    public void TestCDATAEscaping3()
+    {
+      TextWriter writer = new StringWriter();
+      XmlLayout layout = new XmlLayout();
+      LoggingEventData evt = CreateBaseEvent();
 
-			//The &'s trigger the use of a cdata block
-			evt.Message = "]]>&&&&&&&Escape the begining";
+      //The &'s trigger the use of a cdata block
+      evt.Message = "]]>&&&&&&&Escape the begining";
 
-			layout.Format(writer, new LoggingEvent(evt));
+      layout.Format(writer, new LoggingEvent(evt));
 
-			string expected = CreateEventNode("<![CDATA[]]>]]<![CDATA[>&&&&&&&Escape the begining]]>");
+      string expected = CreateEventNode("<![CDATA[]]>]]<![CDATA[>&&&&&&&Escape the begining]]>");
 
-			Assert.AreEqual(expected, writer.ToString());
-		}
+      Assert.AreEqual(expected, writer.ToString());
+    }
 
-		[Test]
-		public void TestBase64EventLogging()
-		{
-			TextWriter writer = new StringWriter();
-			XmlLayout layout = new XmlLayout();
-			LoggingEventData evt = CreateBaseEvent();
+    [Test]
+    public void TestBase64EventLogging()
+    {
+      TextWriter writer = new StringWriter();
+      XmlLayout layout = new XmlLayout();
+      LoggingEventData evt = CreateBaseEvent();
 
-			layout.Base64EncodeMessage = true;
-			layout.Format(writer, new LoggingEvent(evt));
+      layout.Base64EncodeMessage = true;
+      layout.Format(writer, new LoggingEvent(evt));
 
-			string expected = CreateEventNode("VGVzdCBtZXNzYWdl");
+      string expected = CreateEventNode("VGVzdCBtZXNzYWdl");
 
-			Assert.AreEqual(expected, writer.ToString());
-		}
+      Assert.AreEqual(expected, writer.ToString());
+    }
 
-		[Test]
-		public void TestPropertyEventLogging()
-		{
-			LoggingEventData evt = CreateBaseEvent();
-			evt.Properties["Property1"] = "prop1";
+    [Test]
+    public void TestPropertyEventLogging()
+    {
+      LoggingEventData evt = CreateBaseEvent();
+      evt.Properties["Property1"] = "prop1";
 
-			XmlLayout layout = new XmlLayout();
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = layout;
+      XmlLayout layout = new XmlLayout();
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
 
-			log1.Logger.Log(new LoggingEvent(evt));
+      log1.Logger.Log(new LoggingEvent(evt));
 
-			string expected = CreateEventNode("Property1", "prop1");
+      string expected = CreateEventNode("Property1", "prop1");
 
-			Assert.AreEqual(expected, stringAppender.GetString());
-		}
+      Assert.AreEqual(expected, stringAppender.GetString());
+    }
 
-		[Test]
-		public void TestBase64PropertyEventLogging()
-		{
-			LoggingEventData evt = CreateBaseEvent();
-			evt.Properties["Property1"] = "prop1";
+    [Test]
+    public void TestBase64PropertyEventLogging()
+    {
+      LoggingEventData evt = CreateBaseEvent();
+      evt.Properties["Property1"] = "prop1";
 
-			XmlLayout layout = new XmlLayout();
-			layout.Base64EncodeProperties = true;
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = layout;
+      XmlLayout layout = new XmlLayout();
+      layout.Base64EncodeProperties = true;
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
 
-			log1.Logger.Log(new LoggingEvent(evt));
+      log1.Logger.Log(new LoggingEvent(evt));
 
-			string expected = CreateEventNode("Property1", "cHJvcDE=");
+      string expected = CreateEventNode("Property1", "cHJvcDE=");
 
-			Assert.AreEqual(expected, stringAppender.GetString());
-		}
+      Assert.AreEqual(expected, stringAppender.GetString());
+    }
 
-		[Test]
-		public void TestPropertyCharacterEscaping()
-		{
-			LoggingEventData evt = CreateBaseEvent();
-			evt.Properties["Property1"] = "prop1 \"quoted\"";
+    [Test]
+    public void TestPropertyCharacterEscaping()
+    {
+      LoggingEventData evt = CreateBaseEvent();
+      evt.Properties["Property1"] = "prop1 \"quoted\"";
 
-			XmlLayout layout = new XmlLayout();
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = layout;
+      XmlLayout layout = new XmlLayout();
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
 
-			log1.Logger.Log(new LoggingEvent(evt));
+      log1.Logger.Log(new LoggingEvent(evt));
 
-			string expected = CreateEventNode("Property1", "prop1 &quot;quoted&quot;");
+      string expected = CreateEventNode("Property1", "prop1 &quot;quoted&quot;");
 
-			Assert.AreEqual(expected, stringAppender.GetString());
-		}
+      Assert.AreEqual(expected, stringAppender.GetString());
+    }
 
-		[Test]
-		public void TestPropertyIllegalCharacterMasking()
-		{
-			LoggingEventData evt = CreateBaseEvent();
-			evt.Properties["Property1"] = "mask this ->\uFFFF";
+    [Test]
+    public void TestPropertyIllegalCharacterMasking()
+    {
+      LoggingEventData evt = CreateBaseEvent();
+      evt.Properties["Property1"] = "mask this ->\uFFFF";
 
-			XmlLayout layout = new XmlLayout();
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = layout;
+      XmlLayout layout = new XmlLayout();
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
 
-			log1.Logger.Log(new LoggingEvent(evt));
+      log1.Logger.Log(new LoggingEvent(evt));
 
-			string expected = CreateEventNode("Property1", "mask this -&gt;?");
+      string expected = CreateEventNode("Property1", "mask this -&gt;?");
 
-			Assert.AreEqual(expected, stringAppender.GetString());
-		}
+      Assert.AreEqual(expected, stringAppender.GetString());
+    }
 
-		[Test]
-		public void TestPropertyIllegalCharacterMaskingInName()
-		{
-			LoggingEventData evt = CreateBaseEvent();
-			evt.Properties["Property\uFFFF"] = "mask this ->\uFFFF";
+    [Test]
+    public void TestPropertyIllegalCharacterMaskingInName()
+    {
+      LoggingEventData evt = CreateBaseEvent();
+      evt.Properties["Property\uFFFF"] = "mask this ->\uFFFF";
 
-			XmlLayout layout = new XmlLayout();
-			StringAppender stringAppender = new StringAppender();
-			stringAppender.Layout = layout;
+      XmlLayout layout = new XmlLayout();
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-			ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-			BasicConfigurator.Configure(rep, stringAppender);
-			ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestThreadProperiesPattern");
 
-			log1.Logger.Log(new LoggingEvent(evt));
+      log1.Logger.Log(new LoggingEvent(evt));
 
-			string expected = CreateEventNode("Property?", "mask this -&gt;?");
+      string expected = CreateEventNode("Property?", "mask this -&gt;?");
 
-			Assert.AreEqual(expected, stringAppender.GetString());
-		}
+      Assert.AreEqual(expected, stringAppender.GetString());
+    }
 
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-        [Test]
-        public void BracketsInStackTracesKeepLogWellFormed() {
-            XmlLayout layout = new XmlLayout();
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = layout;
+    [Test]
+    public void BracketsInStackTracesKeepLogWellFormed()
+    {
+      XmlLayout layout = new XmlLayout();
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestLogger");
-            Action<int> bar = foo => { 
-                try {
-                    throw new NullReferenceException();
-                } catch (Exception ex) {
-                    log1.Error(string.Format("Error {0}", foo), ex);
-                }
-            };
-            bar(42);
-
-            // really only asserts there is no exception
-            var loggedDoc = new XmlDocument();
-            loggedDoc.LoadXml(stringAppender.GetString());
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogger");
+      Action<int> bar = foo =>
+      {
+        try
+        {
+          throw new NullReferenceException();
         }
+        catch (Exception ex)
+        {
+          log1.Error(string.Format("Error {0}", foo), ex);
+        }
+      };
+      bar(42);
 
-        [Test]
-        public void BracketsInStackTracesAreEscapedProperly() {
-            XmlLayout layout = new XmlLayout();
-            StringAppender stringAppender = new StringAppender();
-            stringAppender.Layout = layout;
+      // really only asserts there is no exception
+      var loggedDoc = new XmlDocument();
+      loggedDoc.LoadXml(stringAppender.GetString());
+    }
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            BasicConfigurator.Configure(rep, stringAppender);
-            ILog log1 = LogManager.GetLogger(rep.Name, "TestLogger");
-            Action<int> bar = foo => {
-                try {
-                    throw new NullReferenceException();
-                }
-                catch (Exception ex) {
-                    log1.Error(string.Format("Error {0}", foo), ex);
-                }
-            };
-            bar(42);
+    [Test]
+    public void BracketsInStackTracesAreEscapedProperly()
+    {
+      XmlLayout layout = new XmlLayout();
+      StringAppender stringAppender = new StringAppender();
+      stringAppender.Layout = layout;
 
-            var log = stringAppender.GetString();
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      BasicConfigurator.Configure(rep, stringAppender);
+      ILog log1 = LogManager.GetLogger(rep.Name, "TestLogger");
+      Action<int> bar = foo =>
+      {
+        try
+        {
+          throw new NullReferenceException();
+        }
+        catch (Exception ex)
+        {
+          log1.Error(string.Format("Error {0}", foo), ex);
+        }
+      };
+      bar(42);
+
+      var log = stringAppender.GetString();
 #if NETSTANDARD1_3
             var startOfExceptionText = log.IndexOf("<exception>", StringComparison.Ordinal) + 11;
             var endOfExceptionText = log.IndexOf("</exception>", StringComparison.Ordinal);
 #else
-            var startOfExceptionText = log.IndexOf("<exception>", StringComparison.InvariantCulture) + 11;
-            var endOfExceptionText = log.IndexOf("</exception>", StringComparison.InvariantCulture);
+      var startOfExceptionText = log.IndexOf("<exception>", StringComparison.InvariantCulture) + 11;
+      var endOfExceptionText = log.IndexOf("</exception>", StringComparison.InvariantCulture);
 #endif
-            var sub = log.Substring(startOfExceptionText, endOfExceptionText - startOfExceptionText);
-            if (sub.StartsWith("<![CDATA["))
-            {
-                StringAssert.EndsWith("]]>", sub);
-            }
-            else
-            {
-                StringAssert.DoesNotContain("<", sub);
-                StringAssert.DoesNotContain(">", sub);
-            }
-        }
+      var sub = log.Substring(startOfExceptionText, endOfExceptionText - startOfExceptionText);
+      if (sub.StartsWith("<![CDATA["))
+      {
+        StringAssert.EndsWith("]]>", sub);
+      }
+      else
+      {
+        StringAssert.DoesNotContain("<", sub);
+        StringAssert.DoesNotContain(">", sub);
+      }
+    }
 #endif
-	}
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs b/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs
index daa2672..c06f9f9 100644
--- a/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs
+++ b/src/log4net.Tests/LoggerRepository/ConfigurationMessages.cs
@@ -31,18 +31,19 @@
 
 namespace log4net.Tests.LoggerRepository
 {
-    [TestFixture]
-    public class ConfigurationMessages
+  [TestFixture]
+  public class ConfigurationMessages
+  {
+    [Test]
+    public void ConfigurationMessagesTest()
     {
-        [Test]
-        public void ConfigurationMessagesTest()
-        {
-            try {
-                LogLog.EmitInternalMessages = false;
-                LogLog.InternalDebugging = true;
+      try
+      {
+        LogLog.EmitInternalMessages = false;
+        LogLog.InternalDebugging = true;
 
-                XmlDocument log4netConfig = new XmlDocument();
-                log4netConfig.LoadXml(@"
+        XmlDocument log4netConfig = new XmlDocument();
+        log4netConfig.LoadXml(@"
                 <log4net>
                   <appender name=""LogLogAppender"" type=""log4net.Tests.LoggerRepository.LogLogAppender, log4net.Tests"">
                     <layout type=""log4net.Layout.SimpleLayout"" />
@@ -57,45 +58,46 @@
                   </root>  
                 </log4net>");
 
-                ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-                rep.ConfigurationChanged += new LoggerRepositoryConfigurationChangedEventHandler(rep_ConfigurationChanged);
+        ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+        rep.ConfigurationChanged += new LoggerRepositoryConfigurationChangedEventHandler(rep_ConfigurationChanged);
 
-                ICollection configurationMessages = XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+        ICollection configurationMessages = XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
 
-                Assert.IsTrue(configurationMessages.Count > 0);
-            }
-            finally {
-                LogLog.EmitInternalMessages = true;
-                LogLog.InternalDebugging = false;
-            }
-        }
-
-        static void rep_ConfigurationChanged(object sender, EventArgs e)
-        {
-            ConfigurationChangedEventArgs configChanged = (ConfigurationChangedEventArgs)e;
-
-            Assert.IsTrue(configChanged.ConfigurationMessages.Count > 0);
-        }
+        Assert.IsTrue(configurationMessages.Count > 0);
+      }
+      finally
+      {
+        LogLog.EmitInternalMessages = true;
+        LogLog.InternalDebugging = false;
+      }
     }
 
-    public class LogLogAppender : AppenderSkeleton
+    static void rep_ConfigurationChanged(object sender, EventArgs e)
     {
-        private static readonly Type declaringType = typeof(LogLogAppender);
+      ConfigurationChangedEventArgs configChanged = (ConfigurationChangedEventArgs)e;
 
-        public override void ActivateOptions()
-        {
-            LogLog.Debug(declaringType, "Debug - Activating options...");
-            LogLog.Warn(declaringType, "Warn - Activating options...");
-            LogLog.Error(declaringType, "Error - Activating options...");
-
-            base.ActivateOptions();
-        }
-
-        protected override void Append(LoggingEvent loggingEvent)
-        {
-            LogLog.Debug(declaringType, "Debug - Appending...");
-            LogLog.Warn(declaringType, "Warn - Appending...");
-            LogLog.Error(declaringType, "Error - Appending...");
-        }
+      Assert.IsTrue(configChanged.ConfigurationMessages.Count > 0);
     }
+  }
+
+  public class LogLogAppender : AppenderSkeleton
+  {
+    private static readonly Type declaringType = typeof(LogLogAppender);
+
+    public override void ActivateOptions()
+    {
+      LogLog.Debug(declaringType, "Debug - Activating options...");
+      LogLog.Warn(declaringType, "Warn - Activating options...");
+      LogLog.Error(declaringType, "Error - Activating options...");
+
+      base.ActivateOptions();
+    }
+
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      LogLog.Debug(declaringType, "Debug - Appending...");
+      LogLog.Warn(declaringType, "Warn - Appending...");
+      LogLog.Error(declaringType, "Error - Appending...");
+    }
+  }
 }
diff --git a/src/log4net.Tests/NUnitTestRunnerInitializer.cs b/src/log4net.Tests/NUnitTestRunnerInitializer.cs
index 90748c0..08b4215 100644
--- a/src/log4net.Tests/NUnitTestRunnerInitializer.cs
+++ b/src/log4net.Tests/NUnitTestRunnerInitializer.cs
@@ -1,16 +1,16 @@
 namespace log4net.Tests
 {
-    using System.IO;
+  using System.IO;
 
-    using NUnit.Framework;
+  using NUnit.Framework;
 
-    [SetUpFixture]
-    public class NUnitTestRunnerInitializer
+  [SetUpFixture]
+  public class NUnitTestRunnerInitializer
+  {
+    [OneTimeSetUp]
+    public void RunBeforeAnyTests()
     {
-        [OneTimeSetUp]
-        public void RunBeforeAnyTests()
-        {
-            Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
-        }
+      Directory.SetCurrentDirectory(TestContext.CurrentContext.TestDirectory);
     }
+  }
 }
diff --git a/src/log4net.Tests/Signing.cs b/src/log4net.Tests/Signing.cs
index 8651674..93d4556 100644
--- a/src/log4net.Tests/Signing.cs
+++ b/src/log4net.Tests/Signing.cs
@@ -5,19 +5,19 @@
 
 namespace log4net.Tests
 {
-    [TestFixture]
-    public class Signing
+  [TestFixture]
+  public class Signing
+  {
+    [Test]
+    public void AssemblyShouldBeSigned()
     {
-        [Test]
-        public void AssemblyShouldBeSigned()
-        {
-            // Arrange
-            var asm = typeof(LoggerRepositorySkeleton).Assembly;
-            // Act
-            var result = asm.GetName().GetPublicKey();
-            // Assert
-            Expect(result)
-                .Not.To.Be.Empty();
-        }       
+      // Arrange
+      var asm = typeof(LoggerRepositorySkeleton).Assembly;
+      // Act
+      var result = asm.GetName().GetPublicKey();
+      // Assert
+      Expect(result)
+          .Not.To.Be.Empty();
     }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Util/CyclicBufferTest.cs b/src/log4net.Tests/Util/CyclicBufferTest.cs
index 3ea7932..0d81c48 100644
--- a/src/log4net.Tests/Util/CyclicBufferTest.cs
+++ b/src/log4net.Tests/Util/CyclicBufferTest.cs
@@ -26,84 +26,84 @@
 
 namespace log4net.Tests.Util
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class CyclicBufferTest
-	{
-		[Test]
-		public void TestConstructorSize0()
-		{
-			Assert.Throws<ArgumentOutOfRangeException>(() => new CyclicBuffer(0));
-		}
+  /// <summary>
+  /// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class CyclicBufferTest
+  {
+    [Test]
+    public void TestConstructorSize0()
+    {
+      Assert.Throws<ArgumentOutOfRangeException>(() => new CyclicBuffer(0));
+    }
 
-		[Test]
-		public void TestSize1()
-		{
-			CyclicBuffer cb = new CyclicBuffer(1);
+    [Test]
+    public void TestSize1()
+    {
+      CyclicBuffer cb = new CyclicBuffer(1);
 
-			Assert.AreEqual(0, cb.Length, "Empty Buffer should have length 0");
-			Assert.AreEqual(1, cb.MaxSize, "Buffer should have max size 1");
+      Assert.AreEqual(0, cb.Length, "Empty Buffer should have length 0");
+      Assert.AreEqual(1, cb.MaxSize, "Buffer should have max size 1");
 
-			LoggingEvent event1 = new LoggingEvent(null, null, null, null, null, null);
-			LoggingEvent event2 = new LoggingEvent(null, null, null, null, null, null);
+      LoggingEvent event1 = new LoggingEvent(null, null, null, null, null, null);
+      LoggingEvent event2 = new LoggingEvent(null, null, null, null, null, null);
 
-			LoggingEvent discardedEvent = cb.Append(event1);
+      LoggingEvent discardedEvent = cb.Append(event1);
 
-			Assert.IsNull(discardedEvent, "No event should be discarded untill the buffer is full");
-			Assert.AreEqual(1, cb.Length, "Buffer should have length 1");
-			Assert.AreEqual(1, cb.MaxSize, "Buffer should still have max size 1");
+      Assert.IsNull(discardedEvent, "No event should be discarded untill the buffer is full");
+      Assert.AreEqual(1, cb.Length, "Buffer should have length 1");
+      Assert.AreEqual(1, cb.MaxSize, "Buffer should still have max size 1");
 
 
-			discardedEvent = cb.Append(event2);
+      discardedEvent = cb.Append(event2);
 
-			Assert.AreSame(event1, discardedEvent, "Expect event1 to now be discarded");
-			Assert.AreEqual(1, cb.Length, "Buffer should still have length 1");
-			Assert.AreEqual(1, cb.MaxSize, "Buffer should really still have max size 1");
+      Assert.AreSame(event1, discardedEvent, "Expect event1 to now be discarded");
+      Assert.AreEqual(1, cb.Length, "Buffer should still have length 1");
+      Assert.AreEqual(1, cb.MaxSize, "Buffer should really still have max size 1");
 
-			LoggingEvent[] discardedEvents = cb.PopAll();
+      LoggingEvent[] discardedEvents = cb.PopAll();
 
-			Assert.AreEqual(1, discardedEvents.Length, "Poped events length should be 1");
-			Assert.AreSame(event2, discardedEvents[0], "Expect event2 to now be popped");
-			Assert.AreEqual(0, cb.Length, "Buffer should be back to length 0");
-			Assert.AreEqual(1, cb.MaxSize, "Buffer should really really still have max size 1");
-		}
+      Assert.AreEqual(1, discardedEvents.Length, "Poped events length should be 1");
+      Assert.AreSame(event2, discardedEvents[0], "Expect event2 to now be popped");
+      Assert.AreEqual(0, cb.Length, "Buffer should be back to length 0");
+      Assert.AreEqual(1, cb.MaxSize, "Buffer should really really still have max size 1");
+    }
 
-		[Test]
-		public void TestSize2()
-		{
-			CyclicBuffer cb = new CyclicBuffer(2);
+    [Test]
+    public void TestSize2()
+    {
+      CyclicBuffer cb = new CyclicBuffer(2);
 
-			Assert.AreEqual(0, cb.Length, "Empty Buffer should have length 0");
-			Assert.AreEqual(2, cb.MaxSize, "Buffer should have max size 2");
+      Assert.AreEqual(0, cb.Length, "Empty Buffer should have length 0");
+      Assert.AreEqual(2, cb.MaxSize, "Buffer should have max size 2");
 
-			LoggingEvent event1 = new LoggingEvent(null, null, null, null, null, null);
-			LoggingEvent event2 = new LoggingEvent(null, null, null, null, null, null);
-			LoggingEvent event3 = new LoggingEvent(null, null, null, null, null, null);
+      LoggingEvent event1 = new LoggingEvent(null, null, null, null, null, null);
+      LoggingEvent event2 = new LoggingEvent(null, null, null, null, null, null);
+      LoggingEvent event3 = new LoggingEvent(null, null, null, null, null, null);
 
-			LoggingEvent discardedEvent;
+      LoggingEvent discardedEvent;
 
-			discardedEvent = cb.Append(event1);
-			Assert.IsNull(discardedEvent, "No event should be discarded after append 1");
-			discardedEvent = cb.Append(event2);
-			Assert.IsNull(discardedEvent, "No event should be discarded after append 2");
+      discardedEvent = cb.Append(event1);
+      Assert.IsNull(discardedEvent, "No event should be discarded after append 1");
+      discardedEvent = cb.Append(event2);
+      Assert.IsNull(discardedEvent, "No event should be discarded after append 2");
 
-			discardedEvent = cb.Append(event3);
-			Assert.AreSame(event1, discardedEvent, "Expect event1 to now be discarded");
+      discardedEvent = cb.Append(event3);
+      Assert.AreSame(event1, discardedEvent, "Expect event1 to now be discarded");
 
-			discardedEvent = cb.PopOldest();
-			Assert.AreSame(event2, discardedEvent, "Expect event2 to now be discarded");
+      discardedEvent = cb.PopOldest();
+      Assert.AreSame(event2, discardedEvent, "Expect event2 to now be discarded");
 
-			LoggingEvent[] discardedEvents = cb.PopAll();
+      LoggingEvent[] discardedEvents = cb.PopAll();
 
-			Assert.AreEqual(1, discardedEvents.Length, "Poped events length should be 1");
-			Assert.AreSame(event3, discardedEvents[0], "Expect event3 to now be popped");
-			Assert.AreEqual(0, cb.Length, "Buffer should be back to length 0");
-			Assert.AreEqual(2, cb.MaxSize, "Buffer should really really still have max size 2");
-		}
-	}
+      Assert.AreEqual(1, discardedEvents.Length, "Poped events length should be 1");
+      Assert.AreSame(event3, discardedEvents[0], "Expect event3 to now be popped");
+      Assert.AreEqual(0, cb.Length, "Buffer should be back to length 0");
+      Assert.AreEqual(2, cb.MaxSize, "Buffer should really really still have max size 2");
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs b/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs
index cced28c..da11594 100644
--- a/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs
+++ b/src/log4net.Tests/Util/EnvironmentPatternConverterTest.cs
@@ -29,88 +29,90 @@
 
 namespace log4net.Tests.Util
 {
-    [TestFixture]
-    public class EnvironmentPatternConverterTest
+  [TestFixture]
+  public class EnvironmentPatternConverterTest
+  {
+    private const string ENVIRONMENT_VARIABLE_NAME = "LOG4NET_TEST_TEMP";
+    const string SYSTEM_LEVEL_VALUE = "SystemLevelEnvironmentValue";
+    const string USER_LEVEL_VALUE = "UserLevelEnvironmentValue";
+    const string PROCESS_LEVEL_VALUE = "ProcessLevelEnvironmentValue";
+
+    [Test]
+    public void SystemLevelEnvironmentVariable()
     {
-        private const string ENVIRONMENT_VARIABLE_NAME = "LOG4NET_TEST_TEMP";
-        const string SYSTEM_LEVEL_VALUE = "SystemLevelEnvironmentValue";
-        const string USER_LEVEL_VALUE = "UserLevelEnvironmentValue";
-        const string PROCESS_LEVEL_VALUE = "ProcessLevelEnvironmentValue";
+      EnvironmentPatternConverter converter = new EnvironmentPatternConverter();
+      try
+      {
+        Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, SYSTEM_LEVEL_VALUE, EnvironmentVariableTarget.Machine);
+      }
+      catch (System.Security.SecurityException)
+      {
+        Assert.Ignore("Test skipped as current user must not set system level environment variables");
+      }
 
-        [Test]
-        public void SystemLevelEnvironmentVariable()
-        {
-            EnvironmentPatternConverter converter = new EnvironmentPatternConverter();
-            try {
-                Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, SYSTEM_LEVEL_VALUE, EnvironmentVariableTarget.Machine);
-            }
-            catch (System.Security.SecurityException) {
-                Assert.Ignore("Test skipped as current user must not set system level environment variables");
-            }
+      converter.Option = ENVIRONMENT_VARIABLE_NAME;
 
-            converter.Option = ENVIRONMENT_VARIABLE_NAME;
+      StringWriter sw = new StringWriter();
+      converter.Convert(sw, null);
 
-			StringWriter sw = new StringWriter();
-			converter.Convert(sw, null);
+      Assert.AreEqual(SYSTEM_LEVEL_VALUE, sw.ToString(), "System level environment variable not expended correctly.");
 
-            Assert.AreEqual(SYSTEM_LEVEL_VALUE, sw.ToString(), "System level environment variable not expended correctly.");
-
-            Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null, EnvironmentVariableTarget.Machine);
-        }
-
-        [Test]
-        public void UserLevelEnvironmentVariable()
-        {
-            EnvironmentPatternConverter converter = new EnvironmentPatternConverter();
-            Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, USER_LEVEL_VALUE, EnvironmentVariableTarget.User);
-
-            converter.Option = ENVIRONMENT_VARIABLE_NAME;
-
-            StringWriter sw = new StringWriter();
-            converter.Convert(sw, null);
-
-            Assert.AreEqual(USER_LEVEL_VALUE, sw.ToString(), "User level environment variable not expended correctly.");
-
-            Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null, EnvironmentVariableTarget.User);
-        }
-
-        [Test]
-        public void ProcessLevelEnvironmentVariable()
-        {
-            EnvironmentPatternConverter converter = new EnvironmentPatternConverter();
-            Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, PROCESS_LEVEL_VALUE);
-
-            converter.Option = ENVIRONMENT_VARIABLE_NAME;
-
-            StringWriter sw = new StringWriter();
-            converter.Convert(sw, null);
-
-            Assert.AreEqual(PROCESS_LEVEL_VALUE, sw.ToString(), "Process level environment variable not expended correctly.");
-
-            Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null);
-        }
-
-        private class EnvironmentPatternConverter
-        {
-            private object target = null;
-
-            public EnvironmentPatternConverter()
-            {
-                target = Utils.CreateInstance("log4net.Util.PatternStringConverters.EnvironmentPatternConverter,log4net");
-            }
-
-            public string Option
-            {
-                get { return Utils.GetProperty(target, "Option") as string; }
-                set { Utils.SetProperty(target, "Option", value); }
-            }
-
-            public void Convert(TextWriter writer, object state)
-            {
-                Utils.InvokeMethod(target, "Convert", writer, state);
-            }
-        }
+      Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null, EnvironmentVariableTarget.Machine);
     }
+
+    [Test]
+    public void UserLevelEnvironmentVariable()
+    {
+      EnvironmentPatternConverter converter = new EnvironmentPatternConverter();
+      Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, USER_LEVEL_VALUE, EnvironmentVariableTarget.User);
+
+      converter.Option = ENVIRONMENT_VARIABLE_NAME;
+
+      StringWriter sw = new StringWriter();
+      converter.Convert(sw, null);
+
+      Assert.AreEqual(USER_LEVEL_VALUE, sw.ToString(), "User level environment variable not expended correctly.");
+
+      Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null, EnvironmentVariableTarget.User);
+    }
+
+    [Test]
+    public void ProcessLevelEnvironmentVariable()
+    {
+      EnvironmentPatternConverter converter = new EnvironmentPatternConverter();
+      Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, PROCESS_LEVEL_VALUE);
+
+      converter.Option = ENVIRONMENT_VARIABLE_NAME;
+
+      StringWriter sw = new StringWriter();
+      converter.Convert(sw, null);
+
+      Assert.AreEqual(PROCESS_LEVEL_VALUE, sw.ToString(), "Process level environment variable not expended correctly.");
+
+      Environment.SetEnvironmentVariable(ENVIRONMENT_VARIABLE_NAME, null);
+    }
+
+    private class EnvironmentPatternConverter
+    {
+      private object target = null;
+
+      public EnvironmentPatternConverter()
+      {
+        target = Utils.CreateInstance("log4net.Util.PatternStringConverters.EnvironmentPatternConverter,log4net");
+      }
+
+      public string Option
+      {
+        get { return Utils.GetProperty(target, "Option") as string; }
+        set { Utils.SetProperty(target, "Option", value); }
+      }
+
+      public void Convert(TextWriter writer, object state)
+      {
+        Utils.InvokeMethod(target, "Convert", writer, state);
+      }
+    }
+  }
 }
 
 #endif
diff --git a/src/log4net.Tests/Util/LogLogTest.cs b/src/log4net.Tests/Util/LogLogTest.cs
index 7d9030b..d9fcf4f 100644
--- a/src/log4net.Tests/Util/LogLogTest.cs
+++ b/src/log4net.Tests/Util/LogLogTest.cs
@@ -26,84 +26,86 @@
 
 namespace log4net.Tests.Util
 {
-    [TestFixture]
-    public class LogLogTest
+  [TestFixture]
+  public class LogLogTest
+  {
+    [Test]
+    public void TraceListenerCounterTest()
     {
-        [Test]
-        public void TraceListenerCounterTest()
-        {
-            TraceListenerCounter listTraceListener = new TraceListenerCounter();
+      TraceListenerCounter listTraceListener = new TraceListenerCounter();
 
-            Trace.Listeners.Clear();
-            Trace.Listeners.Add(listTraceListener);
+      Trace.Listeners.Clear();
+      Trace.Listeners.Add(listTraceListener);
 
-            Trace.Write("Hello");
-            Trace.Write("World");
+      Trace.Write("Hello");
+      Trace.Write("World");
 
-            Assert.AreEqual(2, listTraceListener.Count);
-        }
-
-        [Test]
-        public void EmitInternalMessages()
-        {
-            TraceListenerCounter listTraceListener = new TraceListenerCounter();
-            Trace.Listeners.Clear();
-            Trace.Listeners.Add(listTraceListener);
-            LogLog.Error(GetType(), "Hello");
-            LogLog.Error(GetType(), "World");
-            Trace.Flush();
-            Assert.AreEqual(2, listTraceListener.Count);
-
-            try {
-                LogLog.EmitInternalMessages = false;
-
-                LogLog.Error(GetType(), "Hello");
-                LogLog.Error(GetType(), "World");
-                Assert.AreEqual(2, listTraceListener.Count);
-            }
-            finally {
-                LogLog.EmitInternalMessages = true;
-            }
-        }
-
-        [Test]
-        public void LogReceivedAdapter()
-        {
-            ArrayList messages = new ArrayList();
-
-            using (new LogLog.LogReceivedAdapter(messages))
-            {
-                LogLog.Debug(GetType(), "Won't be recorded");
-                LogLog.Error(GetType(), "This will be recorded.");
-                LogLog.Error(GetType(), "This will be recorded.");
-            }
-
-            Assert.AreEqual(2, messages.Count);
-        }
+      Assert.AreEqual(2, listTraceListener.Count);
     }
 
-    public class TraceListenerCounter : TraceListener
+    [Test]
+    public void EmitInternalMessages()
     {
-        private int count = 0;
+      TraceListenerCounter listTraceListener = new TraceListenerCounter();
+      Trace.Listeners.Clear();
+      Trace.Listeners.Add(listTraceListener);
+      LogLog.Error(GetType(), "Hello");
+      LogLog.Error(GetType(), "World");
+      Trace.Flush();
+      Assert.AreEqual(2, listTraceListener.Count);
 
-        public override void Write(string message)
-        {
-            count++;
-        }
+      try
+      {
+        LogLog.EmitInternalMessages = false;
 
-        public override void WriteLine(string message)
-        {
-            Write(message);
-        }
-
-        public void Reset()
-        {
-            count = 0;
-        }
-
-        public int Count
-        {
-            get { return count; }
-        }
+        LogLog.Error(GetType(), "Hello");
+        LogLog.Error(GetType(), "World");
+        Assert.AreEqual(2, listTraceListener.Count);
+      }
+      finally
+      {
+        LogLog.EmitInternalMessages = true;
+      }
     }
+
+    [Test]
+    public void LogReceivedAdapter()
+    {
+      ArrayList messages = new ArrayList();
+
+      using (new LogLog.LogReceivedAdapter(messages))
+      {
+        LogLog.Debug(GetType(), "Won't be recorded");
+        LogLog.Error(GetType(), "This will be recorded.");
+        LogLog.Error(GetType(), "This will be recorded.");
+      }
+
+      Assert.AreEqual(2, messages.Count);
+    }
+  }
+
+  public class TraceListenerCounter : TraceListener
+  {
+    private int count = 0;
+
+    public override void Write(string message)
+    {
+      count++;
+    }
+
+    public override void WriteLine(string message)
+    {
+      Write(message);
+    }
+
+    public void Reset()
+    {
+      count = 0;
+    }
+
+    public int Count
+    {
+      get { return count; }
+    }
+  }
 }
diff --git a/src/log4net.Tests/Util/PatternConverterTest.cs b/src/log4net.Tests/Util/PatternConverterTest.cs
index 06f352e..e8830f3 100644
--- a/src/log4net.Tests/Util/PatternConverterTest.cs
+++ b/src/log4net.Tests/Util/PatternConverterTest.cs
@@ -32,14 +32,14 @@
 
 namespace log4net.Tests.Util
 {
-    [TestFixture]
-    public class PatternConverterTest
+  [TestFixture]
+  public class PatternConverterTest
+  {
+    [Test]
+    public void PatternLayoutConverterProperties()
     {
-        [Test]
-        public void PatternLayoutConverterProperties()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            log4netConfig.LoadXml(@"
+      XmlDocument log4netConfig = new XmlDocument();
+      log4netConfig.LoadXml(@"
                 <log4net>
                   <appender name=""StringAppender"" type=""log4net.Tests.Appender.StringAppender, log4net.Tests"">
                     <layout type=""log4net.Layout.PatternLayout"">
@@ -64,27 +64,27 @@
                   </root>  
                 </log4net>");
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
 
-            ILog log = LogManager.GetLogger(rep.Name, "PatternLayoutConverterProperties");
-            log.Debug("Message");
+      ILog log = LogManager.GetLogger(rep.Name, "PatternLayoutConverterProperties");
+      log.Debug("Message");
 
-            PropertyKeyCountPatternLayoutConverter converter = 
-                PropertyKeyCountPatternLayoutConverter.MostRecentInstance;
-            Assert.AreEqual(2, converter.Properties.Count);
-            Assert.AreEqual("4", converter.Properties["two-plus-two"]);
+      PropertyKeyCountPatternLayoutConverter converter =
+          PropertyKeyCountPatternLayoutConverter.MostRecentInstance;
+      Assert.AreEqual(2, converter.Properties.Count);
+      Assert.AreEqual("4", converter.Properties["two-plus-two"]);
 
-            StringAppender appender = 
-                (StringAppender)LogManager.GetRepository(rep.Name).GetAppenders()[0];
-            Assert.AreEqual("2", appender.GetString());
-        }
+      StringAppender appender =
+          (StringAppender)LogManager.GetRepository(rep.Name).GetAppenders()[0];
+      Assert.AreEqual("2", appender.GetString());
+    }
 
-        [Test]
-        public void PatternConverterProperties()
-        {
-            XmlDocument log4netConfig = new XmlDocument();
-            log4netConfig.LoadXml(@"
+    [Test]
+    public void PatternConverterProperties()
+    {
+      XmlDocument log4netConfig = new XmlDocument();
+      log4netConfig.LoadXml(@"
                 <log4net>
                   <appender name=""PatternStringAppender"" type=""log4net.Tests.Util.PatternStringAppender, log4net.Tests"">
                     <layout type=""log4net.Layout.SimpleLayout"" />
@@ -110,83 +110,83 @@
                   </root>  
                 </log4net>");
 
-            ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
-            XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
+      ILoggerRepository rep = LogManager.CreateRepository(Guid.NewGuid().ToString());
+      XmlConfigurator.Configure(rep, log4netConfig["log4net"]);
 
-            ILog log = LogManager.GetLogger(rep.Name, "PatternConverterProperties");
-            log.Debug("Message");
+      ILog log = LogManager.GetLogger(rep.Name, "PatternConverterProperties");
+      log.Debug("Message");
 
-            PropertyKeyCountPatternConverter converter =
-                PropertyKeyCountPatternConverter.MostRecentInstance;
-            Assert.AreEqual(2, converter.Properties.Count);
-            Assert.AreEqual("4", converter.Properties["two-plus-two"]);
+      PropertyKeyCountPatternConverter converter =
+          PropertyKeyCountPatternConverter.MostRecentInstance;
+      Assert.AreEqual(2, converter.Properties.Count);
+      Assert.AreEqual("4", converter.Properties["two-plus-two"]);
 
-            PatternStringAppender appender =
-                (PatternStringAppender)LogManager.GetRepository(rep.Name).GetAppenders()[0];
-            Assert.AreEqual("2", appender.Setting.Format());
-        }
+      PatternStringAppender appender =
+          (PatternStringAppender)LogManager.GetRepository(rep.Name).GetAppenders()[0];
+      Assert.AreEqual("2", appender.Setting.Format());
     }
+  }
 
-    public class PropertyKeyCountPatternLayoutConverter : PatternLayoutConverter
+  public class PropertyKeyCountPatternLayoutConverter : PatternLayoutConverter
+  {
+    private static PropertyKeyCountPatternLayoutConverter mostRecentInstance;
+
+    public PropertyKeyCountPatternLayoutConverter()
     {
-        private static PropertyKeyCountPatternLayoutConverter mostRecentInstance;
-
-        public PropertyKeyCountPatternLayoutConverter()
-        {
-            mostRecentInstance = this;
-        }
-
-        protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-        {
-            writer.Write(Properties.GetKeys().Length);
-        }
-
-        public static PropertyKeyCountPatternLayoutConverter MostRecentInstance
-        {
-            get { return mostRecentInstance; }
-        }
+      mostRecentInstance = this;
     }
 
-    public class PropertyKeyCountPatternConverter : PatternConverter
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
     {
-        private static PropertyKeyCountPatternConverter mostRecentInstance;
-
-        public PropertyKeyCountPatternConverter()
-        {
-            mostRecentInstance = this;
-        }
-
-        protected override void Convert(TextWriter writer, object state)
-        {
-            writer.Write(Properties.GetKeys().Length);
-        }
-
-        public static PropertyKeyCountPatternConverter MostRecentInstance
-        {
-            get { return mostRecentInstance; }
-        }
+      writer.Write(Properties.GetKeys().Length);
     }
 
-    public class PatternStringAppender : StringAppender
+    public static PropertyKeyCountPatternLayoutConverter MostRecentInstance
     {
-        private static PatternStringAppender mostRecentInstace;
-
-        private PatternString setting;
-
-        public PatternStringAppender()
-        {
-            mostRecentInstace = this;
-        }
-
-        public PatternString Setting
-        {
-            get { return setting; }
-            set { setting = value; }
-        }
-
-        public static PatternStringAppender MostRecentInstace
-        {
-            get { return mostRecentInstace; }
-        }
+      get { return mostRecentInstance; }
     }
+  }
+
+  public class PropertyKeyCountPatternConverter : PatternConverter
+  {
+    private static PropertyKeyCountPatternConverter mostRecentInstance;
+
+    public PropertyKeyCountPatternConverter()
+    {
+      mostRecentInstance = this;
+    }
+
+    protected override void Convert(TextWriter writer, object state)
+    {
+      writer.Write(Properties.GetKeys().Length);
+    }
+
+    public static PropertyKeyCountPatternConverter MostRecentInstance
+    {
+      get { return mostRecentInstance; }
+    }
+  }
+
+  public class PatternStringAppender : StringAppender
+  {
+    private static PatternStringAppender mostRecentInstace;
+
+    private PatternString setting;
+
+    public PatternStringAppender()
+    {
+      mostRecentInstace = this;
+    }
+
+    public PatternString Setting
+    {
+      get { return setting; }
+      set { setting = value; }
+    }
+
+    public static PatternStringAppender MostRecentInstace
+    {
+      get { return mostRecentInstace; }
+    }
+  }
 }
diff --git a/src/log4net.Tests/Util/PatternStringTest.cs b/src/log4net.Tests/Util/PatternStringTest.cs
index e15bebe..3f5d52e 100644
--- a/src/log4net.Tests/Util/PatternStringTest.cs
+++ b/src/log4net.Tests/Util/PatternStringTest.cs
@@ -30,86 +30,86 @@
 
 namespace log4net.Tests.Util
 {
-    [TestFixture]
-    public class PatternStringTest : MarshalByRefObject
+  [TestFixture]
+  public class PatternStringTest : MarshalByRefObject
+  {
+    [Test]
+    public void TestEnvironmentFolderPathPatternConverter()
     {
-        [Test]
-        public void TestEnvironmentFolderPathPatternConverter()
-        {
-            string[] specialFolderNames = Enum.GetNames(typeof(Environment.SpecialFolder));
+      string[] specialFolderNames = Enum.GetNames(typeof(Environment.SpecialFolder));
 
-            foreach (string specialFolderName in specialFolderNames)
-            {
-                string pattern = "%envFolderPath{" + specialFolderName + "}";
+      foreach (string specialFolderName in specialFolderNames)
+      {
+        string pattern = "%envFolderPath{" + specialFolderName + "}";
 
-                PatternString patternString = new PatternString(pattern);
+        PatternString patternString = new PatternString(pattern);
 
-                string evaluatedPattern = patternString.Format();
+        string evaluatedPattern = patternString.Format();
 
-                Environment.SpecialFolder specialFolder = 
-                    (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), specialFolderName);
+        Environment.SpecialFolder specialFolder =
+            (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), specialFolderName);
 
-                Assert.AreEqual(Environment.GetFolderPath(specialFolder), evaluatedPattern);
-            }
-        }
+        Assert.AreEqual(Environment.GetFolderPath(specialFolder), evaluatedPattern);
+      }
+    }
 
-        [Test]
-        public void TestAppSettingPathConverter()
-        {
-            string configurationFileContent = @"
+    [Test]
+    public void TestAppSettingPathConverter()
+    {
+      string configurationFileContent = @"
 <configuration>
   <appSettings>
     <add key=""TestKey"" value = ""TestValue"" />
   </appSettings>
 </configuration>
 ";
-            string configurationFileName = null;
-            AppDomain appDomain = null;
-            try
-            {
-                configurationFileName = CreateTempConfigFile(configurationFileContent);
-                appDomain = CreateConfiguredDomain("AppSettingsTestDomain", configurationFileName);
+      string configurationFileName = null;
+      AppDomain appDomain = null;
+      try
+      {
+        configurationFileName = CreateTempConfigFile(configurationFileContent);
+        appDomain = CreateConfiguredDomain("AppSettingsTestDomain", configurationFileName);
 
-                PatternStringTest pst = (PatternStringTest)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, this.GetType().FullName);
-                pst.TestAppSettingPathConverterInConfiguredDomain();
-            }
-            finally
-            {
-                if (appDomain != null) AppDomain.Unload(appDomain);
-                if (configurationFileName != null) File.Delete(configurationFileName);
-            }
-        }
-
-        public void TestAppSettingPathConverterInConfiguredDomain()
-        {
-            string pattern = "%appSetting{TestKey}";
-            PatternString patternString = new PatternString(pattern);
-            string evaluatedPattern = patternString.Format();
-            string appSettingValue = ConfigurationManager.AppSettings["TestKey"];
-            Assert.AreEqual("TestValue", appSettingValue, "Expected configuration file to contain a key TestKey with the value TestValue");
-            Assert.AreEqual(appSettingValue, evaluatedPattern, "Evaluated pattern expected to be identical to appSetting value");
-
-            string badPattern = "%appSetting{UnknownKey}";
-            patternString = new PatternString(badPattern);
-            evaluatedPattern = patternString.Format();
-            Assert.AreEqual("(null)", evaluatedPattern, "Evaluated pattern expected to be \"(null)\" for non-existent appSettings key");
-        }
-
-        private static string CreateTempConfigFile(string configurationFileContent)
-        {
-            string fileName = Path.GetTempFileName();
-            File.WriteAllText(fileName, configurationFileContent);
-            return fileName;
-        }
-
-        private static AppDomain CreateConfiguredDomain(string domainName, string configurationFileName)
-        {
-            AppDomainSetup ads = new AppDomainSetup();
-            ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
-            ads.ConfigurationFile = configurationFileName;
-            AppDomain ad = AppDomain.CreateDomain(domainName, null, ads);
-            return ad;
-        }
+        PatternStringTest pst = (PatternStringTest)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, this.GetType().FullName);
+        pst.TestAppSettingPathConverterInConfiguredDomain();
+      }
+      finally
+      {
+        if (appDomain != null) AppDomain.Unload(appDomain);
+        if (configurationFileName != null) File.Delete(configurationFileName);
+      }
     }
+
+    public void TestAppSettingPathConverterInConfiguredDomain()
+    {
+      string pattern = "%appSetting{TestKey}";
+      PatternString patternString = new PatternString(pattern);
+      string evaluatedPattern = patternString.Format();
+      string appSettingValue = ConfigurationManager.AppSettings["TestKey"];
+      Assert.AreEqual("TestValue", appSettingValue, "Expected configuration file to contain a key TestKey with the value TestValue");
+      Assert.AreEqual(appSettingValue, evaluatedPattern, "Evaluated pattern expected to be identical to appSetting value");
+
+      string badPattern = "%appSetting{UnknownKey}";
+      patternString = new PatternString(badPattern);
+      evaluatedPattern = patternString.Format();
+      Assert.AreEqual("(null)", evaluatedPattern, "Evaluated pattern expected to be \"(null)\" for non-existent appSettings key");
+    }
+
+    private static string CreateTempConfigFile(string configurationFileContent)
+    {
+      string fileName = Path.GetTempFileName();
+      File.WriteAllText(fileName, configurationFileContent);
+      return fileName;
+    }
+
+    private static AppDomain CreateConfiguredDomain(string domainName, string configurationFileName)
+    {
+      AppDomainSetup ads = new AppDomainSetup();
+      ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
+      ads.ConfigurationFile = configurationFileName;
+      AppDomain ad = AppDomain.CreateDomain(domainName, null, ads);
+      return ad;
+    }
+  }
 }
 #endif
diff --git a/src/log4net.Tests/Util/PropertiesDictionaryTest.cs b/src/log4net.Tests/Util/PropertiesDictionaryTest.cs
index e44f4a8..8f12f60 100644
--- a/src/log4net.Tests/Util/PropertiesDictionaryTest.cs
+++ b/src/log4net.Tests/Util/PropertiesDictionaryTest.cs
@@ -28,44 +28,44 @@
 
 namespace log4net.Tests.Util
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class PropertiesDictionaryTest
-	{
-		[Test]
-		public void TestSerialization()
-		{
-			PropertiesDictionary pd = new PropertiesDictionary();
+  /// <summary>
+  /// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="PropertiesDictionary"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class PropertiesDictionaryTest
+  {
+    [Test]
+    public void TestSerialization()
+    {
+      PropertiesDictionary pd = new PropertiesDictionary();
 
-			for(int i = 0; i < 10; i++)
-			{
-				pd[i.ToString()] = i;
-			}
+      for (int i = 0; i < 10; i++)
+      {
+        pd[i.ToString()] = i;
+      }
 
-			Assert.AreEqual(10, pd.Count, "Dictionary should have 10 items");
+      Assert.AreEqual(10, pd.Count, "Dictionary should have 10 items");
 
-			// Serialize the properties into a memory stream
-			BinaryFormatter formatter = new BinaryFormatter();
-			MemoryStream memory = new MemoryStream();
-			formatter.Serialize(memory, pd);
+      // Serialize the properties into a memory stream
+      BinaryFormatter formatter = new BinaryFormatter();
+      MemoryStream memory = new MemoryStream();
+      formatter.Serialize(memory, pd);
 
-			// Deserialize the stream into a new properties dictionary
-			memory.Position = 0;
-			PropertiesDictionary pd2 = (PropertiesDictionary)formatter.Deserialize(memory);
+      // Deserialize the stream into a new properties dictionary
+      memory.Position = 0;
+      PropertiesDictionary pd2 = (PropertiesDictionary)formatter.Deserialize(memory);
 
-			Assert.AreEqual(10, pd2.Count, "Deserialized Dictionary should have 10 items");
+      Assert.AreEqual(10, pd2.Count, "Deserialized Dictionary should have 10 items");
 
-			foreach(string key in pd.GetKeys())
-			{
-				Assert.AreEqual(pd[key], pd2[key], "Check Value Persisted for key [{0}]", key);
-			}
-		}
-	}
+      foreach (string key in pd.GetKeys())
+      {
+        Assert.AreEqual(pd[key], pd2[key], "Check Value Persisted for key [{0}]", key);
+      }
+    }
+  }
 }
 
 #endif
diff --git a/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs b/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs
index e586a9d..adb3e40 100644
--- a/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs
+++ b/src/log4net.Tests/Util/RandomStringPatternConverterTest.cs
@@ -23,68 +23,68 @@
 
 namespace log4net.Tests.Util
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="RandomStringPatternConverter"/> class.
-	/// </summary>
-	/// <remarks>
-	/// Used for internal unit testing the <see cref="RandomStringPatternConverter"/> class.
-	/// </remarks>
-	[TestFixture]
-	public class RandomStringPatternConverterTest
-	{
-		[Test]
-		public void TestConvert()
-		{
-			RandomStringPatternConverter converter = new RandomStringPatternConverter();
+  /// <summary>
+  /// Used for internal unit testing the <see cref="RandomStringPatternConverter"/> class.
+  /// </summary>
+  /// <remarks>
+  /// Used for internal unit testing the <see cref="RandomStringPatternConverter"/> class.
+  /// </remarks>
+  [TestFixture]
+  public class RandomStringPatternConverterTest
+  {
+    [Test]
+    public void TestConvert()
+    {
+      RandomStringPatternConverter converter = new RandomStringPatternConverter();
 
-			// Check default string length
-			StringWriter sw = new StringWriter();
-			converter.Convert(sw, null);
+      // Check default string length
+      StringWriter sw = new StringWriter();
+      converter.Convert(sw, null);
 
-			Assert.AreEqual(4, sw.ToString().Length, "Default string length should be 4");
+      Assert.AreEqual(4, sw.ToString().Length, "Default string length should be 4");
 
-			// Set string length to 7
-			converter.Option = "7";
-			converter.ActivateOptions();
+      // Set string length to 7
+      converter.Option = "7";
+      converter.ActivateOptions();
 
-			sw = new StringWriter();
-			converter.Convert(sw, null);
+      sw = new StringWriter();
+      converter.Convert(sw, null);
 
-			string string1 = sw.ToString();
-			Assert.AreEqual(7, string1.Length, "string length should be 7");
+      string string1 = sw.ToString();
+      Assert.AreEqual(7, string1.Length, "string length should be 7");
 
-			// Check for duplicate result
-			sw = new StringWriter();
-			converter.Convert(sw, null);
+      // Check for duplicate result
+      sw = new StringWriter();
+      converter.Convert(sw, null);
 
-			string string2 = sw.ToString();
-			Assert.IsTrue(string1 != string2, "strings should be different");
-		}
+      string string2 = sw.ToString();
+      Assert.IsTrue(string1 != string2, "strings should be different");
+    }
 
-		private class RandomStringPatternConverter
-		{
-			private object target = null;
+    private class RandomStringPatternConverter
+    {
+      private object target = null;
 
-			public RandomStringPatternConverter()
-			{
-				target = Utils.CreateInstance("log4net.Util.PatternStringConverters.RandomStringPatternConverter,log4net");
-			}
+      public RandomStringPatternConverter()
+      {
+        target = Utils.CreateInstance("log4net.Util.PatternStringConverters.RandomStringPatternConverter,log4net");
+      }
 
-			public string Option
-			{
-				get { return Utils.GetProperty(target, "Option") as string; }
-				set { Utils.SetProperty(target, "Option", value); }
-			}
+      public string Option
+      {
+        get { return Utils.GetProperty(target, "Option") as string; }
+        set { Utils.SetProperty(target, "Option", value); }
+      }
 
-			public void Convert(TextWriter writer, object state)
-			{
-				Utils.InvokeMethod(target, "Convert", writer, state);
-			}
+      public void Convert(TextWriter writer, object state)
+      {
+        Utils.InvokeMethod(target, "Convert", writer, state);
+      }
 
-			public void ActivateOptions()
-			{
-				Utils.InvokeMethod(target, "ActivateOptions");
-			}
-		}
-	}
+      public void ActivateOptions()
+      {
+        Utils.InvokeMethod(target, "ActivateOptions");
+      }
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net.Tests/Util/SystemInfoTest.cs b/src/log4net.Tests/Util/SystemInfoTest.cs
index ee2b518..34d57e4 100644
--- a/src/log4net.Tests/Util/SystemInfoTest.cs
+++ b/src/log4net.Tests/Util/SystemInfoTest.cs
@@ -30,180 +30,181 @@
 
 namespace log4net.Tests.Util
 {
-	/// <summary>
-	/// Used for internal unit testing the <see cref="SystemInfo"/> class.
-	/// </summary>
-	[TestFixture]
-	public class SystemInfoTest
-	{
+  /// <summary>
+  /// Used for internal unit testing the <see cref="SystemInfo"/> class.
+  /// </summary>
+  [TestFixture]
+  public class SystemInfoTest
+  {
 
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		/// <summary>
-		/// It's "does not throw not supported exception" NOT
-		/// "returns 'Dynamic Assembly' string for dynamic assemblies" by purpose.
-		/// <see cref="Assembly.GetCallingAssembly"/> can be JITted and inlined in different release configurations,
-		/// thus we cannot determine what the exact result of this test will be.
-		/// In 'Debug' GetCallingAssembly should return dynamic assembly named: 'Anonymously Hosted DynamicMethods Assembly'
-		/// whereas in 'Release' this will be inlined and the result will be something like 'X:\Y\Z\log4net.Tests.dll'.
-		/// Therefore simple check against dynamic assembly
-		/// in <see cref="SystemInfo.AssemblyLocationInfo"/> to avoid <see cref="NotSupportedException"/> 'Debug' release.
-		/// </summary>
-		[Test]
-		public void TestAssemblyLocationInfoDoesNotThrowNotSupportedExceptionForDynamicAssembly()
-		{
-			var systemInfoAssemblyLocationMethod = GetAssemblyLocationInfoMethodCall();
+    /// <summary>
+    /// It's "does not throw not supported exception" NOT
+    /// "returns 'Dynamic Assembly' string for dynamic assemblies" by purpose.
+    /// <see cref="Assembly.GetCallingAssembly"/> can be JITted and inlined in different release configurations,
+    /// thus we cannot determine what the exact result of this test will be.
+    /// In 'Debug' GetCallingAssembly should return dynamic assembly named: 'Anonymously Hosted DynamicMethods Assembly'
+    /// whereas in 'Release' this will be inlined and the result will be something like 'X:\Y\Z\log4net.Tests.dll'.
+    /// Therefore simple check against dynamic assembly
+    /// in <see cref="SystemInfo.AssemblyLocationInfo"/> to avoid <see cref="NotSupportedException"/> 'Debug' release.
+    /// </summary>
+    [Test]
+    public void TestAssemblyLocationInfoDoesNotThrowNotSupportedExceptionForDynamicAssembly()
+    {
+      var systemInfoAssemblyLocationMethod = GetAssemblyLocationInfoMethodCall();
 
-			Assert.DoesNotThrow(() => systemInfoAssemblyLocationMethod());
-		}
+      Assert.DoesNotThrow(() => systemInfoAssemblyLocationMethod());
+    }
 
-		private static Func<string> GetAssemblyLocationInfoMethodCall()
-		{
-			var method = typeof(SystemInfoTest).GetMethod("TestAssemblyLocationInfoMethod", new Type[0]);
-			var methodCall = Expression.Call(null, method, new Expression[0]);
-			return Expression.Lambda<Func<string>>(methodCall, new ParameterExpression[0]).Compile();
-		}
+    private static Func<string> GetAssemblyLocationInfoMethodCall()
+    {
+      var method = typeof(SystemInfoTest).GetMethod("TestAssemblyLocationInfoMethod", new Type[0]);
+      var methodCall = Expression.Call(null, method, new Expression[0]);
+      return Expression.Lambda<Func<string>>(methodCall, new ParameterExpression[0]).Compile();
+    }
 
-		public static string TestAssemblyLocationInfoMethod()
-		{
+    public static string TestAssemblyLocationInfoMethod()
+    {
 #if NETSTANDARD1_3
-			return SystemInfo.AssemblyLocationInfo(typeof(SystemInfoTest).GetTypeInfo().Assembly);
+      return SystemInfo.AssemblyLocationInfo(typeof(SystemInfoTest).GetTypeInfo().Assembly);
 #else
-			return SystemInfo.AssemblyLocationInfo(Assembly.GetCallingAssembly());
+      return SystemInfo.AssemblyLocationInfo(Assembly.GetCallingAssembly());
 #endif
-		}
+    }
 #endif
 
-		[Test]
-		public void TestGetTypeFromStringFullyQualified()
-		{
-			Type t;
+    [Test]
+    public void TestGetTypeFromStringFullyQualified()
+    {
+      Type t;
 
-			t = GetTypeFromString("log4net.Tests.Util.SystemInfoTest,log4net.Tests", false, false);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case sensitive type load");
+      t = GetTypeFromString("log4net.Tests.Util.SystemInfoTest,log4net.Tests", false, false);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case sensitive type load");
 
-			t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,log4net.Tests", false, true);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load caps");
+      t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,log4net.Tests", false, true);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load caps");
 
-			t = GetTypeFromString("log4net.tests.util.systeminfotest,log4net.Tests", false, true);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load lower");
-		}
+      t = GetTypeFromString("log4net.tests.util.systeminfotest,log4net.Tests", false, true);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load lower");
+    }
 
 #if !NETSTANDARD1_3
-		[Test][Platform(Include="Win")]
-		public void TestGetTypeFromStringCaseInsensitiveOnAssemblyName()
-		{
-			Type t;
+    [Test]
+    [Platform(Include = "Win")]
+    public void TestGetTypeFromStringCaseInsensitiveOnAssemblyName()
+    {
+      Type t;
 
-			t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,LOG4NET.TESTS", false, true);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load caps");
+      t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,LOG4NET.TESTS", false, true);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load caps");
 
-			t = GetTypeFromString("log4net.tests.util.systeminfotest,log4net.tests", false, true);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load lower");
-		}
+      t = GetTypeFromString("log4net.tests.util.systeminfotest,log4net.tests", false, true);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load lower");
+    }
 #endif
 
-		[Test]
-		public void TestGetTypeFromStringRelative()
-		{
-			Type t;
+    [Test]
+    public void TestGetTypeFromStringRelative()
+    {
+      Type t;
 
-			t = GetTypeFromString("log4net.Tests.Util.SystemInfoTest", false, false);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case sensitive type load");
+      t = GetTypeFromString("log4net.Tests.Util.SystemInfoTest", false, false);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case sensitive type load");
 
-			t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST", false, true);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load caps");
+      t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST", false, true);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load caps");
 
-			t = GetTypeFromString("log4net.tests.util.systeminfotest", false, true);
-			Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load lower");
-		}
+      t = GetTypeFromString("log4net.tests.util.systeminfotest", false, true);
+      Assert.AreSame(typeof(SystemInfoTest), t, "Test explicit case in-sensitive type load lower");
+    }
 
 #if !NETSTANDARD1_3
-		[Test]
-		public void TestGetTypeFromStringSearch()
-		{
-			Type t;
+    [Test]
+    public void TestGetTypeFromStringSearch()
+    {
+      Type t;
 
-			t = GetTypeFromString("log4net.Util.SystemInfo", false, false);
-			Assert.AreSame(typeof(SystemInfo), t,
+      t = GetTypeFromString("log4net.Util.SystemInfo", false, false);
+      Assert.AreSame(typeof(SystemInfo), t,
                                        string.Format("Test explicit case sensitive type load found {0} rather than {1}",
                                                      t.AssemblyQualifiedName, typeof(SystemInfo).AssemblyQualifiedName));
 
-			t = GetTypeFromString("LOG4NET.UTIL.SYSTEMINFO", false, true);
-			Assert.AreSame(typeof(SystemInfo), t, "Test explicit case in-sensitive type load caps");
+      t = GetTypeFromString("LOG4NET.UTIL.SYSTEMINFO", false, true);
+      Assert.AreSame(typeof(SystemInfo), t, "Test explicit case in-sensitive type load caps");
 
-			t = GetTypeFromString("log4net.util.systeminfo", false, true);
-			Assert.AreSame(typeof(SystemInfo), t, "Test explicit case in-sensitive type load lower");
-		}
+      t = GetTypeFromString("log4net.util.systeminfo", false, true);
+      Assert.AreSame(typeof(SystemInfo), t, "Test explicit case in-sensitive type load lower");
+    }
 #endif
 
-		[Test]
-		public void TestGetTypeFromStringFails1()
-		{
-			Type t;
+    [Test]
+    public void TestGetTypeFromStringFails1()
+    {
+      Type t;
 
-			t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,LOG4NET.TESTS", false, false);
-			Assert.AreSame(null, t, "Test explicit case sensitive fails type load");
+      t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,LOG4NET.TESTS", false, false);
+      Assert.AreSame(null, t, "Test explicit case sensitive fails type load");
 
-			Assert.Throws<TypeLoadException>(() => GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,LOG4NET.TESTS", true, false));
-		}
+      Assert.Throws<TypeLoadException>(() => GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST,LOG4NET.TESTS", true, false));
+    }
 
-		[Test]
-		public void TestGetTypeFromStringFails2()
-		{
-			Type t;
+    [Test]
+    public void TestGetTypeFromStringFails2()
+    {
+      Type t;
 
-			t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST", false, false);
-			Assert.AreSame(null, t, "Test explicit case sensitive fails type load");
+      t = GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST", false, false);
+      Assert.AreSame(null, t, "Test explicit case sensitive fails type load");
 
-            Assert.Throws<TypeLoadException>(() =>  GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST", true, false));
-		}
+      Assert.Throws<TypeLoadException>(() => GetTypeFromString("LOG4NET.TESTS.UTIL.SYSTEMINFOTEST", true, false));
+    }
 
-		// Wraps SystemInfo.GetTypeFromString because the method relies on GetCallingAssembly, which is
-		// unavailable in CoreFX. As a workaround, only overloads which explicitly take a Type or Assembly
-		// are exposed for NETSTANDARD1_3.
-		private Type GetTypeFromString(string typeName, bool throwOnError, bool ignoreCase)
-		{
+    // Wraps SystemInfo.GetTypeFromString because the method relies on GetCallingAssembly, which is
+    // unavailable in CoreFX. As a workaround, only overloads which explicitly take a Type or Assembly
+    // are exposed for NETSTANDARD1_3.
+    private Type GetTypeFromString(string typeName, bool throwOnError, bool ignoreCase)
+    {
 #if NETSTANDARD1_3
-			return SystemInfo.GetTypeFromString(GetType().GetTypeInfo().Assembly, typeName, throwOnError, ignoreCase);
+      return SystemInfo.GetTypeFromString(GetType().GetTypeInfo().Assembly, typeName, throwOnError, ignoreCase);
 #else
-			return SystemInfo.GetTypeFromString(typeName, throwOnError, ignoreCase);
+      return SystemInfo.GetTypeFromString(typeName, throwOnError, ignoreCase);
 #endif
-		}
+    }
 
-        [Test]
-        public void EqualsIgnoringCase_BothNull_true()
-        {
-            Assert.True(SystemInfo.EqualsIgnoringCase(null, null));
-        }
+    [Test]
+    public void EqualsIgnoringCase_BothNull_true()
+    {
+      Assert.True(SystemInfo.EqualsIgnoringCase(null, null));
+    }
 
-        [Test]
-        public void EqualsIgnoringCase_LeftNull_false()
-        {
-            Assert.False(SystemInfo.EqualsIgnoringCase(null, "foo"));
-        }
+    [Test]
+    public void EqualsIgnoringCase_LeftNull_false()
+    {
+      Assert.False(SystemInfo.EqualsIgnoringCase(null, "foo"));
+    }
 
-        [Test]
-        public void EqualsIgnoringCase_RightNull_false()
-        {
-            Assert.False(SystemInfo.EqualsIgnoringCase("foo", null));
-        }
+    [Test]
+    public void EqualsIgnoringCase_RightNull_false()
+    {
+      Assert.False(SystemInfo.EqualsIgnoringCase("foo", null));
+    }
 
-        [Test]
-        public void EqualsIgnoringCase_SameStringsSameCase_true()
-        {
-            Assert.True(SystemInfo.EqualsIgnoringCase("foo", "foo"));
-        }
+    [Test]
+    public void EqualsIgnoringCase_SameStringsSameCase_true()
+    {
+      Assert.True(SystemInfo.EqualsIgnoringCase("foo", "foo"));
+    }
 
-        [Test]
-        public void EqualsIgnoringCase_SameStringsDifferentCase_true()
-        {
-            Assert.True(SystemInfo.EqualsIgnoringCase("foo", "FOO"));
-        }
+    [Test]
+    public void EqualsIgnoringCase_SameStringsDifferentCase_true()
+    {
+      Assert.True(SystemInfo.EqualsIgnoringCase("foo", "FOO"));
+    }
 
-        [Test]
-        public void EqualsIgnoringCase_DifferentStrings_false()
-        {
-            Assert.False(SystemInfo.EqualsIgnoringCase("foo", "foobar"));
-        }
-	}
+    [Test]
+    public void EqualsIgnoringCase_DifferentStrings_false()
+    {
+      Assert.False(SystemInfo.EqualsIgnoringCase("foo", "foobar"));
+    }
+  }
 }
diff --git a/src/log4net.Tests/Util/TransformTest.cs b/src/log4net.Tests/Util/TransformTest.cs
index 7d4026a..216eb13 100644
--- a/src/log4net.Tests/Util/TransformTest.cs
+++ b/src/log4net.Tests/Util/TransformTest.cs
@@ -23,23 +23,24 @@
 
 using NUnit.Framework;
 
-namespace log4net.Tests.Util {
+namespace log4net.Tests.Util
+{
 
-    [TestFixture]
-    public class TransformTest
+  [TestFixture]
+  public class TransformTest
+  {
+    [Test]
+    public void MaskXmlInvalidCharactersAllowsJapaneseCharacters()
     {
-        [Test]
-        public void MaskXmlInvalidCharactersAllowsJapaneseCharacters()
-        {
-            string kome = "\u203B";
-            Assert.AreEqual(kome, Transform.MaskXmlInvalidCharacters(kome, "?"));
-        }
-
-        [Test]
-        public void MaskXmlInvalidCharactersMasks0Char() 
-        {
-            string c = "\u0000";
-            Assert.AreEqual("?", Transform.MaskXmlInvalidCharacters(c, "?"));
-        }
+      string kome = "\u203B";
+      Assert.AreEqual(kome, Transform.MaskXmlInvalidCharacters(kome, "?"));
     }
+
+    [Test]
+    public void MaskXmlInvalidCharactersMasks0Char()
+    {
+      string c = "\u0000";
+      Assert.AreEqual("?", Transform.MaskXmlInvalidCharacters(c, "?"));
+    }
+  }
 }
diff --git a/src/log4net.Tests/Utils.cs b/src/log4net.Tests/Utils.cs
index ea1bc82..5264ad5 100644
--- a/src/log4net.Tests/Utils.cs
+++ b/src/log4net.Tests/Utils.cs
@@ -23,124 +23,125 @@
 
 namespace log4net.Tests
 {
-	/// <summary>
-	/// Summary description for Class1.
-	/// </summary>
-	public class Utils
-	{
-		private Utils()
-		{
-		}
+  /// <summary>
+  /// Summary description for Class1.
+  /// </summary>
+  public class Utils
+  {
+    private Utils()
+    {
+    }
 
-		public static object CreateInstance(string targetType)
-		{
-			return CreateInstance(Type.GetType(targetType, true, true));
-		}
+    public static object CreateInstance(string targetType)
+    {
+      return CreateInstance(Type.GetType(targetType, true, true));
+    }
 
-		public static object CreateInstance(Type targetType)
-		{
+    public static object CreateInstance(Type targetType)
+    {
 #if NETSTANDARD1_3
 
-			return targetType.GetConstructor(new Type[0]).Invoke(null);
+      return targetType.GetConstructor(new Type[0]).Invoke(null);
 #else
-			return targetType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null).Invoke(null);
+      return targetType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance, null, new Type[0], null).Invoke(null);
 #endif
-		}
+    }
 
-		public static object InvokeMethod(object target, string name, params object[] args)
-		{
+    public static object InvokeMethod(object target, string name, params object[] args)
+    {
 #if NETSTANDARD1_3
-			return target.GetType().GetTypeInfo().GetDeclaredMethod(name).Invoke(target, args);
+      return target.GetType().GetTypeInfo().GetDeclaredMethod(name).Invoke(target, args);
 #else
-			return target.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, null, GetTypesArray(args), null).Invoke(target, args);
+      return target.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, null, GetTypesArray(args), null).Invoke(target, args);
 #endif
-		}
+    }
 
-		public static object InvokeMethod(Type target, string name, params object[] args)
-		{
+    public static object InvokeMethod(Type target, string name, params object[] args)
+    {
 #if NETSTANDARD1_3
-			return target.GetTypeInfo().GetDeclaredMethod(name).Invoke(null, args);
+      return target.GetTypeInfo().GetDeclaredMethod(name).Invoke(null, args);
 #else
-			return target.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static, null, GetTypesArray(args), null).Invoke(null, args);
+      return target.GetMethod(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static, null, GetTypesArray(args), null).Invoke(null, args);
 #endif
-		}
+    }
 
-		public static object GetField(object target, string name)
-		{
-			return target.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target);
-		}
+    public static object GetField(object target, string name)
+    {
+      return target.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target);
+    }
 
-		public static void SetField(object target, string name, object val)
-		{
-			target.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val);
-		}
+    public static void SetField(object target, string name, object val)
+    {
+      target.GetType().GetField(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val);
+    }
 
-		public static object GetProperty(object target, string name)
-		{
-			return target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target, null);
-		}
+    public static object GetProperty(object target, string name)
+    {
+      return target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target, null);
+    }
 
-		public static void SetProperty(object target, string name, object val)
-		{
-			target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val, null);
-		}
+    public static void SetProperty(object target, string name, object val)
+    {
+      target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val, null);
+    }
 
-		public static object GetProperty(object target, string name, params object[] index)
-		{
-			return target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target, index);
-		}
+    public static object GetProperty(object target, string name, params object[] index)
+    {
+      return target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).GetValue(target, index);
+    }
 
-		public static void SetProperty(object target, string name, object val, params object[] index)
-		{
-			target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val, index);
-		}
+    public static void SetProperty(object target, string name, object val, params object[] index)
+    {
+      target.GetType().GetProperty(name, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).SetValue(target, val, index);
+    }
 
-		private static Type[] GetTypesArray(object[] args)
-		{
-			Type[] types = new Type[args.Length];
+    private static Type[] GetTypesArray(object[] args)
+    {
+      Type[] types = new Type[args.Length];
 
-			for(int i = 0; i < args.Length; i++)
-			{
-				if (args[i] == null)
-				{
-					types[i] = typeof(object);
-				}
-				else
-				{
-					types[i] = args[i].GetType();
-				}
-			}
-
-			return types;
-		}
-
-        internal const string PROPERTY_KEY = "prop1";
-
-        internal static void RemovePropertyFromAllContexts() {
-            GlobalContext.Properties.Remove(PROPERTY_KEY);
-            ThreadContext.Properties.Remove(PROPERTY_KEY);
-#if !NETCF
-            LogicalThreadContext.Properties.Remove(PROPERTY_KEY);
-#endif
-        }
-
-        // Wrappers because repository/logger retrieval APIs require an Assembly argument on NETSTANDARD1_3
-        internal static ILog GetLogger(string name)
+      for (int i = 0; i < args.Length; i++)
+      {
+        if (args[i] == null)
         {
+          types[i] = typeof(object);
+        }
+        else
+        {
+          types[i] = args[i].GetType();
+        }
+      }
+
+      return types;
+    }
+
+    internal const string PROPERTY_KEY = "prop1";
+
+    internal static void RemovePropertyFromAllContexts()
+    {
+      GlobalContext.Properties.Remove(PROPERTY_KEY);
+      ThreadContext.Properties.Remove(PROPERTY_KEY);
+#if !NETCF
+      LogicalThreadContext.Properties.Remove(PROPERTY_KEY);
+#endif
+    }
+
+    // Wrappers because repository/logger retrieval APIs require an Assembly argument on NETSTANDARD1_3
+    internal static ILog GetLogger(string name)
+    {
 #if NETSTANDARD1_3
             return LogManager.GetLogger(typeof(Utils).GetTypeInfo().Assembly, name);
 #else
-            return LogManager.GetLogger(name);
+      return LogManager.GetLogger(name);
 #endif
-        }
+    }
 
-        internal static ILoggerRepository GetRepository()
-        {
+    internal static ILoggerRepository GetRepository()
+    {
 #if NETSTANDARD1_3
             return LogManager.GetRepository(typeof(Utils).GetTypeInfo().Assembly);
 #else
-            return LogManager.GetRepository();
+      return LogManager.GetRepository();
 #endif
-        }
     }
+  }
 }
\ No newline at end of file
diff --git a/src/log4net/Appender/AdoNetAppender.cs b/src/log4net/Appender/AdoNetAppender.cs
index c4e3e35..cad90c5 100644
--- a/src/log4net/Appender/AdoNetAppender.cs
+++ b/src/log4net/Appender/AdoNetAppender.cs
@@ -37,1148 +37,1148 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appender that logs to a database.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <see cref="AdoNetAppender"/> appends logging events to a table within a
-	/// database. The appender can be configured to specify the connection 
-	/// string by setting the <see cref="ConnectionString"/> property. 
-	/// The connection type (provider) can be specified by setting the <see cref="ConnectionType"/>
-	/// property. For more information on database connection strings for
-	/// your specific database see <a href="http://www.connectionstrings.com/">http://www.connectionstrings.com/</a>.
-	/// </para>
-	/// <para>
-	/// Records are written into the database either using a prepared
-	/// statement or a stored procedure. The <see cref="CommandType"/> property
-	/// is set to <see cref="System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>) to specify a prepared statement
-	/// or to <see cref="System.Data.CommandType.StoredProcedure"/> (<c>System.Data.CommandType.StoredProcedure</c>) to specify a stored
-	/// procedure.
-	/// </para>
-	/// <para>
-	/// The prepared statement text or the name of the stored procedure
-	/// must be set in the <see cref="CommandText"/> property.
-	/// </para>
-	/// <para>
-	/// The prepared statement or stored procedure can take a number
-	/// of parameters. Parameters are added using the <see cref="AddParameter"/>
-	/// method. This adds a single <see cref="AdoNetAppenderParameter"/> to the
-	/// ordered list of parameters. The <see cref="AdoNetAppenderParameter"/>
-	/// type may be subclassed if required to provide database specific
-	/// functionality. The <see cref="AdoNetAppenderParameter"/> specifies
-	/// the parameter name, database type, size, and how the value should
-	/// be generated using a <see cref="ILayout"/>.
-	/// </para>
-	/// </remarks>
-	/// <example>
-	/// An example of a SQL Server table that could be logged to:
-	/// <code lang="SQL">
-	/// CREATE TABLE [dbo].[Log] ( 
-	///   [ID] [int] IDENTITY (1, 1) NOT NULL ,
-	///   [Date] [datetime] NOT NULL ,
-	///   [Thread] [varchar] (255) NOT NULL ,
-	///   [Level] [varchar] (20) NOT NULL ,
-	///   [Logger] [varchar] (255) NOT NULL ,
-	///   [Message] [varchar] (4000) NOT NULL 
-	/// ) ON [PRIMARY]
-	/// </code>
-	/// </example>
-	/// <example>
-	/// An example configuration to log to the above table:
-	/// <code lang="XML" escaped="true">
-	/// <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender" >
-	///   <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
-	///   <connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;" />
-	///   <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
-	///   <parameter>
-	///     <parameterName value="@log_date" />
-	///     <dbType value="DateTime" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
-	///   </parameter>
-	///   <parameter>
-	///     <parameterName value="@thread" />
-	///     <dbType value="String" />
-	///     <size value="255" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%thread" />
-	///   </parameter>
-	///   <parameter>
-	///     <parameterName value="@log_level" />
-	///     <dbType value="String" />
-	///     <size value="50" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%level" />
-	///   </parameter>
-	///   <parameter>
-	///     <parameterName value="@logger" />
-	///     <dbType value="String" />
-	///     <size value="255" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%logger" />
-	///   </parameter>
-	///   <parameter>
-	///     <parameterName value="@message" />
-	///     <dbType value="String" />
-	///     <size value="4000" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%message" />
-	///   </parameter>
-	/// </appender>
-	/// </code>
-	/// </example>
-	/// <author>Julian Biddle</author>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Lance Nehring</author>
-	public class AdoNetAppender : BufferingAppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Appender that logs to a database.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <see cref="AdoNetAppender"/> appends logging events to a table within a
+  /// database. The appender can be configured to specify the connection 
+  /// string by setting the <see cref="ConnectionString"/> property. 
+  /// The connection type (provider) can be specified by setting the <see cref="ConnectionType"/>
+  /// property. For more information on database connection strings for
+  /// your specific database see <a href="http://www.connectionstrings.com/">http://www.connectionstrings.com/</a>.
+  /// </para>
+  /// <para>
+  /// Records are written into the database either using a prepared
+  /// statement or a stored procedure. The <see cref="CommandType"/> property
+  /// is set to <see cref="System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>) to specify a prepared statement
+  /// or to <see cref="System.Data.CommandType.StoredProcedure"/> (<c>System.Data.CommandType.StoredProcedure</c>) to specify a stored
+  /// procedure.
+  /// </para>
+  /// <para>
+  /// The prepared statement text or the name of the stored procedure
+  /// must be set in the <see cref="CommandText"/> property.
+  /// </para>
+  /// <para>
+  /// The prepared statement or stored procedure can take a number
+  /// of parameters. Parameters are added using the <see cref="AddParameter"/>
+  /// method. This adds a single <see cref="AdoNetAppenderParameter"/> to the
+  /// ordered list of parameters. The <see cref="AdoNetAppenderParameter"/>
+  /// type may be subclassed if required to provide database specific
+  /// functionality. The <see cref="AdoNetAppenderParameter"/> specifies
+  /// the parameter name, database type, size, and how the value should
+  /// be generated using a <see cref="ILayout"/>.
+  /// </para>
+  /// </remarks>
+  /// <example>
+  /// An example of a SQL Server table that could be logged to:
+  /// <code lang="SQL">
+  /// CREATE TABLE [dbo].[Log] ( 
+  ///   [ID] [int] IDENTITY (1, 1) NOT NULL ,
+  ///   [Date] [datetime] NOT NULL ,
+  ///   [Thread] [varchar] (255) NOT NULL ,
+  ///   [Level] [varchar] (20) NOT NULL ,
+  ///   [Logger] [varchar] (255) NOT NULL ,
+  ///   [Message] [varchar] (4000) NOT NULL 
+  /// ) ON [PRIMARY]
+  /// </code>
+  /// </example>
+  /// <example>
+  /// An example configuration to log to the above table:
+  /// <code lang="XML" escaped="true">
+  /// <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender" >
+  ///   <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  ///   <connectionString value="data source=SQLSVR;initial catalog=test_log4net;integrated security=false;persist security info=True;" />
+  ///   <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
+  ///   <parameter>
+  ///     <parameterName value="@log_date" />
+  ///     <dbType value="DateTime" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
+  ///   </parameter>
+  ///   <parameter>
+  ///     <parameterName value="@thread" />
+  ///     <dbType value="String" />
+  ///     <size value="255" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%thread" />
+  ///   </parameter>
+  ///   <parameter>
+  ///     <parameterName value="@log_level" />
+  ///     <dbType value="String" />
+  ///     <size value="50" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%level" />
+  ///   </parameter>
+  ///   <parameter>
+  ///     <parameterName value="@logger" />
+  ///     <dbType value="String" />
+  ///     <size value="255" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%logger" />
+  ///   </parameter>
+  ///   <parameter>
+  ///     <parameterName value="@message" />
+  ///     <dbType value="String" />
+  ///     <size value="4000" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%message" />
+  ///   </parameter>
+  /// </appender>
+  /// </code>
+  /// </example>
+  /// <author>Julian Biddle</author>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Lance Nehring</author>
+  public class AdoNetAppender : BufferingAppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary> 
-		/// Initializes a new instance of the <see cref="AdoNetAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// Public default constructor to initialize a new instance of this class.
-		/// </remarks>
-		public AdoNetAppender()
-		{
-			ConnectionType = "System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
-			UseTransactions = true;
-			CommandType = System.Data.CommandType.Text;
-			m_parameters = new ArrayList();
-			ReconnectOnError = false;
-		}
+    /// <summary> 
+    /// Initializes a new instance of the <see cref="AdoNetAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// Public default constructor to initialize a new instance of this class.
+    /// </remarks>
+    public AdoNetAppender()
+    {
+      ConnectionType = "System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
+      UseTransactions = true;
+      CommandType = System.Data.CommandType.Text;
+      m_parameters = new ArrayList();
+      ReconnectOnError = false;
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the database connection string that is used to connect to 
-		/// the database.
-		/// </summary>
-		/// <value>
-		/// The database connection string used to connect to the database.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The connections string is specific to the connection type.
-		/// See <see cref="ConnectionType"/> for more information.
-		/// </para>
-		/// </remarks>
-		/// <example>Connection string for MS Access via ODBC:
-		/// <code>"DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb"</code>
-		/// </example>
-		/// <example>Another connection string for MS Access via ODBC:
-		/// <code>"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;"</code>
-		/// </example>
-		/// <example>Connection string for MS Access via OLE DB:
-		/// <code>"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;"</code>
-		/// </example>
-		public string ConnectionString
-		{
-			get { return m_connectionString; }
-			set { m_connectionString = value; }
-		}
+    /// <summary>
+    /// Gets or sets the database connection string that is used to connect to 
+    /// the database.
+    /// </summary>
+    /// <value>
+    /// The database connection string used to connect to the database.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The connections string is specific to the connection type.
+    /// See <see cref="ConnectionType"/> for more information.
+    /// </para>
+    /// </remarks>
+    /// <example>Connection string for MS Access via ODBC:
+    /// <code>"DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb"</code>
+    /// </example>
+    /// <example>Another connection string for MS Access via ODBC:
+    /// <code>"Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;"</code>
+    /// </example>
+    /// <example>Connection string for MS Access via OLE DB:
+    /// <code>"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;"</code>
+    /// </example>
+    public string ConnectionString
+    {
+      get { return m_connectionString; }
+      set { m_connectionString = value; }
+    }
 
-		/// <summary>
-		/// The appSettings key from App.Config that contains the connection string.
-		/// </summary>
-		public string AppSettingsKey
-		{
-			get { return m_appSettingsKey; }
-			set { m_appSettingsKey = value; }
-		}
+    /// <summary>
+    /// The appSettings key from App.Config that contains the connection string.
+    /// </summary>
+    public string AppSettingsKey
+    {
+      get { return m_appSettingsKey; }
+      set { m_appSettingsKey = value; }
+    }
 
-		/// <summary>
-		/// The connectionStrings key from App.Config that contains the connection string.
-		/// </summary>
-		/// <remarks>
-		/// This property requires at least .NET 2.0.
-		/// </remarks>
-		public string ConnectionStringName
-		{
-			get { return m_connectionStringName; }
-			set { m_connectionStringName = value; }
-		}
+    /// <summary>
+    /// The connectionStrings key from App.Config that contains the connection string.
+    /// </summary>
+    /// <remarks>
+    /// This property requires at least .NET 2.0.
+    /// </remarks>
+    public string ConnectionStringName
+    {
+      get { return m_connectionStringName; }
+      set { m_connectionStringName = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the type name of the <see cref="IDbConnection"/> connection
-		/// that should be created.
-		/// </summary>
-		/// <value>
-		/// The type name of the <see cref="IDbConnection"/> connection.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The type name of the ADO.NET provider to use.
-		/// </para>
-		/// <para>
-		/// The default is to use the OLE DB provider.
-		/// </para>
-		/// </remarks>
-		/// <example>Use the OLE DB Provider. This is the default value.
-		/// <code>System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
-		/// </example>
-		/// <example>Use the MS SQL Server Provider. 
-		/// <code>System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
-		/// </example>
-		/// <example>Use the ODBC Provider. 
-		/// <code>Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral</code>
-		/// This is an optional package that you can download from 
-		/// <a href="http://msdn.microsoft.com/downloads">http://msdn.microsoft.com/downloads</a> 
-		/// search for <b>ODBC .NET Data Provider</b>.
-		/// </example>
-		/// <example>Use the Oracle Provider. 
-		/// <code>System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
-		/// This is an optional package that you can download from 
-		/// <a href="http://msdn.microsoft.com/downloads">http://msdn.microsoft.com/downloads</a> 
-		/// search for <b>.NET Managed Provider for Oracle</b>.
-		/// </example>
-		public string ConnectionType
-		{
-			get { return m_connectionType; }
-			set { m_connectionType = value; }
-		}
+    /// <summary>
+    /// Gets or sets the type name of the <see cref="IDbConnection"/> connection
+    /// that should be created.
+    /// </summary>
+    /// <value>
+    /// The type name of the <see cref="IDbConnection"/> connection.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The type name of the ADO.NET provider to use.
+    /// </para>
+    /// <para>
+    /// The default is to use the OLE DB provider.
+    /// </para>
+    /// </remarks>
+    /// <example>Use the OLE DB Provider. This is the default value.
+    /// <code>System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
+    /// </example>
+    /// <example>Use the MS SQL Server Provider. 
+    /// <code>System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
+    /// </example>
+    /// <example>Use the ODBC Provider. 
+    /// <code>Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral</code>
+    /// This is an optional package that you can download from 
+    /// <a href="http://msdn.microsoft.com/downloads">http://msdn.microsoft.com/downloads</a> 
+    /// search for <b>ODBC .NET Data Provider</b>.
+    /// </example>
+    /// <example>Use the Oracle Provider. 
+    /// <code>System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</code>
+    /// This is an optional package that you can download from 
+    /// <a href="http://msdn.microsoft.com/downloads">http://msdn.microsoft.com/downloads</a> 
+    /// search for <b>.NET Managed Provider for Oracle</b>.
+    /// </example>
+    public string ConnectionType
+    {
+      get { return m_connectionType; }
+      set { m_connectionType = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the command text that is used to insert logging events
-		/// into the database.
-		/// </summary>
-		/// <value>
-		/// The command text used to insert logging events into the database.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Either the text of the prepared statement or the
-		/// name of the stored procedure to execute to write into
-		/// the database.
-		/// </para>
-		/// <para>
-		/// The <see cref="CommandType"/> property determines if
-		/// this text is a prepared statement or a stored procedure.
-		/// </para>
-		/// <para>
-		/// If this property is not set, the command text is retrieved by invoking
-		/// <see cref="GetLogStatement(LoggingEvent)"/>.
-		/// </para>
-		/// </remarks>
-		public string CommandText
-		{
-			get { return m_commandText; }
-			set { m_commandText = value; }
-		}
+    /// <summary>
+    /// Gets or sets the command text that is used to insert logging events
+    /// into the database.
+    /// </summary>
+    /// <value>
+    /// The command text used to insert logging events into the database.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Either the text of the prepared statement or the
+    /// name of the stored procedure to execute to write into
+    /// the database.
+    /// </para>
+    /// <para>
+    /// The <see cref="CommandType"/> property determines if
+    /// this text is a prepared statement or a stored procedure.
+    /// </para>
+    /// <para>
+    /// If this property is not set, the command text is retrieved by invoking
+    /// <see cref="GetLogStatement(LoggingEvent)"/>.
+    /// </para>
+    /// </remarks>
+    public string CommandText
+    {
+      get { return m_commandText; }
+      set { m_commandText = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the command type to execute.
-		/// </summary>
-		/// <value>
-		/// The command type to execute.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This value may be either <see cref="System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>) to specify
-		/// that the <see cref="CommandText"/> is a prepared statement to execute, 
-		/// or <see cref="System.Data.CommandType.StoredProcedure"/> (<c>System.Data.CommandType.StoredProcedure</c>) to specify that the
-		/// <see cref="CommandText"/> property is the name of a stored procedure
-		/// to execute.
-		/// </para>
-		/// <para>
-		/// The default value is <see cref="System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>).
-		/// </para>
-		/// </remarks>
-		public CommandType CommandType
-		{
-			get { return m_commandType; }
-			set { m_commandType = value; }
-		}
+    /// <summary>
+    /// Gets or sets the command type to execute.
+    /// </summary>
+    /// <value>
+    /// The command type to execute.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This value may be either <see cref="System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>) to specify
+    /// that the <see cref="CommandText"/> is a prepared statement to execute, 
+    /// or <see cref="System.Data.CommandType.StoredProcedure"/> (<c>System.Data.CommandType.StoredProcedure</c>) to specify that the
+    /// <see cref="CommandText"/> property is the name of a stored procedure
+    /// to execute.
+    /// </para>
+    /// <para>
+    /// The default value is <see cref="System.Data.CommandType.Text"/> (<c>System.Data.CommandType.Text</c>).
+    /// </para>
+    /// </remarks>
+    public CommandType CommandType
+    {
+      get { return m_commandType; }
+      set { m_commandType = value; }
+    }
 
-		/// <summary>
-		/// Should transactions be used to insert logging events in the database.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if transactions should be used to insert logging events in
-		/// the database, otherwise <c>false</c>. The default value is <c>true</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets a value that indicates whether transactions should be used
-		/// to insert logging events in the database.
-		/// </para>
-		/// <para>
-		/// When set a single transaction will be used to insert the buffered events
-		/// into the database. Otherwise each event will be inserted without using
-		/// an explicit transaction.
-		/// </para>
-		/// </remarks>
-		public bool UseTransactions
-		{
-			get { return m_useTransactions; }
-			set { m_useTransactions = value; }
-		}
+    /// <summary>
+    /// Should transactions be used to insert logging events in the database.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if transactions should be used to insert logging events in
+    /// the database, otherwise <c>false</c>. The default value is <c>true</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets a value that indicates whether transactions should be used
+    /// to insert logging events in the database.
+    /// </para>
+    /// <para>
+    /// When set a single transaction will be used to insert the buffered events
+    /// into the database. Otherwise each event will be inserted without using
+    /// an explicit transaction.
+    /// </para>
+    /// </remarks>
+    public bool UseTransactions
+    {
+      get { return m_useTransactions; }
+      set { m_useTransactions = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="SecurityContext"/> used to call the NetSend method.
-		/// </summary>
-		/// <value>
-		/// The <see cref="SecurityContext"/> used to call the NetSend method.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Unless a <see cref="SecurityContext"/> specified here for this appender
-		/// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
-		/// security context to use. The default behavior is to use the security context
-		/// of the current thread.
-		/// </para>
-		/// </remarks>
-		public SecurityContext SecurityContext
-		{
-			get { return m_securityContext; }
-			set { m_securityContext = value; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="SecurityContext"/> used to call the NetSend method.
+    /// </summary>
+    /// <value>
+    /// The <see cref="SecurityContext"/> used to call the NetSend method.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Unless a <see cref="SecurityContext"/> specified here for this appender
+    /// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
+    /// security context to use. The default behavior is to use the security context
+    /// of the current thread.
+    /// </para>
+    /// </remarks>
+    public SecurityContext SecurityContext
+    {
+      get { return m_securityContext; }
+      set { m_securityContext = value; }
+    }
 
-		/// <summary>
-		/// Should this appender try to reconnect to the database on error.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if the appender should try to reconnect to the database after an
-		/// error has occurred, otherwise <c>false</c>. The default value is <c>false</c>, 
-		/// i.e. not to try to reconnect.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The default behaviour is for the appender not to try to reconnect to the
-		/// database if an error occurs. Subsequent logging events are discarded.
-		/// </para>
-		/// <para>
-		/// To force the appender to attempt to reconnect to the database set this
-		/// property to <c>true</c>.
-		/// </para>
-		/// <note>
-		/// When the appender attempts to connect to the database there may be a
-		/// delay of up to the connection timeout specified in the connection string.
-		/// This delay will block the calling application's thread. 
-		/// Until the connection can be reestablished this potential delay may occur multiple times.
-		/// </note>
-		/// </remarks>
-		public bool ReconnectOnError
-		{
-			get { return m_reconnectOnError; }
-			set { m_reconnectOnError = value; }
-		}
+    /// <summary>
+    /// Should this appender try to reconnect to the database on error.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if the appender should try to reconnect to the database after an
+    /// error has occurred, otherwise <c>false</c>. The default value is <c>false</c>, 
+    /// i.e. not to try to reconnect.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The default behaviour is for the appender not to try to reconnect to the
+    /// database if an error occurs. Subsequent logging events are discarded.
+    /// </para>
+    /// <para>
+    /// To force the appender to attempt to reconnect to the database set this
+    /// property to <c>true</c>.
+    /// </para>
+    /// <note>
+    /// When the appender attempts to connect to the database there may be a
+    /// delay of up to the connection timeout specified in the connection string.
+    /// This delay will block the calling application's thread. 
+    /// Until the connection can be reestablished this potential delay may occur multiple times.
+    /// </note>
+    /// </remarks>
+    public bool ReconnectOnError
+    {
+      get { return m_reconnectOnError; }
+      set { m_reconnectOnError = value; }
+    }
 
-		#endregion // Public Instance Properties
+    #endregion // Public Instance Properties
 
-		#region Protected Instance Properties
+    #region Protected Instance Properties
 
-		/// <summary>
-		/// Gets or sets the underlying <see cref="IDbConnection" />.
-		/// </summary>
-		/// <value>
-		/// The underlying <see cref="IDbConnection" />.
-		/// </value>
-		/// <remarks>
-		/// <see cref="AdoNetAppender" /> creates a <see cref="IDbConnection" /> to insert 
-		/// logging events into a database.  Classes deriving from <see cref="AdoNetAppender" /> 
-		/// can use this property to get or set this <see cref="IDbConnection" />.  Use the 
-		/// underlying <see cref="IDbConnection" /> returned from <see cref="Connection" /> if 
-		/// you require access beyond that which <see cref="AdoNetAppender" /> provides.
-		/// </remarks>
-		protected IDbConnection Connection
-		{
-			get { return m_dbConnection; }
-			set { m_dbConnection = value; }
-		}
+    /// <summary>
+    /// Gets or sets the underlying <see cref="IDbConnection" />.
+    /// </summary>
+    /// <value>
+    /// The underlying <see cref="IDbConnection" />.
+    /// </value>
+    /// <remarks>
+    /// <see cref="AdoNetAppender" /> creates a <see cref="IDbConnection" /> to insert 
+    /// logging events into a database.  Classes deriving from <see cref="AdoNetAppender" /> 
+    /// can use this property to get or set this <see cref="IDbConnection" />.  Use the 
+    /// underlying <see cref="IDbConnection" /> returned from <see cref="Connection" /> if 
+    /// you require access beyond that which <see cref="AdoNetAppender" /> provides.
+    /// </remarks>
+    protected IDbConnection Connection
+    {
+      get { return m_dbConnection; }
+      set { m_dbConnection = value; }
+    }
 
-		#endregion // Protected Instance Properties
+    #endregion // Protected Instance Properties
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the appender based on the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
+    /// <summary>
+    /// Initialize the appender based on the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-			if (SecurityContext == null)
-			{
-				SecurityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-			}
+      if (SecurityContext == null)
+      {
+        SecurityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
+      }
 
-			InitializeDatabaseConnection();
-		}
+      InitializeDatabaseConnection();
+    }
 
-		#endregion
+    #endregion
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Override the parent method to close the database
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Closes the database command and database connection.
-		/// </para>
-		/// </remarks>
-		protected override void OnClose()
-		{
-			base.OnClose();
-			DiposeConnection();
-		}
+    /// <summary>
+    /// Override the parent method to close the database
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Closes the database command and database connection.
+    /// </para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      base.OnClose();
+      DiposeConnection();
+    }
 
-		#endregion
+    #endregion
 
-		#region Override implementation of BufferingAppenderSkeleton
+    #region Override implementation of BufferingAppenderSkeleton
 
-		/// <summary>
-		/// Inserts the events into the database.
-		/// </summary>
-		/// <param name="events">The events to insert into the database.</param>
-		/// <remarks>
-		/// <para>
-		/// Insert all the events specified in the <paramref name="events"/>
-		/// array into the database.
-		/// </para>
-		/// </remarks>
-		protected override void SendBuffer(LoggingEvent[] events)
-		{
-			if (ReconnectOnError && (Connection == null || Connection.State != ConnectionState.Open))
-			{
-				LogLog.Debug(declaringType, "Attempting to reconnect to database. Current Connection State: " + ((Connection == null) ? SystemInfo.NullText : Connection.State.ToString()));
+    /// <summary>
+    /// Inserts the events into the database.
+    /// </summary>
+    /// <param name="events">The events to insert into the database.</param>
+    /// <remarks>
+    /// <para>
+    /// Insert all the events specified in the <paramref name="events"/>
+    /// array into the database.
+    /// </para>
+    /// </remarks>
+    protected override void SendBuffer(LoggingEvent[] events)
+    {
+      if (ReconnectOnError && (Connection == null || Connection.State != ConnectionState.Open))
+      {
+        LogLog.Debug(declaringType, "Attempting to reconnect to database. Current Connection State: " + ((Connection == null) ? SystemInfo.NullText : Connection.State.ToString()));
 
-				InitializeDatabaseConnection();
-			}
+        InitializeDatabaseConnection();
+      }
 
-			// Check that the connection exists and is open
-			if (Connection != null && Connection.State == ConnectionState.Open)
-			{
-				if (UseTransactions)
-				{
-					// Create transaction
-					// NJC - Do this on 2 lines because it can confuse the debugger
-					using (IDbTransaction dbTran = Connection.BeginTransaction())
-					{
-						try
-						{
-							SendBuffer(dbTran, events);
+      // Check that the connection exists and is open
+      if (Connection != null && Connection.State == ConnectionState.Open)
+      {
+        if (UseTransactions)
+        {
+          // Create transaction
+          // NJC - Do this on 2 lines because it can confuse the debugger
+          using (IDbTransaction dbTran = Connection.BeginTransaction())
+          {
+            try
+            {
+              SendBuffer(dbTran, events);
 
-							// commit transaction
-							dbTran.Commit();
-						}
-						catch (Exception ex)
-						{
-							// rollback the transaction
-							try
-							{
-								dbTran.Rollback();
-							}
-							catch (Exception)
-							{
-								// Ignore exception
-							}
+              // commit transaction
+              dbTran.Commit();
+            }
+            catch (Exception ex)
+            {
+              // rollback the transaction
+              try
+              {
+                dbTran.Rollback();
+              }
+              catch (Exception)
+              {
+                // Ignore exception
+              }
 
-							// Can't insert into the database. That's a bad thing
-							ErrorHandler.Error("Exception while writing to database", ex);
-						}
-					}
-				}
-				else
-				{
-					// Send without transaction
-					SendBuffer(null, events);
-				}
-			}
-		}
+              // Can't insert into the database. That's a bad thing
+              ErrorHandler.Error("Exception while writing to database", ex);
+            }
+          }
+        }
+        else
+        {
+          // Send without transaction
+          SendBuffer(null, events);
+        }
+      }
+    }
 
-		#endregion // Override implementation of BufferingAppenderSkeleton
+    #endregion // Override implementation of BufferingAppenderSkeleton
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Adds a parameter to the command.
-		/// </summary>
-		/// <param name="parameter">The parameter to add to the command.</param>
-		/// <remarks>
-		/// <para>
-		/// Adds a parameter to the ordered list of command parameters.
-		/// </para>
-		/// </remarks>
-		public void AddParameter(AdoNetAppenderParameter parameter)
-		{
-			m_parameters.Add(parameter);
-		}
+    /// <summary>
+    /// Adds a parameter to the command.
+    /// </summary>
+    /// <param name="parameter">The parameter to add to the command.</param>
+    /// <remarks>
+    /// <para>
+    /// Adds a parameter to the ordered list of command parameters.
+    /// </para>
+    /// </remarks>
+    public void AddParameter(AdoNetAppenderParameter parameter)
+    {
+      m_parameters.Add(parameter);
+    }
 
 
-		#endregion // Public Instance Methods
+    #endregion // Public Instance Methods
 
-		#region Protected Instance Methods
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Writes the events to the database using the transaction specified.
-		/// </summary>
-		/// <param name="dbTran">The transaction that the events will be executed under.</param>
-		/// <param name="events">The array of events to insert into the database.</param>
-		/// <remarks>
-		/// <para>
-		/// The transaction argument can be <c>null</c> if the appender has been
-		/// configured not to use transactions. See <see cref="UseTransactions"/>
-		/// property for more information.
-		/// </para>
-		/// </remarks>
-		protected virtual void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
-		{
-			// string.IsNotNullOrWhiteSpace() does not exist in ancient .NET frameworks
-			if (CommandText != null && CommandText.Trim() != "")
-			{
-				using (IDbCommand dbCmd = Connection.CreateCommand())
-				{
-					// Set the command string
-					dbCmd.CommandText = CommandText;
+    /// <summary>
+    /// Writes the events to the database using the transaction specified.
+    /// </summary>
+    /// <param name="dbTran">The transaction that the events will be executed under.</param>
+    /// <param name="events">The array of events to insert into the database.</param>
+    /// <remarks>
+    /// <para>
+    /// The transaction argument can be <c>null</c> if the appender has been
+    /// configured not to use transactions. See <see cref="UseTransactions"/>
+    /// property for more information.
+    /// </para>
+    /// </remarks>
+    protected virtual void SendBuffer(IDbTransaction dbTran, LoggingEvent[] events)
+    {
+      // string.IsNotNullOrWhiteSpace() does not exist in ancient .NET frameworks
+      if (CommandText != null && CommandText.Trim() != "")
+      {
+        using (IDbCommand dbCmd = Connection.CreateCommand())
+        {
+          // Set the command string
+          dbCmd.CommandText = CommandText;
 
-					// Set the command type
-					dbCmd.CommandType = CommandType;
-					// Send buffer using the prepared command object
-					if (dbTran != null)
-					{
-						dbCmd.Transaction = dbTran;
-					}
+          // Set the command type
+          dbCmd.CommandType = CommandType;
+          // Send buffer using the prepared command object
+          if (dbTran != null)
+          {
+            dbCmd.Transaction = dbTran;
+          }
 
-					try
-					{
-						// prepare the command, which is significantly faster
-						Prepare(dbCmd);
-					}
-					catch (Exception)
-					{
-						if (dbTran != null)
-						{
-							// rethrow exception in transaction mode, cuz now transaction is in failed state
-							throw;
-						}
+          try
+          {
+            // prepare the command, which is significantly faster
+            Prepare(dbCmd);
+          }
+          catch (Exception)
+          {
+            if (dbTran != null)
+            {
+              // rethrow exception in transaction mode, cuz now transaction is in failed state
+              throw;
+            }
 
-						// ignore prepare exceptions as they can happen without affecting actual logging, eg on npgsql
-					}
+            // ignore prepare exceptions as they can happen without affecting actual logging, eg on npgsql
+          }
 
-					// run for all events
-					foreach (LoggingEvent e in events)
-					{
-						// No need to clear dbCmd.Parameters, just use existing.
-						// Set the parameter values
-						foreach (AdoNetAppenderParameter param in m_parameters)
-						{
-							param.FormatValue(dbCmd, e);
-						}
+          // run for all events
+          foreach (LoggingEvent e in events)
+          {
+            // No need to clear dbCmd.Parameters, just use existing.
+            // Set the parameter values
+            foreach (AdoNetAppenderParameter param in m_parameters)
+            {
+              param.FormatValue(dbCmd, e);
+            }
 
-						// Execute the query
-						dbCmd.ExecuteNonQuery();
-					}
-				}
-			}
-			else
-			{
-				// create a new command
-				using (IDbCommand dbCmd = Connection.CreateCommand())
-				{
-					if (dbTran != null)
-					{
-						dbCmd.Transaction = dbTran;
-					}
-					// run for all events
-					foreach (LoggingEvent e in events)
-					{
-						// Get the command text from the Layout
-						string logStatement = GetLogStatement(e);
+            // Execute the query
+            dbCmd.ExecuteNonQuery();
+          }
+        }
+      }
+      else
+      {
+        // create a new command
+        using (IDbCommand dbCmd = Connection.CreateCommand())
+        {
+          if (dbTran != null)
+          {
+            dbCmd.Transaction = dbTran;
+          }
+          // run for all events
+          foreach (LoggingEvent e in events)
+          {
+            // Get the command text from the Layout
+            string logStatement = GetLogStatement(e);
 
-						LogLog.Debug(declaringType, "LogStatement [" + logStatement + "]");
+            LogLog.Debug(declaringType, "LogStatement [" + logStatement + "]");
 
-						dbCmd.CommandText = logStatement;
-						dbCmd.ExecuteNonQuery();
-					}
-				}
-			}
-		}
+            dbCmd.CommandText = logStatement;
+            dbCmd.ExecuteNonQuery();
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Prepare entire database command object to be executed.
-		/// </summary>
-		/// <param name="dbCmd">The command to prepare.</param>
-		protected virtual void Prepare(IDbCommand dbCmd)
-		{
-			// npgsql require parameters to prepare command
-			foreach (AdoNetAppenderParameter parameter in m_parameters)
-			{
-				parameter.Prepare(dbCmd);
-			}
+    /// <summary>
+    /// Prepare entire database command object to be executed.
+    /// </summary>
+    /// <param name="dbCmd">The command to prepare.</param>
+    protected virtual void Prepare(IDbCommand dbCmd)
+    {
+      // npgsql require parameters to prepare command
+      foreach (AdoNetAppenderParameter parameter in m_parameters)
+      {
+        parameter.Prepare(dbCmd);
+      }
 
-			dbCmd.Prepare();
-		}
+      dbCmd.Prepare();
+    }
 
-		/// <summary>
-		/// Formats the log message into database statement text.
-		/// </summary>
-		/// <param name="logEvent">The event being logged.</param>
-		/// <remarks>
-		/// This method can be overridden by subclasses to provide 
-		/// more control over the format of the database statement.
-		/// </remarks>
-		/// <returns>
-		/// Text that can be passed to a <see cref="System.Data.IDbCommand"/>.
-		/// </returns>
-		protected virtual string GetLogStatement(LoggingEvent logEvent)
-		{
-			if (Layout == null)
-			{
-				ErrorHandler.Error("AdoNetAppender: No Layout specified.");
-				return "";
-			}
-			else
-			{
-				using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
-				Layout.Format(writer, logEvent);
-				return writer.ToString();
-			}
-		}
+    /// <summary>
+    /// Formats the log message into database statement text.
+    /// </summary>
+    /// <param name="logEvent">The event being logged.</param>
+    /// <remarks>
+    /// This method can be overridden by subclasses to provide 
+    /// more control over the format of the database statement.
+    /// </remarks>
+    /// <returns>
+    /// Text that can be passed to a <see cref="System.Data.IDbCommand"/>.
+    /// </returns>
+    protected virtual string GetLogStatement(LoggingEvent logEvent)
+    {
+      if (Layout == null)
+      {
+        ErrorHandler.Error("AdoNetAppender: No Layout specified.");
+        return "";
+      }
+      else
+      {
+        using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
+        Layout.Format(writer, logEvent);
+        return writer.ToString();
+      }
+    }
 
-		/// <summary>
-		/// Creates an <see cref="IDbConnection"/> instance used to connect to the database.
-		/// </summary>
-		/// <remarks>
-		/// This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary).
-		/// </remarks>
-		/// <param name="connectionType">The <see cref="Type"/> of the <see cref="IDbConnection"/> object.</param>
-		/// <param name="connectionString">The connectionString output from the ResolveConnectionString method.</param>
-		/// <returns>An <see cref="IDbConnection"/> instance with a valid connection string.</returns>
-		protected virtual IDbConnection CreateConnection(Type connectionType, string connectionString)
-		{
-			IDbConnection connection = (IDbConnection)Activator.CreateInstance(connectionType);
-			connection.ConnectionString = connectionString;
-			return connection;
-		}
+    /// <summary>
+    /// Creates an <see cref="IDbConnection"/> instance used to connect to the database.
+    /// </summary>
+    /// <remarks>
+    /// This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary).
+    /// </remarks>
+    /// <param name="connectionType">The <see cref="Type"/> of the <see cref="IDbConnection"/> object.</param>
+    /// <param name="connectionString">The connectionString output from the ResolveConnectionString method.</param>
+    /// <returns>An <see cref="IDbConnection"/> instance with a valid connection string.</returns>
+    protected virtual IDbConnection CreateConnection(Type connectionType, string connectionString)
+    {
+      IDbConnection connection = (IDbConnection)Activator.CreateInstance(connectionType);
+      connection.ConnectionString = connectionString;
+      return connection;
+    }
 
-		/// <summary>
-		/// Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey
-		/// property.
-		/// </summary>
-		/// <remarks>
-		/// ConnectiongStringName is only supported on .NET 2.0 and higher.
-		/// </remarks>
-		/// <param name="connectionStringContext">Additional information describing the connection string.</param>
-		/// <returns>A connection string used to connect to the database.</returns>
-		protected virtual string ResolveConnectionString(out string connectionStringContext)
-		{
-			if (ConnectionString != null && ConnectionString.Length > 0)
-			{
-				connectionStringContext = "ConnectionString";
-				return ConnectionString;
-			}
+    /// <summary>
+    /// Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey
+    /// property.
+    /// </summary>
+    /// <remarks>
+    /// ConnectiongStringName is only supported on .NET 2.0 and higher.
+    /// </remarks>
+    /// <param name="connectionStringContext">Additional information describing the connection string.</param>
+    /// <returns>A connection string used to connect to the database.</returns>
+    protected virtual string ResolveConnectionString(out string connectionStringContext)
+    {
+      if (ConnectionString != null && ConnectionString.Length > 0)
+      {
+        connectionStringContext = "ConnectionString";
+        return ConnectionString;
+      }
 
 #if !NETSTANDARD1_3
-			if (!String.IsNullOrEmpty(ConnectionStringName))
-			{
-				ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[ConnectionStringName];
-				if (settings != null)
-				{
-					connectionStringContext = "ConnectionStringName";
-					return settings.ConnectionString;
-				}
-				else
-				{
-					throw new LogException("Unable to find [" + ConnectionStringName + "] ConfigurationManager.ConnectionStrings item");
-				}
-			}
+      if (!String.IsNullOrEmpty(ConnectionStringName))
+      {
+        ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings[ConnectionStringName];
+        if (settings != null)
+        {
+          connectionStringContext = "ConnectionStringName";
+          return settings.ConnectionString;
+        }
+        else
+        {
+          throw new LogException("Unable to find [" + ConnectionStringName + "] ConfigurationManager.ConnectionStrings item");
+        }
+      }
 #endif
 
-			if (AppSettingsKey != null && AppSettingsKey.Length > 0)
-			{
-				connectionStringContext = "AppSettingsKey";
-				string appSettingsConnectionString = SystemInfo.GetAppSetting(AppSettingsKey);
-				if (appSettingsConnectionString == null || appSettingsConnectionString.Length == 0)
-				{
-					throw new LogException("Unable to find [" + AppSettingsKey + "] AppSettings key.");
-				}
-				return appSettingsConnectionString;
-			}
+      if (AppSettingsKey != null && AppSettingsKey.Length > 0)
+      {
+        connectionStringContext = "AppSettingsKey";
+        string appSettingsConnectionString = SystemInfo.GetAppSetting(AppSettingsKey);
+        if (appSettingsConnectionString == null || appSettingsConnectionString.Length == 0)
+        {
+          throw new LogException("Unable to find [" + AppSettingsKey + "] AppSettings key.");
+        }
+        return appSettingsConnectionString;
+      }
 
-			connectionStringContext = "Unable to resolve connection string from ConnectionString, ConnectionStrings, or AppSettings.";
-			return string.Empty;
-		}
+      connectionStringContext = "Unable to resolve connection string from ConnectionString, ConnectionStrings, or AppSettings.";
+      return string.Empty;
+    }
 
-		/// <summary>
-		/// Retrieves the class type of the ADO.NET provider.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Gets the Type of the ADO.NET provider to use to connect to the
-		/// database. This method resolves the type specified in the 
-		/// <see cref="ConnectionType"/> property.
-		/// </para>
-		/// <para>
-		/// Subclasses can override this method to return a different type
-		/// if necessary.
-		/// </para>
-		/// </remarks>
-		/// <returns>The <see cref="Type"/> of the ADO.NET provider</returns>
-		protected virtual Type ResolveConnectionType()
-		{
-			try
-			{
+    /// <summary>
+    /// Retrieves the class type of the ADO.NET provider.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Gets the Type of the ADO.NET provider to use to connect to the
+    /// database. This method resolves the type specified in the 
+    /// <see cref="ConnectionType"/> property.
+    /// </para>
+    /// <para>
+    /// Subclasses can override this method to return a different type
+    /// if necessary.
+    /// </para>
+    /// </remarks>
+    /// <returns>The <see cref="Type"/> of the ADO.NET provider</returns>
+    protected virtual Type ResolveConnectionType()
+    {
+      try
+      {
 #if NETSTANDARD1_3
-				// NETSTANDARD1_3 requires comma separated ConnectionType like `System.Data.SqlClient.SqlConnection, System.Data` to work properly.
-				return SystemInfo.GetTypeFromString((Assembly)null, ConnectionType, true, false);
+        // NETSTANDARD1_3 requires comma separated ConnectionType like `System.Data.SqlClient.SqlConnection, System.Data` to work properly.
+        return SystemInfo.GetTypeFromString((Assembly)null, ConnectionType, true, false);
 #else
-				return SystemInfo.GetTypeFromString(ConnectionType, true, false);
+        return SystemInfo.GetTypeFromString(ConnectionType, true, false);
 #endif
-			}
-			catch (Exception ex)
-			{
-				ErrorHandler.Error("Failed to load connection type [" + ConnectionType + "]", ex);
-				throw;
-			}
-		}
+      }
+      catch (Exception ex)
+      {
+        ErrorHandler.Error("Failed to load connection type [" + ConnectionType + "]", ex);
+        throw;
+      }
+    }
 
-		#endregion // Protected Instance Methods
+    #endregion // Protected Instance Methods
 
-		#region Private Instance Methods
+    #region Private Instance Methods
 
-		/// <summary>
-		/// Connects to the database.
-		/// </summary>		
-		private void InitializeDatabaseConnection()
-		{
-			string connectionStringContext = "Unable to determine connection string context.";
-			string resolvedConnectionString = string.Empty;
+    /// <summary>
+    /// Connects to the database.
+    /// </summary>    
+    private void InitializeDatabaseConnection()
+    {
+      string connectionStringContext = "Unable to determine connection string context.";
+      string resolvedConnectionString = string.Empty;
 
-			try
-			{
-				DiposeConnection();
+      try
+      {
+        DiposeConnection();
 
-				// Set the connection string
-				resolvedConnectionString = ResolveConnectionString(out connectionStringContext);
+        // Set the connection string
+        resolvedConnectionString = ResolveConnectionString(out connectionStringContext);
 
-				Connection = CreateConnection(ResolveConnectionType(), resolvedConnectionString);
+        Connection = CreateConnection(ResolveConnectionType(), resolvedConnectionString);
 
-				using (SecurityContext.Impersonate(this))
-				{
-					// Open the database connection
-					Connection.Open();
-				}
-			}
-			catch (Exception e)
-			{
-				// Sadly, your connection string is bad.
-				ErrorHandler.Error("Could not open database connection [" + resolvedConnectionString + "]. Connection string context [" + connectionStringContext + "].", e);
+        using (SecurityContext.Impersonate(this))
+        {
+          // Open the database connection
+          Connection.Open();
+        }
+      }
+      catch (Exception e)
+      {
+        // Sadly, your connection string is bad.
+        ErrorHandler.Error("Could not open database connection [" + resolvedConnectionString + "]. Connection string context [" + connectionStringContext + "].", e);
 
-				Connection = null;
-			}
-		}
+        Connection = null;
+      }
+    }
 
-		/// <summary>
-		/// Cleanup the existing connection.
-		/// </summary>
-		/// <remarks>
-		/// Calls the IDbConnection's <see cref="IDbConnection.Close"/> method.
-		/// </remarks>
-		private void DiposeConnection()
-		{
-			if (Connection != null)
-			{
-				try
-				{
-					Connection.Close();
-				}
-				catch (Exception ex)
-				{
-					LogLog.Warn(declaringType, "Exception while disposing cached connection object", ex);
-				}
-				Connection = null;
-			}
-		}
+    /// <summary>
+    /// Cleanup the existing connection.
+    /// </summary>
+    /// <remarks>
+    /// Calls the IDbConnection's <see cref="IDbConnection.Close"/> method.
+    /// </remarks>
+    private void DiposeConnection()
+    {
+      if (Connection != null)
+      {
+        try
+        {
+          Connection.Close();
+        }
+        catch (Exception ex)
+        {
+          LogLog.Warn(declaringType, "Exception while disposing cached connection object", ex);
+        }
+        Connection = null;
+      }
+    }
 
-		#endregion // Private Instance Methods
+    #endregion // Private Instance Methods
 
-		#region Protected Instance Fields
+    #region Protected Instance Fields
 
-		/// <summary>
-		/// The list of <see cref="AdoNetAppenderParameter"/> objects.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The list of <see cref="AdoNetAppenderParameter"/> objects.
-		/// </para>
-		/// </remarks>
-		protected ArrayList m_parameters;
+    /// <summary>
+    /// The list of <see cref="AdoNetAppenderParameter"/> objects.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The list of <see cref="AdoNetAppenderParameter"/> objects.
+    /// </para>
+    /// </remarks>
+    protected ArrayList m_parameters;
 
-		#endregion // Protected Instance Fields
+    #endregion // Protected Instance Fields
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The security context to use for privileged calls
-		/// </summary>
-		private SecurityContext m_securityContext;
+    /// <summary>
+    /// The security context to use for privileged calls
+    /// </summary>
+    private SecurityContext m_securityContext;
 
-		/// <summary>
-		/// The <see cref="IDbConnection" /> that will be used
-		/// to insert logging events into a database.
-		/// </summary>
-		private IDbConnection m_dbConnection;
+    /// <summary>
+    /// The <see cref="IDbConnection" /> that will be used
+    /// to insert logging events into a database.
+    /// </summary>
+    private IDbConnection m_dbConnection;
 
-		/// <summary>
-		/// Database connection string.
-		/// </summary>
-		private string m_connectionString;
+    /// <summary>
+    /// Database connection string.
+    /// </summary>
+    private string m_connectionString;
 
-		/// <summary>
-		/// The appSettings key from App.Config that contains the connection string.
-		/// </summary>
-		private string m_appSettingsKey;
+    /// <summary>
+    /// The appSettings key from App.Config that contains the connection string.
+    /// </summary>
+    private string m_appSettingsKey;
 
-		/// <summary>
-		/// The connectionStrings key from App.Config that contains the connection string.
-		/// </summary>
-		private string m_connectionStringName;
+    /// <summary>
+    /// The connectionStrings key from App.Config that contains the connection string.
+    /// </summary>
+    private string m_connectionStringName;
 
-		/// <summary>
-		/// String type name of the <see cref="IDbConnection"/> type name.
-		/// </summary>
-		private string m_connectionType;
+    /// <summary>
+    /// String type name of the <see cref="IDbConnection"/> type name.
+    /// </summary>
+    private string m_connectionType;
 
-		/// <summary>
-		/// The text of the command.
-		/// </summary>
-		private string m_commandText;
+    /// <summary>
+    /// The text of the command.
+    /// </summary>
+    private string m_commandText;
 
-		/// <summary>
-		/// The command type.
-		/// </summary>
-		private CommandType m_commandType;
+    /// <summary>
+    /// The command type.
+    /// </summary>
+    private CommandType m_commandType;
 
-		/// <summary>
-		/// Indicates whether to use transactions when writing to the database.
-		/// </summary>
-		private bool m_useTransactions;
+    /// <summary>
+    /// Indicates whether to use transactions when writing to the database.
+    /// </summary>
+    private bool m_useTransactions;
 
-		/// <summary>
-		/// Indicates whether to reconnect when a connection is lost.
-		/// </summary>
-		private bool m_reconnectOnError;
+    /// <summary>
+    /// Indicates whether to reconnect when a connection is lost.
+    /// </summary>
+    private bool m_reconnectOnError;
 
-		#endregion // Private Instance Fields
+    #endregion // Private Instance Fields
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The fully qualified type of the AdoNetAppender class.
-		/// </summary>
-		/// <remarks>
-		/// Used by the internal logger to record the Type of the
-		/// log message.
-		/// </remarks>
-		private static readonly Type declaringType = typeof(AdoNetAppender);
+    /// <summary>
+    /// The fully qualified type of the AdoNetAppender class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(AdoNetAppender);
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 
-	/// <summary>
-	/// Parameter type used by the <see cref="AdoNetAppender"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class provides the basic database parameter properties
-	/// as defined by the <see cref="System.Data.IDbDataParameter"/> interface.
-	/// </para>
-	/// <para>This type can be subclassed to provide database specific
-	/// functionality. The two methods that are called externally are
-	/// <see cref="Prepare"/> and <see cref="FormatValue"/>.
-	/// </para>
-	/// </remarks>
-	public class AdoNetAppenderParameter
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Parameter type used by the <see cref="AdoNetAppender"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class provides the basic database parameter properties
+  /// as defined by the <see cref="System.Data.IDbDataParameter"/> interface.
+  /// </para>
+  /// <para>This type can be subclassed to provide database specific
+  /// functionality. The two methods that are called externally are
+  /// <see cref="Prepare"/> and <see cref="FormatValue"/>.
+  /// </para>
+  /// </remarks>
+  public class AdoNetAppenderParameter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="AdoNetAppenderParameter" /> class.
-		/// </summary>
-		/// <remarks>
-		/// Default constructor for the AdoNetAppenderParameter class.
-		/// </remarks>
-		public AdoNetAppenderParameter()
-		{
-			Precision = 0;
-			Scale = 0;
-			Size = 0;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AdoNetAppenderParameter" /> class.
+    /// </summary>
+    /// <remarks>
+    /// Default constructor for the AdoNetAppenderParameter class.
+    /// </remarks>
+    public AdoNetAppenderParameter()
+    {
+      Precision = 0;
+      Scale = 0;
+      Size = 0;
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the name of this parameter.
-		/// </summary>
-		/// <value>
-		/// The name of this parameter.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of this parameter. The parameter name
-		/// must match up to a named parameter to the SQL stored procedure
-		/// or prepared statement.
-		/// </para>
-		/// </remarks>
-		public string ParameterName
-		{
-			get { return m_parameterName; }
-			set { m_parameterName = value; }
-		}
+    /// <summary>
+    /// Gets or sets the name of this parameter.
+    /// </summary>
+    /// <value>
+    /// The name of this parameter.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of this parameter. The parameter name
+    /// must match up to a named parameter to the SQL stored procedure
+    /// or prepared statement.
+    /// </para>
+    /// </remarks>
+    public string ParameterName
+    {
+      get { return m_parameterName; }
+      set { m_parameterName = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the database type for this parameter.
-		/// </summary>
-		/// <value>
-		/// The database type for this parameter.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The database type for this parameter. This property should
-		/// be set to the database type from the <see cref="DbType"/>
-		/// enumeration. See <see cref="IDataParameter.DbType"/>.
-		/// </para>
-		/// <para>
-		/// This property is optional. If not specified the ADO.NET provider 
-		/// will attempt to infer the type from the value.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="IDataParameter.DbType" />
-		public DbType DbType
-		{
-			get { return m_dbType; }
-			set
-			{
-				m_dbType = value;
-				m_inferType = false;
-			}
-		}
+    /// <summary>
+    /// Gets or sets the database type for this parameter.
+    /// </summary>
+    /// <value>
+    /// The database type for this parameter.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The database type for this parameter. This property should
+    /// be set to the database type from the <see cref="DbType"/>
+    /// enumeration. See <see cref="IDataParameter.DbType"/>.
+    /// </para>
+    /// <para>
+    /// This property is optional. If not specified the ADO.NET provider 
+    /// will attempt to infer the type from the value.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="IDataParameter.DbType" />
+    public DbType DbType
+    {
+      get { return m_dbType; }
+      set
+      {
+        m_dbType = value;
+        m_inferType = false;
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets the precision for this parameter.
-		/// </summary>
-		/// <value>
-		/// The precision for this parameter.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The maximum number of digits used to represent the Value.
-		/// </para>
-		/// <para>
-		/// This property is optional. If not specified the ADO.NET provider 
-		/// will attempt to infer the precision from the value.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="IDbDataParameter.Precision" />
-		public byte Precision
-		{
-			get { return m_precision; }
-			set { m_precision = value; }
-		}
+    /// <summary>
+    /// Gets or sets the precision for this parameter.
+    /// </summary>
+    /// <value>
+    /// The precision for this parameter.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The maximum number of digits used to represent the Value.
+    /// </para>
+    /// <para>
+    /// This property is optional. If not specified the ADO.NET provider 
+    /// will attempt to infer the precision from the value.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="IDbDataParameter.Precision" />
+    public byte Precision
+    {
+      get { return m_precision; }
+      set { m_precision = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the scale for this parameter.
-		/// </summary>
-		/// <value>
-		/// The scale for this parameter.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The number of decimal places to which Value is resolved.
-		/// </para>
-		/// <para>
-		/// This property is optional. If not specified the ADO.NET provider 
-		/// will attempt to infer the scale from the value.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="IDbDataParameter.Scale" />
-		public byte Scale
-		{
-			get { return m_scale; }
-			set { m_scale = value; }
-		}
+    /// <summary>
+    /// Gets or sets the scale for this parameter.
+    /// </summary>
+    /// <value>
+    /// The scale for this parameter.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The number of decimal places to which Value is resolved.
+    /// </para>
+    /// <para>
+    /// This property is optional. If not specified the ADO.NET provider 
+    /// will attempt to infer the scale from the value.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="IDbDataParameter.Scale" />
+    public byte Scale
+    {
+      get { return m_scale; }
+      set { m_scale = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the size for this parameter.
-		/// </summary>
-		/// <value>
-		/// The size for this parameter.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The maximum size, in bytes, of the data within the column.
-		/// </para>
-		/// <para>
-		/// This property is optional. If not specified the ADO.NET provider 
-		/// will attempt to infer the size from the value.
-		/// </para>
-		/// <para>
-		/// For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="IDbDataParameter.Size" />
-		public int Size
-		{
-			get { return m_size; }
-			set { m_size = value; }
-		}
+    /// <summary>
+    /// Gets or sets the size for this parameter.
+    /// </summary>
+    /// <value>
+    /// The size for this parameter.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The maximum size, in bytes, of the data within the column.
+    /// </para>
+    /// <para>
+    /// This property is optional. If not specified the ADO.NET provider 
+    /// will attempt to infer the size from the value.
+    /// </para>
+    /// <para>
+    /// For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="IDbDataParameter.Size" />
+    public int Size
+    {
+      get { return m_size; }
+      set { m_size = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="IRawLayout"/> to use to 
-		/// render the logging event into an object for this 
-		/// parameter.
-		/// </summary>
-		/// <value>
-		/// The <see cref="IRawLayout"/> used to render the
-		/// logging event into an object for this parameter.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="IRawLayout"/> that renders the value for this
-		/// parameter.
-		/// </para>
-		/// <para>
-		/// The <see cref="RawLayoutConverter"/> can be used to adapt
-		/// any <see cref="ILayout"/> into a <see cref="IRawLayout"/>
-		/// for use in the property.
-		/// </para>
-		/// </remarks>
-		public IRawLayout Layout
-		{
-			get { return m_layout; }
-			set { m_layout = value; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="IRawLayout"/> to use to 
+    /// render the logging event into an object for this 
+    /// parameter.
+    /// </summary>
+    /// <value>
+    /// The <see cref="IRawLayout"/> used to render the
+    /// logging event into an object for this parameter.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="IRawLayout"/> that renders the value for this
+    /// parameter.
+    /// </para>
+    /// <para>
+    /// The <see cref="RawLayoutConverter"/> can be used to adapt
+    /// any <see cref="ILayout"/> into a <see cref="IRawLayout"/>
+    /// for use in the property.
+    /// </para>
+    /// </remarks>
+    public IRawLayout Layout
+    {
+      get { return m_layout; }
+      set { m_layout = value; }
+    }
 
-		#endregion // Public Instance Properties
+    #endregion // Public Instance Properties
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Prepare the specified database command object.
-		/// </summary>
-		/// <param name="command">The command to prepare.</param>
-		/// <remarks>
-		/// <para>
-		/// Prepares the database command object by adding
-		/// this parameter to its collection of parameters.
-		/// </para>
-		/// </remarks>
-		public virtual void Prepare(IDbCommand command)
-		{
-			// Create a new parameter
-			IDbDataParameter param = command.CreateParameter();
+    /// <summary>
+    /// Prepare the specified database command object.
+    /// </summary>
+    /// <param name="command">The command to prepare.</param>
+    /// <remarks>
+    /// <para>
+    /// Prepares the database command object by adding
+    /// this parameter to its collection of parameters.
+    /// </para>
+    /// </remarks>
+    public virtual void Prepare(IDbCommand command)
+    {
+      // Create a new parameter
+      IDbDataParameter param = command.CreateParameter();
 
-			// Set the parameter properties
-			param.ParameterName = ParameterName;
+      // Set the parameter properties
+      param.ParameterName = ParameterName;
 
-			if (!m_inferType)
-			{
-				param.DbType = DbType;
-			}
-			if (Precision != 0)
-			{
-				param.Precision = Precision;
-			}
-			if (Scale != 0)
-			{
-				param.Scale = Scale;
-			}
-			if (Size != 0)
-			{
-				param.Size = Size;
-			}
+      if (!m_inferType)
+      {
+        param.DbType = DbType;
+      }
+      if (Precision != 0)
+      {
+        param.Precision = Precision;
+      }
+      if (Scale != 0)
+      {
+        param.Scale = Scale;
+      }
+      if (Size != 0)
+      {
+        param.Size = Size;
+      }
 
-			// Add the parameter to the collection of params
-			command.Parameters.Add(param);
-		}
+      // Add the parameter to the collection of params
+      command.Parameters.Add(param);
+    }
 
-		/// <summary>
-		/// Renders the logging event and set the parameter value in the command.
-		/// </summary>
-		/// <param name="command">The command containing the parameter.</param>
-		/// <param name="loggingEvent">The event to be rendered.</param>
-		/// <remarks>
-		/// <para>
-		/// Renders the logging event using this parameters layout
-		/// object. Sets the value of the parameter on the command object.
-		/// </para>
-		/// </remarks>
-		public virtual void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
-		{
-			// Lookup the parameter
-			IDbDataParameter param = (IDbDataParameter)command.Parameters[ParameterName];
+    /// <summary>
+    /// Renders the logging event and set the parameter value in the command.
+    /// </summary>
+    /// <param name="command">The command containing the parameter.</param>
+    /// <param name="loggingEvent">The event to be rendered.</param>
+    /// <remarks>
+    /// <para>
+    /// Renders the logging event using this parameters layout
+    /// object. Sets the value of the parameter on the command object.
+    /// </para>
+    /// </remarks>
+    public virtual void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
+    {
+      // Lookup the parameter
+      IDbDataParameter param = (IDbDataParameter)command.Parameters[ParameterName];
 
-			// Format the value
-			object formattedValue = Layout.Format(loggingEvent);
+      // Format the value
+      object formattedValue = Layout.Format(loggingEvent);
 
-			// If the value is null then convert to a DBNull
-			if (formattedValue == null)
-			{
-				formattedValue = DBNull.Value;
-			}
+      // If the value is null then convert to a DBNull
+      if (formattedValue == null)
+      {
+        formattedValue = DBNull.Value;
+      }
 
-			param.Value = formattedValue;
-		}
+      param.Value = formattedValue;
+    }
 
-		#endregion // Public Instance Methods
+    #endregion // Public Instance Methods
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The name of this parameter.
-		/// </summary>
-		private string m_parameterName;
+    /// <summary>
+    /// The name of this parameter.
+    /// </summary>
+    private string m_parameterName;
 
-		/// <summary>
-		/// The database type for this parameter.
-		/// </summary>
-		private DbType m_dbType;
+    /// <summary>
+    /// The database type for this parameter.
+    /// </summary>
+    private DbType m_dbType;
 
-		/// <summary>
-		/// Flag to infer type rather than use the DbType
-		/// </summary>
-		private bool m_inferType = true;
+    /// <summary>
+    /// Flag to infer type rather than use the DbType
+    /// </summary>
+    private bool m_inferType = true;
 
-		/// <summary>
-		/// The precision for this parameter.
-		/// </summary>
-		private byte m_precision;
+    /// <summary>
+    /// The precision for this parameter.
+    /// </summary>
+    private byte m_precision;
 
-		/// <summary>
-		/// The scale for this parameter.
-		/// </summary>
-		private byte m_scale;
+    /// <summary>
+    /// The scale for this parameter.
+    /// </summary>
+    private byte m_scale;
 
-		/// <summary>
-		/// The size for this parameter.
-		/// </summary>
-		private int m_size;
+    /// <summary>
+    /// The size for this parameter.
+    /// </summary>
+    private int m_size;
 
-		/// <summary>
-		/// The <see cref="IRawLayout"/> to use to render the
-		/// logging event into an object for this parameter.
-		/// </summary>
-		private IRawLayout m_layout;
+    /// <summary>
+    /// The <see cref="IRawLayout"/> to use to render the
+    /// logging event into an object for this parameter.
+    /// </summary>
+    private IRawLayout m_layout;
 
-		#endregion // Private Instance Fields
-	}
+    #endregion // Private Instance Fields
+  }
 }
 
 #endif // !SSCLI
\ No newline at end of file
diff --git a/src/log4net/Appender/AnsiColorTerminalAppender.cs b/src/log4net/Appender/AnsiColorTerminalAppender.cs
index 50a6875..da8cc08 100644
--- a/src/log4net/Appender/AnsiColorTerminalAppender.cs
+++ b/src/log4net/Appender/AnsiColorTerminalAppender.cs
@@ -27,548 +27,548 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends logging events to the terminal using ANSI color escape sequences.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// AnsiColorTerminalAppender appends log events to the standard output stream
-	/// or the error output stream using a layout specified by the 
-	/// user. It also allows the color of a specific level of message to be set.
-	/// </para>
-	/// <note>
-	/// This appender expects the terminal to understand the VT100 control set 
-	/// in order to interpret the color codes. If the terminal or console does not
-	/// understand the control codes the behavior is not defined.
-	/// </note>
-	/// <para>
-	/// By default, all output is written to the console's standard output stream.
-	/// The <see cref="Target"/> property can be set to direct the output to the
-	/// error stream.
-	/// </para>
-	/// <para>
-	/// NOTE: This appender writes each message to the <c>System.Console.Out</c> or 
-	/// <c>System.Console.Error</c> that is set at the time the event is appended.
-	/// Therefore it is possible to programmatically redirect the output of this appender 
-	/// (for example NUnit does this to capture program output). While this is the desired
-	/// behavior of this appender it may have security implications in your application. 
-	/// </para>
-	/// <para>
-	/// When configuring the ANSI colored terminal appender, a mapping should be
-	/// specified to map a logging level to a color. For example:
-	/// </para>
-	/// <code lang="XML" escaped="true">
-	/// <mapping>
-	/// 	<level value="ERROR" />
-	/// 	<foreColor value="White" />
-	/// 	<backColor value="Red" />
-	///     <attributes value="Bright,Underscore" />
-	/// </mapping>
-	/// <mapping>
-	/// 	<level value="DEBUG" />
-	/// 	<backColor value="Green" />
-	/// </mapping>
-	/// </code>
-	/// <para>
-	/// The Level is the standard log4net logging level and ForeColor and BackColor can be any
-	/// of the following values:
-	/// <list type="bullet">
-	/// <item><term>Blue</term><description></description></item>
-	/// <item><term>Green</term><description></description></item>
-	/// <item><term>Red</term><description></description></item>
-	/// <item><term>White</term><description></description></item>
-	/// <item><term>Yellow</term><description></description></item>
-	/// <item><term>Purple</term><description></description></item>
-	/// <item><term>Cyan</term><description></description></item>
-	/// </list>
-	/// These color values cannot be combined together to make new colors.
-	/// </para>
-	/// <para>
-	/// The attributes can be any combination of the following:
-	/// <list type="bullet">
-	/// <item><term>Bright</term><description>foreground is brighter</description></item>
-	/// <item><term>Dim</term><description>foreground is dimmer</description></item>
-	/// <item><term>Underscore</term><description>message is underlined</description></item>
-	/// <item><term>Blink</term><description>foreground is blinking (does not work on all terminals)</description></item>
-	/// <item><term>Reverse</term><description>foreground and background are reversed</description></item>
-	/// <item><term>Hidden</term><description>output is hidden</description></item>
-	/// <item><term>Strikethrough</term><description>message has a line through it</description></item>
-	/// </list>
-	/// While any of these attributes may be combined together not all combinations
-	/// work well together, for example setting both <i>Bright</i> and <i>Dim</i> attributes makes
-	/// no sense.
-	/// </para>
-	/// </remarks>
-	/// <author>Patrick Wagstrom</author>
-	/// <author>Nicko Cadell</author>
-	public class AnsiColorTerminalAppender : AppenderSkeleton
-	{
-		#region Colors Enum
+  /// <summary>
+  /// Appends logging events to the terminal using ANSI color escape sequences.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// AnsiColorTerminalAppender appends log events to the standard output stream
+  /// or the error output stream using a layout specified by the 
+  /// user. It also allows the color of a specific level of message to be set.
+  /// </para>
+  /// <note>
+  /// This appender expects the terminal to understand the VT100 control set 
+  /// in order to interpret the color codes. If the terminal or console does not
+  /// understand the control codes the behavior is not defined.
+  /// </note>
+  /// <para>
+  /// By default, all output is written to the console's standard output stream.
+  /// The <see cref="Target"/> property can be set to direct the output to the
+  /// error stream.
+  /// </para>
+  /// <para>
+  /// NOTE: This appender writes each message to the <c>System.Console.Out</c> or 
+  /// <c>System.Console.Error</c> that is set at the time the event is appended.
+  /// Therefore it is possible to programmatically redirect the output of this appender 
+  /// (for example NUnit does this to capture program output). While this is the desired
+  /// behavior of this appender it may have security implications in your application. 
+  /// </para>
+  /// <para>
+  /// When configuring the ANSI colored terminal appender, a mapping should be
+  /// specified to map a logging level to a color. For example:
+  /// </para>
+  /// <code lang="XML" escaped="true">
+  /// <mapping>
+  ///   <level value="ERROR" />
+  ///   <foreColor value="White" />
+  ///   <backColor value="Red" />
+  ///     <attributes value="Bright,Underscore" />
+  /// </mapping>
+  /// <mapping>
+  ///   <level value="DEBUG" />
+  ///   <backColor value="Green" />
+  /// </mapping>
+  /// </code>
+  /// <para>
+  /// The Level is the standard log4net logging level and ForeColor and BackColor can be any
+  /// of the following values:
+  /// <list type="bullet">
+  /// <item><term>Blue</term><description></description></item>
+  /// <item><term>Green</term><description></description></item>
+  /// <item><term>Red</term><description></description></item>
+  /// <item><term>White</term><description></description></item>
+  /// <item><term>Yellow</term><description></description></item>
+  /// <item><term>Purple</term><description></description></item>
+  /// <item><term>Cyan</term><description></description></item>
+  /// </list>
+  /// These color values cannot be combined together to make new colors.
+  /// </para>
+  /// <para>
+  /// The attributes can be any combination of the following:
+  /// <list type="bullet">
+  /// <item><term>Bright</term><description>foreground is brighter</description></item>
+  /// <item><term>Dim</term><description>foreground is dimmer</description></item>
+  /// <item><term>Underscore</term><description>message is underlined</description></item>
+  /// <item><term>Blink</term><description>foreground is blinking (does not work on all terminals)</description></item>
+  /// <item><term>Reverse</term><description>foreground and background are reversed</description></item>
+  /// <item><term>Hidden</term><description>output is hidden</description></item>
+  /// <item><term>Strikethrough</term><description>message has a line through it</description></item>
+  /// </list>
+  /// While any of these attributes may be combined together not all combinations
+  /// work well together, for example setting both <i>Bright</i> and <i>Dim</i> attributes makes
+  /// no sense.
+  /// </para>
+  /// </remarks>
+  /// <author>Patrick Wagstrom</author>
+  /// <author>Nicko Cadell</author>
+  public class AnsiColorTerminalAppender : AppenderSkeleton
+  {
+    #region Colors Enum
 
-		/// <summary>
-		/// The enum of possible display attributes
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The following flags can be combined together to
-		/// form the ANSI color attributes.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="AnsiColorTerminalAppender" />
-		[Flags]
-		public enum AnsiAttributes : int
-		{
-			/// <summary>
-			/// text is bright
-			/// </summary>
-			Bright			= 1,
-			/// <summary>
-			/// text is dim
-			/// </summary>
-			Dim				= 2,
+    /// <summary>
+    /// The enum of possible display attributes
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The following flags can be combined together to
+    /// form the ANSI color attributes.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="AnsiColorTerminalAppender" />
+    [Flags]
+    public enum AnsiAttributes : int
+    {
+      /// <summary>
+      /// text is bright
+      /// </summary>
+      Bright = 1,
+      /// <summary>
+      /// text is dim
+      /// </summary>
+      Dim = 2,
 
-			/// <summary>
-			/// text is underlined
-			/// </summary>
-			Underscore		= 4,
+      /// <summary>
+      /// text is underlined
+      /// </summary>
+      Underscore = 4,
 
-			/// <summary>
-			/// text is blinking
-			/// </summary>
-			/// <remarks>
-			/// Not all terminals support this attribute
-			/// </remarks>
-			Blink			= 8,
+      /// <summary>
+      /// text is blinking
+      /// </summary>
+      /// <remarks>
+      /// Not all terminals support this attribute
+      /// </remarks>
+      Blink = 8,
 
-			/// <summary>
-			/// text and background colors are reversed
-			/// </summary>
-			Reverse			= 16,
+      /// <summary>
+      /// text and background colors are reversed
+      /// </summary>
+      Reverse = 16,
 
-			/// <summary>
-			/// text is hidden
-			/// </summary>
-			Hidden			= 32,
+      /// <summary>
+      /// text is hidden
+      /// </summary>
+      Hidden = 32,
 
-			/// <summary>
-			/// text is displayed with a strikethrough
-			/// </summary>
-			Strikethrough		= 64,
+      /// <summary>
+      /// text is displayed with a strikethrough
+      /// </summary>
+      Strikethrough = 64,
 
-			/// <summary>
-			/// text color is light
-			/// </summary>
-			Light			= 128
-		}
+      /// <summary>
+      /// text color is light
+      /// </summary>
+      Light = 128
+    }
 
-		/// <summary>
-		/// The enum of possible foreground or background color values for 
-		/// use with the color mapping method
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The output can be in one for the following ANSI colors.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="AnsiColorTerminalAppender" />
-		public enum AnsiColor : int
-		{
-			/// <summary>
-			/// color is black
-			/// </summary>
-			Black	= 0,
+    /// <summary>
+    /// The enum of possible foreground or background color values for 
+    /// use with the color mapping method
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The output can be in one for the following ANSI colors.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="AnsiColorTerminalAppender" />
+    public enum AnsiColor : int
+    {
+      /// <summary>
+      /// color is black
+      /// </summary>
+      Black = 0,
 
-			/// <summary>
-			/// color is red
-			/// </summary>
-			Red	= 1,
+      /// <summary>
+      /// color is red
+      /// </summary>
+      Red = 1,
 
-			/// <summary>
-			/// color is green
-			/// </summary>
-			Green	= 2,
+      /// <summary>
+      /// color is green
+      /// </summary>
+      Green = 2,
 
-			/// <summary>
-			/// color is yellow
-			/// </summary>
-			Yellow	= 3,
+      /// <summary>
+      /// color is yellow
+      /// </summary>
+      Yellow = 3,
 
-			/// <summary>
-			/// color is blue
-			/// </summary>
-			Blue	= 4,
+      /// <summary>
+      /// color is blue
+      /// </summary>
+      Blue = 4,
 
-			/// <summary>
-			/// color is magenta
-			/// </summary>
-			Magenta	= 5,
+      /// <summary>
+      /// color is magenta
+      /// </summary>
+      Magenta = 5,
 
-			/// <summary>
-			/// color is cyan
-			/// </summary>
-			Cyan	= 6,
+      /// <summary>
+      /// color is cyan
+      /// </summary>
+      Cyan = 6,
 
-			/// <summary>
-			/// color is white
-			/// </summary>
-			White	= 7
-		}
+      /// <summary>
+      /// color is white
+      /// </summary>
+      White = 7
+    }
 
-		#endregion
+    #endregion
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="AnsiColorTerminalAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// The instance of the <see cref="AnsiColorTerminalAppender" /> class is set up to write 
-		/// to the standard output stream.
-		/// </remarks>
-		public AnsiColorTerminalAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AnsiColorTerminalAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// The instance of the <see cref="AnsiColorTerminalAppender" /> class is set up to write 
+    /// to the standard output stream.
+    /// </remarks>
+    public AnsiColorTerminalAppender()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Target is the value of the console output stream.
-		/// </summary>
-		/// <value>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </para>
-		/// </remarks>
-		public virtual string Target
-		{
-			get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
-			set
-			{
-				string trimmedTargetName = value.Trim();
+    /// <summary>
+    /// Target is the value of the console output stream.
+    /// </summary>
+    /// <value>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </para>
+    /// </remarks>
+    public virtual string Target
+    {
+      get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
+      set
+      {
+        string trimmedTargetName = value.Trim();
 
-				if (SystemInfo.EqualsIgnoringCase(ConsoleError, trimmedTargetName))
-				{
-					m_writeToErrorStream = true;
-				} 
-				else 
-				{
-					m_writeToErrorStream = false;
-				}
-			}
-		}
+        if (SystemInfo.EqualsIgnoringCase(ConsoleError, trimmedTargetName))
+        {
+          m_writeToErrorStream = true;
+        }
+        else
+        {
+          m_writeToErrorStream = false;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Add a mapping of level to color
-		/// </summary>
-		/// <param name="mapping">The mapping to add</param>
-		/// <remarks>
-		/// <para>
-		/// Add a <see cref="LevelColors"/> mapping to this appender.
-		/// Each mapping defines the foreground and background colours
-		/// for a level.
-		/// </para>
-		/// </remarks>
-		public void AddMapping(LevelColors mapping)
-		{
-			m_levelMapping.Add(mapping);
-		}
+    /// <summary>
+    /// Add a mapping of level to color
+    /// </summary>
+    /// <param name="mapping">The mapping to add</param>
+    /// <remarks>
+    /// <para>
+    /// Add a <see cref="LevelColors"/> mapping to this appender.
+    /// Each mapping defines the foreground and background colours
+    /// for a level.
+    /// </para>
+    /// </remarks>
+    public void AddMapping(LevelColors mapping)
+    {
+      m_levelMapping.Add(mapping);
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the event to the console.
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
-		protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
-		{
-			string loggingMessage = RenderLoggingEvent(loggingEvent);
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the event to the console.
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
+    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
+    {
+      string loggingMessage = RenderLoggingEvent(loggingEvent);
 
-			// see if there is a specified lookup.
-			LevelColors levelColors = m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
-			if (levelColors != null)
-			{
-				// Prepend the Ansi Color code
-				loggingMessage = levelColors.CombinedColor + loggingMessage;
-			}
+      // see if there is a specified lookup.
+      LevelColors levelColors = m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
+      if (levelColors != null)
+      {
+        // Prepend the Ansi Color code
+        loggingMessage = levelColors.CombinedColor + loggingMessage;
+      }
 
-			// on most terminals there are weird effects if we don't clear the background color
-			// before the new line.  This checks to see if it ends with a newline, and if
-			// so, inserts the clear codes before the newline, otherwise the clear codes
-			// are inserted afterwards.
-			if (loggingMessage.Length > 1)
-			{
-				if (loggingMessage.EndsWith("\r\n") || loggingMessage.EndsWith("\n\r")) 
-				{
-					loggingMessage = loggingMessage.Insert(loggingMessage.Length - 2, PostEventCodes);
-				} 
-				else if (loggingMessage.EndsWith("\n") || loggingMessage.EndsWith("\r")) 
-				{
-					loggingMessage = loggingMessage.Insert(loggingMessage.Length - 1, PostEventCodes);
-				} 
-				else 
-				{
-					loggingMessage = loggingMessage + PostEventCodes;
-				}
-			}
-			else
-			{
-				if (loggingMessage[0] == '\n' || loggingMessage[0] == '\r') 
-				{
-					loggingMessage = PostEventCodes + loggingMessage;
-				} 
-				else 
-				{
-					loggingMessage = loggingMessage + PostEventCodes;
-				}
-			}
+      // on most terminals there are weird effects if we don't clear the background color
+      // before the new line.  This checks to see if it ends with a newline, and if
+      // so, inserts the clear codes before the newline, otherwise the clear codes
+      // are inserted afterwards.
+      if (loggingMessage.Length > 1)
+      {
+        if (loggingMessage.EndsWith("\r\n") || loggingMessage.EndsWith("\n\r"))
+        {
+          loggingMessage = loggingMessage.Insert(loggingMessage.Length - 2, PostEventCodes);
+        }
+        else if (loggingMessage.EndsWith("\n") || loggingMessage.EndsWith("\r"))
+        {
+          loggingMessage = loggingMessage.Insert(loggingMessage.Length - 1, PostEventCodes);
+        }
+        else
+        {
+          loggingMessage = loggingMessage + PostEventCodes;
+        }
+      }
+      else
+      {
+        if (loggingMessage[0] == '\n' || loggingMessage[0] == '\r')
+        {
+          loggingMessage = PostEventCodes + loggingMessage;
+        }
+        else
+        {
+          loggingMessage = loggingMessage + PostEventCodes;
+        }
+      }
 
 #if NETCF_1_0
-			// Write to the output stream
-			Console.Write(loggingMessage);
+      // Write to the output stream
+      Console.Write(loggingMessage);
 #else
-			if (m_writeToErrorStream)
-			{
-				// Write to the error stream
-				Console.Error.Write(loggingMessage);
-			}
-			else
-			{
-				// Write to the output stream
-				Console.Write(loggingMessage);
-			}
+      if (m_writeToErrorStream)
+      {
+        // Write to the error stream
+        Console.Error.Write(loggingMessage);
+      }
+      else
+      {
+        // Write to the output stream
+        Console.Write(loggingMessage);
+      }
 #endif
-		
-		}
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    }
 
-		/// <summary>
-		/// Initialize the options for this appender
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initialize the level to color mappings set on this appender.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
-			m_levelMapping.ActivateOptions();
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    /// <summary>
+    /// Initialize the options for this appender
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initialize the level to color mappings set on this appender.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
+      m_levelMapping.ActivateOptions();
+    }
 
-		#region Public Static Fields
+    #endregion Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleOut = "Console.Out";
+    #region Public Static Fields
 
-		/// <summary>
-		/// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleError = "Console.Error";
+    /// <summary>
+    /// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleOut = "Console.Out";
 
-		#endregion Public Static Fields
+    /// <summary>
+    /// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AnsiColorTerminalAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleError = "Console.Error";
 
-		#region Private Instances Fields
+    #endregion Public Static Fields
 
-		/// <summary>
-		/// Flag to write output to the error stream rather than the standard output stream
-		/// </summary>
-		private bool m_writeToErrorStream = false;
+    #region Private Instances Fields
 
-		/// <summary>
-		/// Mapping from level object to color value
-		/// </summary>
-		private LevelMapping m_levelMapping = new LevelMapping();
+    /// <summary>
+    /// Flag to write output to the error stream rather than the standard output stream
+    /// </summary>
+    private bool m_writeToErrorStream = false;
 
-		/// <summary>
-		/// Ansi code to reset terminal
-		/// </summary>
-		private const string PostEventCodes = "\x1b[0m";
+    /// <summary>
+    /// Mapping from level object to color value
+    /// </summary>
+    private LevelMapping m_levelMapping = new LevelMapping();
 
-		#endregion Private Instances Fields
+    /// <summary>
+    /// Ansi code to reset terminal
+    /// </summary>
+    private const string PostEventCodes = "\x1b[0m";
 
-		#region LevelColors LevelMapping Entry
+    #endregion Private Instances Fields
 
-		/// <summary>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the color it should be displayed as.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Defines the mapping between a level and the color it should be displayed in.
-		/// </para>
-		/// </remarks>
-		public class LevelColors : LevelMappingEntry
-		{
-			private AnsiColor m_foreColor;
-			private AnsiColor m_backColor;
-			private AnsiAttributes m_attributes;
-			private string m_combinedColor = "";
+    #region LevelColors LevelMapping Entry
 
-			/// <summary>
-			/// The mapped foreground color for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped foreground color for the specified level
-			/// </para>
-			/// </remarks>
-			public AnsiColor ForeColor
-			{
-				get { return m_foreColor; }
-				set { m_foreColor = value; }
-			}
+    /// <summary>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the color it should be displayed as.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defines the mapping between a level and the color it should be displayed in.
+    /// </para>
+    /// </remarks>
+    public class LevelColors : LevelMappingEntry
+    {
+      private AnsiColor m_foreColor;
+      private AnsiColor m_backColor;
+      private AnsiAttributes m_attributes;
+      private string m_combinedColor = "";
 
-			/// <summary>
-			/// The mapped background color for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped background color for the specified level
-			/// </para>
-			/// </remarks>
-			public AnsiColor BackColor
-			{
-				get { return m_backColor; }
-				set { m_backColor = value; }
-			}
+      /// <summary>
+      /// The mapped foreground color for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped foreground color for the specified level
+      /// </para>
+      /// </remarks>
+      public AnsiColor ForeColor
+      {
+        get { return m_foreColor; }
+        set { m_foreColor = value; }
+      }
 
-			/// <summary>
-			/// The color attributes for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The color attributes for the specified level
-			/// </para>
-			/// </remarks>
-			public AnsiAttributes Attributes
-			{
-				get { return m_attributes; }
-				set { m_attributes = value; }
-			}
+      /// <summary>
+      /// The mapped background color for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped background color for the specified level
+      /// </para>
+      /// </remarks>
+      public AnsiColor BackColor
+      {
+        get { return m_backColor; }
+        set { m_backColor = value; }
+      }
 
-			/// <summary>
-			/// Initialize the options for the object
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Combine the <see cref="ForeColor"/> and <see cref="BackColor"/> together
-			/// and append the attributes.
-			/// </para>
-			/// </remarks>
-			public override void ActivateOptions()
-			{
-				base.ActivateOptions();
+      /// <summary>
+      /// The color attributes for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The color attributes for the specified level
+      /// </para>
+      /// </remarks>
+      public AnsiAttributes Attributes
+      {
+        get { return m_attributes; }
+        set { m_attributes = value; }
+      }
 
-				StringBuilder buf = new StringBuilder();
+      /// <summary>
+      /// Initialize the options for the object
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Combine the <see cref="ForeColor"/> and <see cref="BackColor"/> together
+      /// and append the attributes.
+      /// </para>
+      /// </remarks>
+      public override void ActivateOptions()
+      {
+        base.ActivateOptions();
 
-				// Reset any existing codes
-				buf.Append("\x1b[0;");
+        StringBuilder buf = new StringBuilder();
 
-				int lightAdjustment = ((m_attributes & AnsiAttributes.Light) > 0) ? 60 : 0;
-				
-				// set the foreground color
-				buf.Append(30 + lightAdjustment + (int)m_foreColor);
-				buf.Append(';');
+        // Reset any existing codes
+        buf.Append("\x1b[0;");
 
-				// set the background color
-				buf.Append(40 + lightAdjustment + (int)m_backColor);
+        int lightAdjustment = ((m_attributes & AnsiAttributes.Light) > 0) ? 60 : 0;
 
-				// set the attributes
-				if ((m_attributes & AnsiAttributes.Bright) > 0)
-				{
-					buf.Append(";1");
-				}
-				if ((m_attributes & AnsiAttributes.Dim) > 0)
-				{
-					buf.Append(";2");
-				}
-				if ((m_attributes & AnsiAttributes.Underscore) > 0)
-				{
-					buf.Append(";4");
-				}
-				if ((m_attributes & AnsiAttributes.Blink) > 0)
-				{
-					buf.Append(";5");
-				}
-				if ((m_attributes & AnsiAttributes.Reverse) > 0)
-				{
-					buf.Append(";7");
-				}
-				if ((m_attributes & AnsiAttributes.Hidden) > 0)
-				{
-					buf.Append(";8");
-				}
-				if ((m_attributes & AnsiAttributes.Strikethrough) > 0)
-				{
-					buf.Append(";9");
-				}
+        // set the foreground color
+        buf.Append(30 + lightAdjustment + (int)m_foreColor);
+        buf.Append(';');
 
-				buf.Append('m');
+        // set the background color
+        buf.Append(40 + lightAdjustment + (int)m_backColor);
 
-				m_combinedColor = buf.ToString();
-			}
+        // set the attributes
+        if ((m_attributes & AnsiAttributes.Bright) > 0)
+        {
+          buf.Append(";1");
+        }
+        if ((m_attributes & AnsiAttributes.Dim) > 0)
+        {
+          buf.Append(";2");
+        }
+        if ((m_attributes & AnsiAttributes.Underscore) > 0)
+        {
+          buf.Append(";4");
+        }
+        if ((m_attributes & AnsiAttributes.Blink) > 0)
+        {
+          buf.Append(";5");
+        }
+        if ((m_attributes & AnsiAttributes.Reverse) > 0)
+        {
+          buf.Append(";7");
+        }
+        if ((m_attributes & AnsiAttributes.Hidden) > 0)
+        {
+          buf.Append(";8");
+        }
+        if ((m_attributes & AnsiAttributes.Strikethrough) > 0)
+        {
+          buf.Append(";9");
+        }
 
-			/// <summary>
-			/// The combined <see cref="ForeColor"/>, <see cref="BackColor"/> and
-			/// <see cref="Attributes"/> suitable for setting the ansi terminal color.
-			/// </summary>
-			internal string CombinedColor
-			{
-				get { return m_combinedColor; }
-			}
-		}
+        buf.Append('m');
 
-		#endregion // LevelColors LevelMapping Entry
-	}
+        m_combinedColor = buf.ToString();
+      }
+
+      /// <summary>
+      /// The combined <see cref="ForeColor"/>, <see cref="BackColor"/> and
+      /// <see cref="Attributes"/> suitable for setting the ansi terminal color.
+      /// </summary>
+      internal string CombinedColor
+      {
+        get { return m_combinedColor; }
+      }
+    }
+
+    #endregion // LevelColors LevelMapping Entry
+  }
 }
diff --git a/src/log4net/Appender/AppenderCollection.cs b/src/log4net/Appender/AppenderCollection.cs
index 14f2304..768f318 100644
--- a/src/log4net/Appender/AppenderCollection.cs
+++ b/src/log4net/Appender/AppenderCollection.cs
@@ -22,884 +22,884 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// A strongly-typed collection of <see cref="IAppender"/> objects.
-	/// </summary>
-	/// <author>Nicko Cadell</author>
-	public class AppenderCollection : ICollection, IList, IEnumerable
+  /// <summary>
+  /// A strongly-typed collection of <see cref="IAppender"/> objects.
+  /// </summary>
+  /// <author>Nicko Cadell</author>
+  public class AppenderCollection : ICollection, IList, IEnumerable
 #if !NETSTANDARD1_3
-		, ICloneable
+    , ICloneable
 #endif
-	{
-		#region Interfaces
-		/// <summary>
-		/// Supports type-safe iteration over a <see cref="AppenderCollection"/>.
-		/// </summary>
-		/// <exclude/>
-		public interface IAppenderCollectionEnumerator
-		{
-			/// <summary>
-			/// Gets the current element in the collection.
-			/// </summary>
-			IAppender Current { get; }
+  {
+    #region Interfaces
+    /// <summary>
+    /// Supports type-safe iteration over a <see cref="AppenderCollection"/>.
+    /// </summary>
+    /// <exclude/>
+    public interface IAppenderCollectionEnumerator
+    {
+      /// <summary>
+      /// Gets the current element in the collection.
+      /// </summary>
+      IAppender Current { get; }
 
-			/// <summary>
-			/// Advances the enumerator to the next element in the collection.
-			/// </summary>
-			/// <returns>
-			/// <c>true</c> if the enumerator was successfully advanced to the next element; 
-			/// <c>false</c> if the enumerator has passed the end of the collection.
-			/// </returns>
-			/// <exception cref="InvalidOperationException">
-			/// The collection was modified after the enumerator was created.
-			/// </exception>
-			bool MoveNext();
+      /// <summary>
+      /// Advances the enumerator to the next element in the collection.
+      /// </summary>
+      /// <returns>
+      /// <c>true</c> if the enumerator was successfully advanced to the next element; 
+      /// <c>false</c> if the enumerator has passed the end of the collection.
+      /// </returns>
+      /// <exception cref="InvalidOperationException">
+      /// The collection was modified after the enumerator was created.
+      /// </exception>
+      bool MoveNext();
 
-			/// <summary>
-			/// Sets the enumerator to its initial position, before the first element in the collection.
-			/// </summary>
-			void Reset();
-		}
-		#endregion
+      /// <summary>
+      /// Sets the enumerator to its initial position, before the first element in the collection.
+      /// </summary>
+      void Reset();
+    }
+    #endregion
 
-		private const int DEFAULT_CAPACITY = 16;
+    private const int DEFAULT_CAPACITY = 16;
 
-		#region Implementation (data)
+    #region Implementation (data)
 
-		private IAppender[] m_array;
-		private int m_count = 0;
-		private int m_version = 0;
+    private IAppender[] m_array;
+    private int m_count = 0;
+    private int m_version = 0;
 
-		#endregion
-	
-		#region Static Wrappers
+    #endregion
 
-		/// <summary>
-		/// Creates a read-only wrapper for a <c>AppenderCollection</c> instance.
-		/// </summary>
-		/// <param name="list">list to create a readonly wrapper arround</param>
-		/// <returns>
-		/// An <c>AppenderCollection</c> wrapper that is read-only.
-		/// </returns>
-		public static AppenderCollection ReadOnly(AppenderCollection list)
-		{
-			if(list==null) throw new ArgumentNullException("list");
+    #region Static Wrappers
 
-			return new ReadOnlyAppenderCollection(list);
-		}
+    /// <summary>
+    /// Creates a read-only wrapper for a <c>AppenderCollection</c> instance.
+    /// </summary>
+    /// <param name="list">list to create a readonly wrapper arround</param>
+    /// <returns>
+    /// An <c>AppenderCollection</c> wrapper that is read-only.
+    /// </returns>
+    public static AppenderCollection ReadOnly(AppenderCollection list)
+    {
+      if (list == null) throw new ArgumentNullException("list");
 
-		#endregion
+      return new ReadOnlyAppenderCollection(list);
+    }
 
-		#region Static Fields
+    #endregion
 
-		/// <summary>
-		/// An empty readonly static AppenderCollection
-		/// </summary>
-		public static readonly AppenderCollection EmptyCollection = ReadOnly(new AppenderCollection(0));
+    #region Static Fields
 
-		#endregion
+    /// <summary>
+    /// An empty readonly static AppenderCollection
+    /// </summary>
+    public static readonly AppenderCollection EmptyCollection = ReadOnly(new AppenderCollection(0));
 
-		#region Constructors
+    #endregion
 
-		/// <summary>
-		/// Initializes a new instance of the <c>AppenderCollection</c> class
-		/// that is empty and has the default initial capacity.
-		/// </summary>
-		public AppenderCollection()
-		{
-			m_array = new IAppender[DEFAULT_CAPACITY];
-		}
-		
-		/// <summary>
-		/// Initializes a new instance of the <c>AppenderCollection</c> class
-		/// that has the specified initial capacity.
-		/// </summary>
-		/// <param name="capacity">
-		/// The number of elements that the new <c>AppenderCollection</c> is initially capable of storing.
-		/// </param>
-		public AppenderCollection(int capacity)
-		{
-			m_array = new IAppender[capacity];
-		}
+    #region Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <c>AppenderCollection</c> class
-		/// that contains elements copied from the specified <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="c">The <c>AppenderCollection</c> whose elements are copied to the new collection.</param>
-		public AppenderCollection(AppenderCollection c)
-		{
-			m_array = new IAppender[c.Count];
-			AddRange(c);
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>AppenderCollection</c> class
+    /// that is empty and has the default initial capacity.
+    /// </summary>
+    public AppenderCollection()
+    {
+      m_array = new IAppender[DEFAULT_CAPACITY];
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <c>AppenderCollection</c> class
-		/// that contains elements copied from the specified <see cref="IAppender"/> array.
-		/// </summary>
-		/// <param name="a">The <see cref="IAppender"/> array whose elements are copied to the new list.</param>
-		public AppenderCollection(IAppender[] a)
-		{
-			m_array = new IAppender[a.Length];
-			AddRange(a);
-		}
-		
-		/// <summary>
-		/// Initializes a new instance of the <c>AppenderCollection</c> class
-		/// that contains elements copied from the specified <see cref="IAppender"/> collection.
-		/// </summary>
-		/// <param name="col">The <see cref="IAppender"/> collection whose elements are copied to the new list.</param>
-		public AppenderCollection(ICollection col)
-		{
-			m_array = new IAppender[col.Count];
-			AddRange(col);
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>AppenderCollection</c> class
+    /// that has the specified initial capacity.
+    /// </summary>
+    /// <param name="capacity">
+    /// The number of elements that the new <c>AppenderCollection</c> is initially capable of storing.
+    /// </param>
+    public AppenderCollection(int capacity)
+    {
+      m_array = new IAppender[capacity];
+    }
 
-		/// <summary>
-		/// Type visible only to our subclasses
-		/// Used to access protected constructor
-		/// </summary>
-		/// <exclude/>
-		protected internal enum Tag 
-		{
-			/// <summary>
-			/// A value
-			/// </summary>
-			Default
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>AppenderCollection</c> class
+    /// that contains elements copied from the specified <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="c">The <c>AppenderCollection</c> whose elements are copied to the new collection.</param>
+    public AppenderCollection(AppenderCollection c)
+    {
+      m_array = new IAppender[c.Count];
+      AddRange(c);
+    }
 
-		/// <summary>
-		/// Allow subclasses to avoid our default constructors
-		/// </summary>
-		/// <param name="tag"></param>
-		/// <exclude/>
-		protected internal AppenderCollection(Tag tag)
-		{
-			m_array = null;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>AppenderCollection</c> class
+    /// that contains elements copied from the specified <see cref="IAppender"/> array.
+    /// </summary>
+    /// <param name="a">The <see cref="IAppender"/> array whose elements are copied to the new list.</param>
+    public AppenderCollection(IAppender[] a)
+    {
+      m_array = new IAppender[a.Length];
+      AddRange(a);
+    }
 
-		#endregion
-		
-		#region Operations (type-safe ICollection)
+    /// <summary>
+    /// Initializes a new instance of the <c>AppenderCollection</c> class
+    /// that contains elements copied from the specified <see cref="IAppender"/> collection.
+    /// </summary>
+    /// <param name="col">The <see cref="IAppender"/> collection whose elements are copied to the new list.</param>
+    public AppenderCollection(ICollection col)
+    {
+      m_array = new IAppender[col.Count];
+      AddRange(col);
+    }
 
-		/// <summary>
-		/// Gets the number of elements actually contained in the <c>AppenderCollection</c>.
-		/// </summary>
-		public virtual int Count
-		{
-			get { return m_count; }
-		}
+    /// <summary>
+    /// Type visible only to our subclasses
+    /// Used to access protected constructor
+    /// </summary>
+    /// <exclude/>
+    protected internal enum Tag
+    {
+      /// <summary>
+      /// A value
+      /// </summary>
+      Default
+    }
 
-		/// <summary>
-		/// Copies the entire <c>AppenderCollection</c> to a one-dimensional
-		/// <see cref="IAppender"/> array.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="IAppender"/> array to copy to.</param>
-		public virtual void CopyTo(IAppender[] array)
-		{
-			this.CopyTo(array, 0);
-		}
+    /// <summary>
+    /// Allow subclasses to avoid our default constructors
+    /// </summary>
+    /// <param name="tag"></param>
+    /// <exclude/>
+    protected internal AppenderCollection(Tag tag)
+    {
+      m_array = null;
+    }
 
-		/// <summary>
-		/// Copies the entire <c>AppenderCollection</c> to a one-dimensional
-		/// <see cref="IAppender"/> array, starting at the specified index of the target array.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="IAppender"/> array to copy to.</param>
-		/// <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
-		public virtual void CopyTo(IAppender[] array, int start)
-		{
-			if (m_count > array.GetUpperBound(0) + 1 - start)
-			{
-				throw new System.ArgumentException("Destination array was not long enough.");
-			}
-			
-			Array.Copy(m_array, 0, array, start, m_count); 
-		}
+    #endregion
 
-		/// <summary>
-		/// Gets a value indicating whether access to the collection is synchronized (thread-safe).
-		/// </summary>
-		/// <returns>false, because the backing type is an array, which is never thread-safe.</returns>
-		public virtual bool IsSynchronized
-		{
-			get { return false; }
-		}
+    #region Operations (type-safe ICollection)
 
-		/// <summary>
-		/// Gets an object that can be used to synchronize access to the collection.
-		/// </summary>
-		public virtual object SyncRoot
-		{
-			get { return m_array; }
-		}
+    /// <summary>
+    /// Gets the number of elements actually contained in the <c>AppenderCollection</c>.
+    /// </summary>
+    public virtual int Count
+    {
+      get { return m_count; }
+    }
 
-		#endregion
-		
-		#region Operations (type-safe IList)
+    /// <summary>
+    /// Copies the entire <c>AppenderCollection</c> to a one-dimensional
+    /// <see cref="IAppender"/> array.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="IAppender"/> array to copy to.</param>
+    public virtual void CopyTo(IAppender[] array)
+    {
+      this.CopyTo(array, 0);
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="IAppender"/> at the specified index.
-		/// </summary>
-		/// <param name="index">The zero-based index of the element to get or set.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		///		<para><paramref name="index"/> is less than zero</para>
-		///		<para>-or-</para>
-		///		<para><paramref name="index"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
-		/// </exception>
-		public virtual IAppender this[int index]
-		{
-			get
-			{
-				ValidateIndex(index); // throws
-				return m_array[index]; 
-			}
-			set
-			{
-				ValidateIndex(index); // throws
-				++m_version; 
-				m_array[index] = value; 
-			}
-		}
+    /// <summary>
+    /// Copies the entire <c>AppenderCollection</c> to a one-dimensional
+    /// <see cref="IAppender"/> array, starting at the specified index of the target array.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="IAppender"/> array to copy to.</param>
+    /// <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+    public virtual void CopyTo(IAppender[] array, int start)
+    {
+      if (m_count > array.GetUpperBound(0) + 1 - start)
+      {
+        throw new System.ArgumentException("Destination array was not long enough.");
+      }
 
-		/// <summary>
-		/// Adds a <see cref="IAppender"/> to the end of the <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IAppender"/> to be added to the end of the <c>AppenderCollection</c>.</param>
-		/// <returns>The index at which the value has been added.</returns>
-		public virtual int Add(IAppender item)
-		{
-			if (m_count == m_array.Length)
-			{
-				EnsureCapacity(m_count + 1);
-			}
+      Array.Copy(m_array, 0, array, start, m_count);
+    }
 
-			m_array[m_count] = item;
-			m_version++;
+    /// <summary>
+    /// Gets a value indicating whether access to the collection is synchronized (thread-safe).
+    /// </summary>
+    /// <returns>false, because the backing type is an array, which is never thread-safe.</returns>
+    public virtual bool IsSynchronized
+    {
+      get { return false; }
+    }
 
-			return m_count++;
-		}
-		
-		/// <summary>
-		/// Removes all elements from the <c>AppenderCollection</c>.
-		/// </summary>
-		public virtual void Clear()
-		{
-			++m_version;
-			m_array = new IAppender[DEFAULT_CAPACITY];
-			m_count = 0;
-		}
-		
-		/// <summary>
-		/// Creates a shallow copy of the <see cref="AppenderCollection"/>.
-		/// </summary>
-		/// <returns>A new <see cref="AppenderCollection"/> with a shallow copy of the collection data.</returns>
-		public virtual object Clone()
-		{
-			AppenderCollection newCol = new AppenderCollection(m_count);
-			Array.Copy(m_array, 0, newCol.m_array, 0, m_count);
-			newCol.m_count = m_count;
-			newCol.m_version = m_version;
+    /// <summary>
+    /// Gets an object that can be used to synchronize access to the collection.
+    /// </summary>
+    public virtual object SyncRoot
+    {
+      get { return m_array; }
+    }
 
-			return newCol;
-		}
+    #endregion
 
-		/// <summary>
-		/// Determines whether a given <see cref="IAppender"/> is in the <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IAppender"/> to check for.</param>
-		/// <returns><c>true</c> if <paramref name="item"/> is found in the <c>AppenderCollection</c>; otherwise, <c>false</c>.</returns>
-		public virtual bool Contains(IAppender item)
-		{
-			for (int i=0; i != m_count; ++i)
-			{
-				if (m_array[i].Equals(item))
-				{
-					return true;
-				}
-			}
-			return false;
-		}
+    #region Operations (type-safe IList)
 
-		/// <summary>
-		/// Returns the zero-based index of the first occurrence of a <see cref="IAppender"/>
-		/// in the <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IAppender"/> to locate in the <c>AppenderCollection</c>.</param>
-		/// <returns>
-		/// The zero-based index of the first occurrence of <paramref name="item"/> 
-		/// in the entire <c>AppenderCollection</c>, if found; otherwise, -1.
-		/// </returns>
-		public virtual int IndexOf(IAppender item)
-		{
-			for (int i=0; i != m_count; ++i)
-			{
-				if (m_array[i].Equals(item))
-				{
-					return i;
-				}
-			}
-			return -1;
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="IAppender"/> at the specified index.
+    /// </summary>
+    /// <param name="index">The zero-based index of the element to get or set.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    ///    <para><paramref name="index"/> is less than zero</para>
+    ///    <para>-or-</para>
+    ///    <para><paramref name="index"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
+    /// </exception>
+    public virtual IAppender this[int index]
+    {
+      get
+      {
+        ValidateIndex(index); // throws
+        return m_array[index];
+      }
+      set
+      {
+        ValidateIndex(index); // throws
+        ++m_version;
+        m_array[index] = value;
+      }
+    }
 
-		/// <summary>
-		/// Inserts an element into the <c>AppenderCollection</c> at the specified index.
-		/// </summary>
-		/// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
-		/// <param name="item">The <see cref="IAppender"/> to insert.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
-		/// </exception>
-		public virtual void Insert(int index, IAppender item)
-		{
-			ValidateIndex(index, true); // throws
-			
-			if (m_count == m_array.Length)
-			{
-				EnsureCapacity(m_count + 1);
-			}
+    /// <summary>
+    /// Adds a <see cref="IAppender"/> to the end of the <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IAppender"/> to be added to the end of the <c>AppenderCollection</c>.</param>
+    /// <returns>The index at which the value has been added.</returns>
+    public virtual int Add(IAppender item)
+    {
+      if (m_count == m_array.Length)
+      {
+        EnsureCapacity(m_count + 1);
+      }
 
-			if (index < m_count)
-			{
-				Array.Copy(m_array, index, m_array, index + 1, m_count - index);
-			}
+      m_array[m_count] = item;
+      m_version++;
 
-			m_array[index] = item;
-			m_count++;
-			m_version++;
-		}
+      return m_count++;
+    }
 
-		/// <summary>
-		/// Removes the first occurrence of a specific <see cref="IAppender"/> from the <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IAppender"/> to remove from the <c>AppenderCollection</c>.</param>
-		/// <exception cref="ArgumentException">
-		/// The specified <see cref="IAppender"/> was not found in the <c>AppenderCollection</c>.
-		/// </exception>
-		public virtual void Remove(IAppender item)
-		{		   
-			int i = IndexOf(item);
-			if (i < 0)
-			{
-				throw new System.ArgumentException("Cannot remove the specified item because it was not found in the specified Collection.");
-			}
-			
-			++m_version;
-			RemoveAt(i);
-		}
+    /// <summary>
+    /// Removes all elements from the <c>AppenderCollection</c>.
+    /// </summary>
+    public virtual void Clear()
+    {
+      ++m_version;
+      m_array = new IAppender[DEFAULT_CAPACITY];
+      m_count = 0;
+    }
+
+    /// <summary>
+    /// Creates a shallow copy of the <see cref="AppenderCollection"/>.
+    /// </summary>
+    /// <returns>A new <see cref="AppenderCollection"/> with a shallow copy of the collection data.</returns>
+    public virtual object Clone()
+    {
+      AppenderCollection newCol = new AppenderCollection(m_count);
+      Array.Copy(m_array, 0, newCol.m_array, 0, m_count);
+      newCol.m_count = m_count;
+      newCol.m_version = m_version;
+
+      return newCol;
+    }
+
+    /// <summary>
+    /// Determines whether a given <see cref="IAppender"/> is in the <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IAppender"/> to check for.</param>
+    /// <returns><c>true</c> if <paramref name="item"/> is found in the <c>AppenderCollection</c>; otherwise, <c>false</c>.</returns>
+    public virtual bool Contains(IAppender item)
+    {
+      for (int i = 0; i != m_count; ++i)
+      {
+        if (m_array[i].Equals(item))
+        {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    /// <summary>
+    /// Returns the zero-based index of the first occurrence of a <see cref="IAppender"/>
+    /// in the <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IAppender"/> to locate in the <c>AppenderCollection</c>.</param>
+    /// <returns>
+    /// The zero-based index of the first occurrence of <paramref name="item"/> 
+    /// in the entire <c>AppenderCollection</c>, if found; otherwise, -1.
+    /// </returns>
+    public virtual int IndexOf(IAppender item)
+    {
+      for (int i = 0; i != m_count; ++i)
+      {
+        if (m_array[i].Equals(item))
+        {
+          return i;
+        }
+      }
+      return -1;
+    }
+
+    /// <summary>
+    /// Inserts an element into the <c>AppenderCollection</c> at the specified index.
+    /// </summary>
+    /// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+    /// <param name="item">The <see cref="IAppender"/> to insert.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
+    /// </exception>
+    public virtual void Insert(int index, IAppender item)
+    {
+      ValidateIndex(index, true); // throws
+
+      if (m_count == m_array.Length)
+      {
+        EnsureCapacity(m_count + 1);
+      }
+
+      if (index < m_count)
+      {
+        Array.Copy(m_array, index, m_array, index + 1, m_count - index);
+      }
+
+      m_array[index] = item;
+      m_count++;
+      m_version++;
+    }
+
+    /// <summary>
+    /// Removes the first occurrence of a specific <see cref="IAppender"/> from the <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IAppender"/> to remove from the <c>AppenderCollection</c>.</param>
+    /// <exception cref="ArgumentException">
+    /// The specified <see cref="IAppender"/> was not found in the <c>AppenderCollection</c>.
+    /// </exception>
+    public virtual void Remove(IAppender item)
+    {
+      int i = IndexOf(item);
+      if (i < 0)
+      {
+        throw new System.ArgumentException("Cannot remove the specified item because it was not found in the specified Collection.");
+      }
+
+      ++m_version;
+      RemoveAt(i);
+    }
+
+    /// <summary>
+    /// Removes the element at the specified index of the <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="index">The zero-based index of the element to remove.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
+    /// </exception>
+    public virtual void RemoveAt(int index)
+    {
+      ValidateIndex(index); // throws
+
+      m_count--;
+
+      if (index < m_count)
+      {
+        Array.Copy(m_array, index + 1, m_array, index, m_count - index);
+      }
+
+      // We can't set the deleted entry equal to null, because it might be a value type.
+      // Instead, we'll create an empty single-element array of the right type and copy it 
+      // over the entry we want to erase.
+      IAppender[] temp = new IAppender[1];
+      Array.Copy(temp, 0, m_array, m_count, 1);
+      m_version++;
+    }
+
+    /// <summary>
+    /// Gets a value indicating whether the collection has a fixed size.
+    /// </summary>
+    /// <value>true if the collection has a fixed size; otherwise, false. The default is false</value>
+    public virtual bool IsFixedSize
+    {
+      get { return false; }
+    }
+
+    /// <summary>
+    /// Gets a value indicating whether the IList is read-only.
+    /// </summary>
+    /// <value>true if the collection is read-only; otherwise, false. The default is false</value>
+    public virtual bool IsReadOnly
+    {
+      get { return false; }
+    }
+
+    #endregion
+
+    #region Operations (type-safe IEnumerable)
+
+    /// <summary>
+    /// Returns an enumerator that can iterate through the <c>AppenderCollection</c>.
+    /// </summary>
+    /// <returns>An <see cref="Enumerator"/> for the entire <c>AppenderCollection</c>.</returns>
+    public virtual IAppenderCollectionEnumerator GetEnumerator()
+    {
+      return new Enumerator(this);
+    }
+
+    #endregion
+
+    #region Public helpers (just to mimic some nice features of ArrayList)
+
+    /// <summary>
+    /// Gets or sets the number of elements the <c>AppenderCollection</c> can contain.
+    /// </summary>
+    public virtual int Capacity
+    {
+      get
+      {
+        return m_array.Length;
+      }
+      set
+      {
+        if (value < m_count)
+        {
+          value = m_count;
+        }
+
+        if (value != m_array.Length)
+        {
+          if (value > 0)
+          {
+            IAppender[] temp = new IAppender[value];
+            Array.Copy(m_array, 0, temp, 0, m_count);
+            m_array = temp;
+          }
+          else
+          {
+            m_array = new IAppender[DEFAULT_CAPACITY];
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Adds the elements of another <c>AppenderCollection</c> to the current <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="x">The <c>AppenderCollection</c> whose elements should be added to the end of the current <c>AppenderCollection</c>.</param>
+    /// <returns>The new <see cref="AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
+    public virtual int AddRange(AppenderCollection x)
+    {
+      if (m_count + x.Count >= m_array.Length)
+      {
+        EnsureCapacity(m_count + x.Count);
+      }
+
+      Array.Copy(x.m_array, 0, m_array, m_count, x.Count);
+      m_count += x.Count;
+      m_version++;
+
+      return m_count;
+    }
+
+    /// <summary>
+    /// Adds the elements of a <see cref="IAppender"/> array to the current <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="x">The <see cref="IAppender"/> array whose elements should be added to the end of the <c>AppenderCollection</c>.</param>
+    /// <returns>The new <see cref="AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
+    public virtual int AddRange(IAppender[] x)
+    {
+      if (m_count + x.Length >= m_array.Length)
+      {
+        EnsureCapacity(m_count + x.Length);
+      }
 
-		/// <summary>
-		/// Removes the element at the specified index of the <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="index">The zero-based index of the element to remove.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
-		/// </exception>
-		public virtual void RemoveAt(int index)
-		{
-			ValidateIndex(index); // throws
-			
-			m_count--;
+      Array.Copy(x, 0, m_array, m_count, x.Length);
+      m_count += x.Length;
+      m_version++;
 
-			if (index < m_count)
-			{
-				Array.Copy(m_array, index + 1, m_array, index, m_count - index);
-			}
-			
-			// We can't set the deleted entry equal to null, because it might be a value type.
-			// Instead, we'll create an empty single-element array of the right type and copy it 
-			// over the entry we want to erase.
-			IAppender[] temp = new IAppender[1];
-			Array.Copy(temp, 0, m_array, m_count, 1);
-			m_version++;
-		}
+      return m_count;
+    }
 
-		/// <summary>
-		/// Gets a value indicating whether the collection has a fixed size.
-		/// </summary>
-		/// <value>true if the collection has a fixed size; otherwise, false. The default is false</value>
-		public virtual bool IsFixedSize
-		{
-			get { return false; }
-		}
+    /// <summary>
+    /// Adds the elements of a <see cref="IAppender"/> collection to the current <c>AppenderCollection</c>.
+    /// </summary>
+    /// <param name="col">The <see cref="IAppender"/> collection whose elements should be added to the end of the <c>AppenderCollection</c>.</param>
+    /// <returns>The new <see cref="AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
+    public virtual int AddRange(ICollection col)
+    {
+      if (m_count + col.Count >= m_array.Length)
+      {
+        EnsureCapacity(m_count + col.Count);
+      }
 
-		/// <summary>
-		/// Gets a value indicating whether the IList is read-only.
-		/// </summary>
-		/// <value>true if the collection is read-only; otherwise, false. The default is false</value>
-		public virtual bool IsReadOnly
-		{
-			get { return false; }
-		}
+      foreach (object item in col)
+      {
+        Add((IAppender)item);
+      }
 
-		#endregion
+      return m_count;
+    }
 
-		#region Operations (type-safe IEnumerable)
-		
-		/// <summary>
-		/// Returns an enumerator that can iterate through the <c>AppenderCollection</c>.
-		/// </summary>
-		/// <returns>An <see cref="Enumerator"/> for the entire <c>AppenderCollection</c>.</returns>
-		public virtual IAppenderCollectionEnumerator GetEnumerator()
-		{
-			return new Enumerator(this);
-		}
+    /// <summary>
+    /// Sets the capacity to the actual number of elements.
+    /// </summary>
+    public virtual void TrimToSize()
+    {
+      this.Capacity = m_count;
+    }
 
-		#endregion
+    /// <summary>
+    /// Return the collection elements as an array
+    /// </summary>
+    /// <returns>the array</returns>
+    public virtual IAppender[] ToArray()
+    {
+      IAppender[] resultArray = new IAppender[m_count];
+      if (m_count > 0)
+      {
+        Array.Copy(m_array, 0, resultArray, 0, m_count);
+      }
+      return resultArray;
+    }
 
-		#region Public helpers (just to mimic some nice features of ArrayList)
-		
-		/// <summary>
-		/// Gets or sets the number of elements the <c>AppenderCollection</c> can contain.
-		/// </summary>
-		public virtual int Capacity
-		{
-			get 
-			{ 
-				return m_array.Length; 
-			}
-			set
-			{
-				if (value < m_count)
-				{
-					value = m_count;
-				}
+    #endregion
 
-				if (value != m_array.Length)
-				{
-					if (value > 0)
-					{
-						IAppender[] temp = new IAppender[value];
-						Array.Copy(m_array, 0, temp, 0, m_count);
-						m_array = temp;
-					}
-					else
-					{
-						m_array = new IAppender[DEFAULT_CAPACITY];
-					}
-				}
-			}
-		}
+    #region Implementation (helpers)
 
-		/// <summary>
-		/// Adds the elements of another <c>AppenderCollection</c> to the current <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="x">The <c>AppenderCollection</c> whose elements should be added to the end of the current <c>AppenderCollection</c>.</param>
-		/// <returns>The new <see cref="AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
-		public virtual int AddRange(AppenderCollection x)
-		{
-			if (m_count + x.Count >= m_array.Length)
-			{
-				EnsureCapacity(m_count + x.Count);
-			}
-			
-			Array.Copy(x.m_array, 0, m_array, m_count, x.Count);
-			m_count += x.Count;
-			m_version++;
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="i"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="i"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
+    /// </exception>
+    private void ValidateIndex(int i)
+    {
+      ValidateIndex(i, false);
+    }
 
-			return m_count;
-		}
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="i"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="i"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
+    /// </exception>
+    private void ValidateIndex(int i, bool allowEqualEnd)
+    {
+      int max = (allowEqualEnd) ? (m_count) : (m_count - 1);
+      if (i < 0 || i > max)
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("i", (object)i, "Index was out of range. Must be non-negative and less than the size of the collection. [" + (object)i + "] Specified argument was out of the range of valid values.");
+      }
+    }
 
-		/// <summary>
-		/// Adds the elements of a <see cref="IAppender"/> array to the current <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="x">The <see cref="IAppender"/> array whose elements should be added to the end of the <c>AppenderCollection</c>.</param>
-		/// <returns>The new <see cref="AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
-		public virtual int AddRange(IAppender[] x)
-		{
-			if (m_count + x.Length >= m_array.Length)
-			{
-				EnsureCapacity(m_count + x.Length);
-			}
+    private void EnsureCapacity(int min)
+    {
+      int newCapacity = ((m_array.Length == 0) ? DEFAULT_CAPACITY : m_array.Length * 2);
+      if (newCapacity < min)
+      {
+        newCapacity = min;
+      }
 
-			Array.Copy(x, 0, m_array, m_count, x.Length);
-			m_count += x.Length;
-			m_version++;
+      this.Capacity = newCapacity;
+    }
 
-			return m_count;
-		}
-		
-		/// <summary>
-		/// Adds the elements of a <see cref="IAppender"/> collection to the current <c>AppenderCollection</c>.
-		/// </summary>
-		/// <param name="col">The <see cref="IAppender"/> collection whose elements should be added to the end of the <c>AppenderCollection</c>.</param>
-		/// <returns>The new <see cref="AppenderCollection.Count"/> of the <c>AppenderCollection</c>.</returns>
-		public virtual int AddRange(ICollection col)
-		{
-			if (m_count + col.Count >= m_array.Length)
-			{
-				EnsureCapacity(m_count + col.Count);
-			}
+    #endregion
 
-			foreach(object item in col)
-			{
-				Add((IAppender)item);
-			}
+    #region Implementation (ICollection)
 
-			return m_count;
-		}
+    void ICollection.CopyTo(Array array, int start)
+    {
+      if (m_count > 0)
+      {
+        Array.Copy(m_array, 0, array, start, m_count);
+      }
+    }
 
-		/// <summary>
-		/// Sets the capacity to the actual number of elements.
-		/// </summary>
-		public virtual void TrimToSize()
-		{
-			this.Capacity = m_count;
-		}
+    #endregion
 
-		/// <summary>
-		/// Return the collection elements as an array
-		/// </summary>
-		/// <returns>the array</returns>
-		public virtual IAppender[] ToArray()
-		{
-			IAppender[] resultArray = new IAppender[m_count];
-			if (m_count > 0)
-			{
-				Array.Copy(m_array, 0, resultArray, 0, m_count);
-			}
-			return resultArray;
-		}
+    #region Implementation (IList)
 
-		#endregion
+    object IList.this[int i]
+    {
+      get { return (object)this[i]; }
+      set { this[i] = (IAppender)value; }
+    }
 
-		#region Implementation (helpers)
+    int IList.Add(object x)
+    {
+      return this.Add((IAppender)x);
+    }
 
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="i"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="i"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
-		/// </exception>
-		private void ValidateIndex(int i)
-		{
-			ValidateIndex(i, false);
-		}
+    bool IList.Contains(object x)
+    {
+      return this.Contains((IAppender)x);
+    }
 
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="i"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="i"/> is equal to or greater than <see cref="AppenderCollection.Count"/>.</para>
-		/// </exception>
-		private void ValidateIndex(int i, bool allowEqualEnd)
-		{
-			int max = (allowEqualEnd) ? (m_count) : (m_count-1);
-			if (i < 0 || i > max)
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("i", (object)i, "Index was out of range. Must be non-negative and less than the size of the collection. [" + (object)i + "] Specified argument was out of the range of valid values.");
-			}
-		}
+    int IList.IndexOf(object x)
+    {
+      return this.IndexOf((IAppender)x);
+    }
 
-		private void EnsureCapacity(int min)
-		{
-			int newCapacity = ((m_array.Length == 0) ? DEFAULT_CAPACITY : m_array.Length * 2);
-			if (newCapacity < min)
-			{
-				newCapacity = min;
-			}
+    void IList.Insert(int pos, object x)
+    {
+      this.Insert(pos, (IAppender)x);
+    }
 
-			this.Capacity = newCapacity;
-		}
+    void IList.Remove(object x)
+    {
+      this.Remove((IAppender)x);
+    }
 
-		#endregion
-		
-		#region Implementation (ICollection)
+    void IList.RemoveAt(int pos)
+    {
+      this.RemoveAt(pos);
+    }
 
-		void ICollection.CopyTo(Array array, int start)
-		{
-			if (m_count > 0)
-			{
-				Array.Copy(m_array, 0, array, start, m_count);
-			}
-		}
+    #endregion
 
-		#endregion
+    #region Implementation (IEnumerable)
 
-		#region Implementation (IList)
+    IEnumerator IEnumerable.GetEnumerator()
+    {
+      return (IEnumerator)(this.GetEnumerator());
+    }
 
-		object IList.this[int i]
-		{
-			get { return (object)this[i]; }
-			set { this[i] = (IAppender)value; }
-		}
+    #endregion
 
-		int IList.Add(object x)
-		{
-			return this.Add((IAppender)x);
-		}
+    #region Nested enumerator class
 
-		bool IList.Contains(object x)
-		{
-			return this.Contains((IAppender)x);
-		}
+    /// <summary>
+    /// Supports simple iteration over a <see cref="AppenderCollection"/>.
+    /// </summary>
+    /// <exclude/>
+    private sealed class Enumerator : IEnumerator, IAppenderCollectionEnumerator
+    {
+      #region Implementation (data)
 
-		int IList.IndexOf(object x)
-		{
-			return this.IndexOf((IAppender)x);
-		}
+      private readonly AppenderCollection m_collection;
+      private int m_index;
+      private int m_version;
 
-		void IList.Insert(int pos, object x)
-		{
-			this.Insert(pos, (IAppender)x);
-		}
+      #endregion
 
-		void IList.Remove(object x)
-		{
-			this.Remove((IAppender)x);
-		}
+      #region Construction
 
-		void IList.RemoveAt(int pos)
-		{
-			this.RemoveAt(pos);
-		}
+      /// <summary>
+      /// Initializes a new instance of the <c>Enumerator</c> class.
+      /// </summary>
+      /// <param name="tc"></param>
+      internal Enumerator(AppenderCollection tc)
+      {
+        m_collection = tc;
+        m_index = -1;
+        m_version = tc.m_version;
+      }
 
-		#endregion
+      #endregion
 
-		#region Implementation (IEnumerable)
+      #region Operations (type-safe IEnumerator)
 
-		IEnumerator IEnumerable.GetEnumerator()
-		{
-			return (IEnumerator)(this.GetEnumerator());
-		}
+      /// <summary>
+      /// Gets the current element in the collection.
+      /// </summary>
+      public IAppender Current
+      {
+        get { return m_collection[m_index]; }
+      }
 
-		#endregion
+      /// <summary>
+      /// Advances the enumerator to the next element in the collection.
+      /// </summary>
+      /// <returns>
+      /// <c>true</c> if the enumerator was successfully advanced to the next element; 
+      /// <c>false</c> if the enumerator has passed the end of the collection.
+      /// </returns>
+      /// <exception cref="InvalidOperationException">
+      /// The collection was modified after the enumerator was created.
+      /// </exception>
+      public bool MoveNext()
+      {
+        if (m_version != m_collection.m_version)
+        {
+          throw new System.InvalidOperationException("Collection was modified; enumeration operation may not execute.");
+        }
 
-		#region Nested enumerator class
+        ++m_index;
+        return (m_index < m_collection.Count);
+      }
 
-		/// <summary>
-		/// Supports simple iteration over a <see cref="AppenderCollection"/>.
-		/// </summary>
-		/// <exclude/>
-		private sealed class Enumerator : IEnumerator, IAppenderCollectionEnumerator
-		{
-			#region Implementation (data)
-			
-			private readonly AppenderCollection m_collection;
-			private int m_index;
-			private int m_version;
-			
-			#endregion
-		
-			#region Construction
-			
-			/// <summary>
-			/// Initializes a new instance of the <c>Enumerator</c> class.
-			/// </summary>
-			/// <param name="tc"></param>
-			internal Enumerator(AppenderCollection tc)
-			{
-				m_collection = tc;
-				m_index = -1;
-				m_version = tc.m_version;
-			}
-			
-			#endregion
-	
-			#region Operations (type-safe IEnumerator)
-			
-			/// <summary>
-			/// Gets the current element in the collection.
-			/// </summary>
-			public IAppender Current
-			{
-				get { return m_collection[m_index]; }
-			}
+      /// <summary>
+      /// Sets the enumerator to its initial position, before the first element in the collection.
+      /// </summary>
+      public void Reset()
+      {
+        m_index = -1;
+      }
+      #endregion
 
-			/// <summary>
-			/// Advances the enumerator to the next element in the collection.
-			/// </summary>
-			/// <returns>
-			/// <c>true</c> if the enumerator was successfully advanced to the next element; 
-			/// <c>false</c> if the enumerator has passed the end of the collection.
-			/// </returns>
-			/// <exception cref="InvalidOperationException">
-			/// The collection was modified after the enumerator was created.
-			/// </exception>
-			public bool MoveNext()
-			{
-				if (m_version != m_collection.m_version)
-				{
-					throw new System.InvalidOperationException("Collection was modified; enumeration operation may not execute.");
-				}
+      #region Implementation (IEnumerator)
 
-				++m_index;
-				return (m_index < m_collection.Count);
-			}
+      object IEnumerator.Current
+      {
+        get { return this.Current; }
+      }
 
-			/// <summary>
-			/// Sets the enumerator to its initial position, before the first element in the collection.
-			/// </summary>
-			public void Reset()
-			{
-				m_index = -1;
-			}
-			#endregion
-	
-			#region Implementation (IEnumerator)
-			
-			object IEnumerator.Current
-			{
-				get { return this.Current; }
-			}
-			
-			#endregion
-		}
+      #endregion
+    }
 
-		#endregion
+    #endregion
 
-		#region Nested Read Only Wrapper class
+    #region Nested Read Only Wrapper class
 
-		/// <exclude/>
-		private sealed class ReadOnlyAppenderCollection : AppenderCollection, ICollection
-		{
-			#region Implementation (data)
+    /// <exclude/>
+    private sealed class ReadOnlyAppenderCollection : AppenderCollection, ICollection
+    {
+      #region Implementation (data)
 
-			private readonly AppenderCollection m_collection;
+      private readonly AppenderCollection m_collection;
 
-			#endregion
+      #endregion
 
-			#region Construction
+      #region Construction
 
-			internal ReadOnlyAppenderCollection(AppenderCollection list) : base(Tag.Default)
-			{
-				m_collection = list;
-			}
+      internal ReadOnlyAppenderCollection(AppenderCollection list) : base(Tag.Default)
+      {
+        m_collection = list;
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe ICollection
+      #region Type-safe ICollection
 
-			public override void CopyTo(IAppender[] array)
-			{
-				m_collection.CopyTo(array);
-			}
+      public override void CopyTo(IAppender[] array)
+      {
+        m_collection.CopyTo(array);
+      }
 
-			public override void CopyTo(IAppender[] array, int start)
-			{
-				m_collection.CopyTo(array,start);
-			}
+      public override void CopyTo(IAppender[] array, int start)
+      {
+        m_collection.CopyTo(array, start);
+      }
 
-			void ICollection.CopyTo(Array array, int start)
-			{
-				((ICollection)m_collection).CopyTo(array, start);
-			}
+      void ICollection.CopyTo(Array array, int start)
+      {
+        ((ICollection)m_collection).CopyTo(array, start);
+      }
 
-			public override int Count
-			{
-				get { return m_collection.Count; }
-			}
+      public override int Count
+      {
+        get { return m_collection.Count; }
+      }
 
-			public override bool IsSynchronized
-			{
-				get { return m_collection.IsSynchronized; }
-			}
+      public override bool IsSynchronized
+      {
+        get { return m_collection.IsSynchronized; }
+      }
 
-			public override object SyncRoot
-			{
-				get { return this.m_collection.SyncRoot; }
-			}
+      public override object SyncRoot
+      {
+        get { return this.m_collection.SyncRoot; }
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe IList
+      #region Type-safe IList
 
-			public override IAppender this[int i]
-			{
-				get { return m_collection[i]; }
-				set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
-			}
+      public override IAppender this[int i]
+      {
+        get { return m_collection[i]; }
+        set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
+      }
 
-			public override int Add(IAppender x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int Add(IAppender x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void Clear()
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Clear()
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override bool Contains(IAppender x)
-			{
-				return m_collection.Contains(x);
-			}
+      public override bool Contains(IAppender x)
+      {
+        return m_collection.Contains(x);
+      }
 
-			public override int IndexOf(IAppender x)
-			{
-				return m_collection.IndexOf(x);
-			}
+      public override int IndexOf(IAppender x)
+      {
+        return m_collection.IndexOf(x);
+      }
 
-			public override void Insert(int pos, IAppender x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Insert(int pos, IAppender x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void Remove(IAppender x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Remove(IAppender x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void RemoveAt(int pos)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void RemoveAt(int pos)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override bool IsFixedSize
-			{
-				get { return true; }
-			}
+      public override bool IsFixedSize
+      {
+        get { return true; }
+      }
 
-			public override bool IsReadOnly
-			{
-				get { return true; }
-			}
+      public override bool IsReadOnly
+      {
+        get { return true; }
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe IEnumerable
+      #region Type-safe IEnumerable
 
-			public override IAppenderCollectionEnumerator GetEnumerator()
-			{
-				return m_collection.GetEnumerator();
-			}
+      public override IAppenderCollectionEnumerator GetEnumerator()
+      {
+        return m_collection.GetEnumerator();
+      }
 
-			#endregion
+      #endregion
 
-			#region Public Helpers
+      #region Public Helpers
 
-			// (just to mimic some nice features of ArrayList)
-			public override int Capacity
-			{
-				get { return m_collection.Capacity; }
-				set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
-			}
+      // (just to mimic some nice features of ArrayList)
+      public override int Capacity
+      {
+        get { return m_collection.Capacity; }
+        set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
+      }
 
-			public override int AddRange(AppenderCollection x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int AddRange(AppenderCollection x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override int AddRange(IAppender[] x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int AddRange(IAppender[] x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override IAppender[] ToArray()
-			{
-				return m_collection.ToArray();
-			}
+      public override IAppender[] ToArray()
+      {
+        return m_collection.ToArray();
+      }
 
-			public override void TrimToSize()
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void TrimToSize()
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			#endregion
-		}
+      #endregion
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 
 }
diff --git a/src/log4net/Appender/AppenderSkeleton.cs b/src/log4net/Appender/AppenderSkeleton.cs
index 44b68c7..29354c9 100644
--- a/src/log4net/Appender/AppenderSkeleton.cs
+++ b/src/log4net/Appender/AppenderSkeleton.cs
@@ -28,882 +28,882 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Abstract base class implementation of <see cref="IAppender"/>. 
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class provides the code for common functionality, such 
-	/// as support for threshold filtering and support for general filters.
-	/// </para>
-	/// <para>
-	/// Appenders can also implement the <see cref="IOptionHandler"/> interface. Therefore
-	/// they would require that the <see cref="M:IOptionHandler.ActivateOptions()"/> method
-	/// be called after the appenders properties have been configured.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class AppenderSkeleton : IAppender, IBulkAppender, IOptionHandler, IFlushable
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Abstract base class implementation of <see cref="IAppender"/>. 
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class provides the code for common functionality, such 
+  /// as support for threshold filtering and support for general filters.
+  /// </para>
+  /// <para>
+  /// Appenders can also implement the <see cref="IOptionHandler"/> interface. Therefore
+  /// they would require that the <see cref="M:IOptionHandler.ActivateOptions()"/> method
+  /// be called after the appenders properties have been configured.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class AppenderSkeleton : IAppender, IBulkAppender, IOptionHandler, IFlushable
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>Empty default constructor</para>
-		/// </remarks>
-		protected AppenderSkeleton()
-		{
-			m_errorHandler = new OnlyOnceErrorHandler(this.GetType().Name);
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>Empty default constructor</para>
+    /// </remarks>
+    protected AppenderSkeleton()
+    {
+      m_errorHandler = new OnlyOnceErrorHandler(this.GetType().Name);
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Finalizer
+    #region Finalizer
 
-		/// <summary>
-		/// Finalizes this appender by calling the implementation's 
-		/// <see cref="Close"/> method.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// If this appender has not been closed then the <c>Finalize</c> method
-		/// will call <see cref="Close"/>.
-		/// </para>
-		/// </remarks>
-		~AppenderSkeleton() 
-		{
-			// An appender might be closed then garbage collected. 
-			// There is no point in closing twice.
-			if (!m_closed) 
-			{
-				LogLog.Debug(declaringType, "Finalizing appender named ["+m_name+"].");
-				Close();
-			}
-		}
+    /// <summary>
+    /// Finalizes this appender by calling the implementation's 
+    /// <see cref="Close"/> method.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// If this appender has not been closed then the <c>Finalize</c> method
+    /// will call <see cref="Close"/>.
+    /// </para>
+    /// </remarks>
+    ~AppenderSkeleton()
+    {
+      // An appender might be closed then garbage collected. 
+      // There is no point in closing twice.
+      if (!m_closed)
+      {
+        LogLog.Debug(declaringType, "Finalizing appender named [" + m_name + "].");
+        Close();
+      }
+    }
 
-		#endregion Finalizer
+    #endregion Finalizer
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the threshold <see cref="Level"/> of this appender.
-		/// </summary>
-		/// <value>
-		/// The threshold <see cref="Level"/> of the appender. 
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// All log events with lower level than the threshold level are ignored 
-		/// by the appender.
-		/// </para>
-		/// <para>
-		/// In configuration files this option is specified by setting the
-		/// value of the <see cref="Threshold"/> option to a level
-		/// string, such as "DEBUG", "INFO" and so on.
-		/// </para>
-		/// </remarks>
-		public Level Threshold 
-		{
-			get { return m_threshold; }
-			set { m_threshold = value; }
-		}
+    /// <summary>
+    /// Gets or sets the threshold <see cref="Level"/> of this appender.
+    /// </summary>
+    /// <value>
+    /// The threshold <see cref="Level"/> of the appender. 
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// All log events with lower level than the threshold level are ignored 
+    /// by the appender.
+    /// </para>
+    /// <para>
+    /// In configuration files this option is specified by setting the
+    /// value of the <see cref="Threshold"/> option to a level
+    /// string, such as "DEBUG", "INFO" and so on.
+    /// </para>
+    /// </remarks>
+    public Level Threshold
+    {
+      get { return m_threshold; }
+      set { m_threshold = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="IErrorHandler"/> for this appender.
-		/// </summary>
-		/// <value>The <see cref="IErrorHandler"/> of the appender</value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AppenderSkeleton"/> provides a default 
-		/// implementation for the <see cref="ErrorHandler"/> property. 
-		/// </para>
-		/// </remarks>
-		public virtual IErrorHandler ErrorHandler 
-		{
-			get { return this.m_errorHandler; }
-			set 
-			{
-				lock(this) 
-				{
-					if (value == null) 
-					{
-						// We do not throw exception here since the cause is probably a
-						// bad config file.
-						LogLog.Warn(declaringType, "You have tried to set a null error-handler.");
-					} 
-					else 
-					{
-						m_errorHandler = value;
-					}
-				}
-			}
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="IErrorHandler"/> for this appender.
+    /// </summary>
+    /// <value>The <see cref="IErrorHandler"/> of the appender</value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AppenderSkeleton"/> provides a default 
+    /// implementation for the <see cref="ErrorHandler"/> property. 
+    /// </para>
+    /// </remarks>
+    public virtual IErrorHandler ErrorHandler
+    {
+      get { return this.m_errorHandler; }
+      set
+      {
+        lock (this)
+        {
+          if (value == null)
+          {
+            // We do not throw exception here since the cause is probably a
+            // bad config file.
+            LogLog.Warn(declaringType, "You have tried to set a null error-handler.");
+          }
+          else
+          {
+            m_errorHandler = value;
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// The filter chain.
-		/// </summary>
-		/// <value>The head of the filter chain filter chain.</value>
-		/// <remarks>
-		/// <para>
-		/// Returns the head Filter. The Filters are organized in a linked list
-		/// and so all Filters on this Appender are available through the result.
-		/// </para>
-		/// </remarks>
-		public virtual IFilter FilterHead
-		{
-			get { return m_headFilter; }
-		}
+    /// <summary>
+    /// The filter chain.
+    /// </summary>
+    /// <value>The head of the filter chain filter chain.</value>
+    /// <remarks>
+    /// <para>
+    /// Returns the head Filter. The Filters are organized in a linked list
+    /// and so all Filters on this Appender are available through the result.
+    /// </para>
+    /// </remarks>
+    public virtual IFilter FilterHead
+    {
+      get { return m_headFilter; }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="ILayout"/> for this appender.
-		/// </summary>
-		/// <value>The layout of the appender.</value>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="RequiresLayout"/> for more information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="RequiresLayout"/>
-		public virtual ILayout Layout 
-		{
-			get { return m_layout; }
-			set { m_layout = value; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="ILayout"/> for this appender.
+    /// </summary>
+    /// <value>The layout of the appender.</value>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="RequiresLayout"/> for more information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="RequiresLayout"/>
+    public virtual ILayout Layout
+    {
+      get { return m_layout; }
+      set { m_layout = value; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the appender based on the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public virtual void ActivateOptions() 
-		{
-		}
+    /// <summary>
+    /// Initialize the appender based on the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public virtual void ActivateOptions()
+    {
+    }
 
-		#endregion Implementation of IOptionHandler
+    #endregion Implementation of IOptionHandler
 
-		#region Implementation of IAppender
+    #region Implementation of IAppender
 
-		/// <summary>
-		/// Gets or sets the name of this appender.
-		/// </summary>
-		/// <value>The name of the appender.</value>
-		/// <remarks>
-		/// <para>
-		/// The name uniquely identifies the appender.
-		/// </para>
-		/// </remarks>
-		public string Name 
-		{
-			get { return m_name; }
-			set { m_name = value; }
-		}
+    /// <summary>
+    /// Gets or sets the name of this appender.
+    /// </summary>
+    /// <value>The name of the appender.</value>
+    /// <remarks>
+    /// <para>
+    /// The name uniquely identifies the appender.
+    /// </para>
+    /// </remarks>
+    public string Name
+    {
+      get { return m_name; }
+      set { m_name = value; }
+    }
 
-		/// <summary>
-		/// Closes the appender and release resources.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Release any resources allocated within the appender such as file handles, 
-		/// network connections, etc.
-		/// </para>
-		/// <para>
-		/// It is a programming error to append to a closed appender.
-		/// </para>
-		/// <para>
-		/// This method cannot be overridden by subclasses. This method 
-		/// delegates the closing of the appender to the <see cref="OnClose"/>
-		/// method which must be overridden in the subclass.
-		/// </para>
-		/// </remarks>
-		public void Close()
-		{
-			// This lock prevents the appender being closed while it is still appending
-			lock(this)
-			{
-				if (!m_closed)
-				{
-					OnClose();
-					m_closed = true;
-				}
-			}
-		}
+    /// <summary>
+    /// Closes the appender and release resources.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Release any resources allocated within the appender such as file handles, 
+    /// network connections, etc.
+    /// </para>
+    /// <para>
+    /// It is a programming error to append to a closed appender.
+    /// </para>
+    /// <para>
+    /// This method cannot be overridden by subclasses. This method 
+    /// delegates the closing of the appender to the <see cref="OnClose"/>
+    /// method which must be overridden in the subclass.
+    /// </para>
+    /// </remarks>
+    public void Close()
+    {
+      // This lock prevents the appender being closed while it is still appending
+      lock (this)
+      {
+        if (!m_closed)
+        {
+          OnClose();
+          m_closed = true;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Performs threshold checks and invokes filters before 
-		/// delegating actual logging to the subclasses specific 
-		/// <see cref="M:Append(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method cannot be overridden by derived classes. A
-		/// derived class should override the <see cref="M:Append(LoggingEvent)"/> method
-		/// which is called by this method.
-		/// </para>
-		/// <para>
-		/// The implementation of this method is as follows:
-		/// </para>
-		/// <para>
-		/// <list type="bullet">
-		///		<item>
-		///			<description>
-		///			Checks that the severity of the <paramref name="loggingEvent"/>
-		///			is greater than or equal to the <see cref="Threshold"/> of this
-		///			appender.</description>
-		///		</item>
-		///		<item>
-		///			<description>
-		///			Checks that the <see cref="IFilter"/> chain accepts the 
-		///			<paramref name="loggingEvent"/>.
-		///			</description>
-		///		</item>
-		///		<item>
-		///			<description>
-		///			Calls <see cref="M:PreAppendCheck()"/> and checks that 
-		///			it returns <c>true</c>.</description>
-		///		</item>
-		/// </list>
-		/// </para>
-		/// <para>
-		/// If all of the above steps succeed then the <paramref name="loggingEvent"/>
-		/// will be passed to the abstract <see cref="M:Append(LoggingEvent)"/> method.
-		/// </para>
-		/// </remarks>
-		public void DoAppend(LoggingEvent loggingEvent) 
-		{
-			// This lock is absolutely critical for correct formatting
-			// of the message in a multi-threaded environment.  Without
-			// this, the message may be broken up into elements from
-			// multiple thread contexts (like get the wrong thread ID).
+    /// <summary>
+    /// Performs threshold checks and invokes filters before 
+    /// delegating actual logging to the subclasses specific 
+    /// <see cref="M:Append(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method cannot be overridden by derived classes. A
+    /// derived class should override the <see cref="M:Append(LoggingEvent)"/> method
+    /// which is called by this method.
+    /// </para>
+    /// <para>
+    /// The implementation of this method is as follows:
+    /// </para>
+    /// <para>
+    /// <list type="bullet">
+    ///    <item>
+    ///      <description>
+    ///      Checks that the severity of the <paramref name="loggingEvent"/>
+    ///      is greater than or equal to the <see cref="Threshold"/> of this
+    ///      appender.</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>
+    ///      Checks that the <see cref="IFilter"/> chain accepts the 
+    ///      <paramref name="loggingEvent"/>.
+    ///      </description>
+    ///    </item>
+    ///    <item>
+    ///      <description>
+    ///      Calls <see cref="M:PreAppendCheck()"/> and checks that 
+    ///      it returns <c>true</c>.</description>
+    ///    </item>
+    /// </list>
+    /// </para>
+    /// <para>
+    /// If all of the above steps succeed then the <paramref name="loggingEvent"/>
+    /// will be passed to the abstract <see cref="M:Append(LoggingEvent)"/> method.
+    /// </para>
+    /// </remarks>
+    public void DoAppend(LoggingEvent loggingEvent)
+    {
+      // This lock is absolutely critical for correct formatting
+      // of the message in a multi-threaded environment.  Without
+      // this, the message may be broken up into elements from
+      // multiple thread contexts (like get the wrong thread ID).
 
-			lock(this)
-			{
-				if (m_closed)
-				{
-					ErrorHandler.Error("Attempted to append to closed appender named ["+m_name+"].");
-					return;
-				}
+      lock (this)
+      {
+        if (m_closed)
+        {
+          ErrorHandler.Error("Attempted to append to closed appender named [" + m_name + "].");
+          return;
+        }
 
-				// prevent re-entry
-				if (m_recursiveGuard)
-				{
-					return;
-				}
+        // prevent re-entry
+        if (m_recursiveGuard)
+        {
+          return;
+        }
 
-				try
-				{
-					m_recursiveGuard = true;
+        try
+        {
+          m_recursiveGuard = true;
 
-					if (FilterEvent(loggingEvent) && PreAppendCheck())
-					{
-						this.Append(loggingEvent);
-					}
-				}
-				catch(Exception ex)
-				{
-					ErrorHandler.Error("Failed in DoAppend", ex);
-				}
+          if (FilterEvent(loggingEvent) && PreAppendCheck())
+          {
+            this.Append(loggingEvent);
+          }
+        }
+        catch (Exception ex)
+        {
+          ErrorHandler.Error("Failed in DoAppend", ex);
+        }
 #if !MONO && !NET_2_0 && !NETSTANDARD
-				// on .NET 2.0 (and higher) and Mono (all profiles), 
-				// exceptions that do not derive from System.Exception will be
-				// wrapped in a RuntimeWrappedException by the runtime, and as
-				// such will be catched by the catch clause above
-				catch
-				{
-					// Catch handler for non System.Exception types
-					ErrorHandler.Error("Failed in DoAppend (unknown exception)");
-				}
+        // on .NET 2.0 (and higher) and Mono (all profiles), 
+        // exceptions that do not derive from System.Exception will be
+        // wrapped in a RuntimeWrappedException by the runtime, and as
+        // such will be catched by the catch clause above
+        catch
+        {
+          // Catch handler for non System.Exception types
+          ErrorHandler.Error("Failed in DoAppend (unknown exception)");
+        }
 #endif
-				finally
-				{
-					m_recursiveGuard = false;
-				}
-			}
-		}
+        finally
+        {
+          m_recursiveGuard = false;
+        }
+      }
+    }
 
-		#endregion Implementation of IAppender
+    #endregion Implementation of IAppender
 
-		#region Implementation of IBulkAppender
+    #region Implementation of IBulkAppender
 
-		/// <summary>
-		/// Performs threshold checks and invokes filters before 
-		/// delegating actual logging to the subclasses specific 
-		/// <see cref="M:Append(LoggingEvent[])"/> method.
-		/// </summary>
-		/// <param name="loggingEvents">The array of events to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method cannot be overridden by derived classes. A
-		/// derived class should override the <see cref="M:Append(LoggingEvent[])"/> method
-		/// which is called by this method.
-		/// </para>
-		/// <para>
-		/// The implementation of this method is as follows:
-		/// </para>
-		/// <para>
-		/// <list type="bullet">
-		///		<item>
-		///			<description>
-		///			Checks that the severity of the <paramref name="loggingEvents"/>
-		///			is greater than or equal to the <see cref="Threshold"/> of this
-		///			appender.</description>
-		///		</item>
-		///		<item>
-		///			<description>
-		///			Checks that the <see cref="IFilter"/> chain accepts the 
-		///			<paramref name="loggingEvents"/>.
-		///			</description>
-		///		</item>
-		///		<item>
-		///			<description>
-		///			Calls <see cref="M:PreAppendCheck()"/> and checks that 
-		///			it returns <c>true</c>.</description>
-		///		</item>
-		/// </list>
-		/// </para>
-		/// <para>
-		/// If all of the above steps succeed then the <paramref name="loggingEvents"/>
-		/// will be passed to the <see cref="M:Append(LoggingEvent[])"/> method.
-		/// </para>
-		/// </remarks>
-		public void DoAppend(LoggingEvent[] loggingEvents) 
-		{
-			// This lock is absolutely critical for correct formatting
-			// of the message in a multi-threaded environment.  Without
-			// this, the message may be broken up into elements from
-			// multiple thread contexts (like get the wrong thread ID).
+    /// <summary>
+    /// Performs threshold checks and invokes filters before 
+    /// delegating actual logging to the subclasses specific 
+    /// <see cref="M:Append(LoggingEvent[])"/> method.
+    /// </summary>
+    /// <param name="loggingEvents">The array of events to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method cannot be overridden by derived classes. A
+    /// derived class should override the <see cref="M:Append(LoggingEvent[])"/> method
+    /// which is called by this method.
+    /// </para>
+    /// <para>
+    /// The implementation of this method is as follows:
+    /// </para>
+    /// <para>
+    /// <list type="bullet">
+    ///    <item>
+    ///      <description>
+    ///      Checks that the severity of the <paramref name="loggingEvents"/>
+    ///      is greater than or equal to the <see cref="Threshold"/> of this
+    ///      appender.</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>
+    ///      Checks that the <see cref="IFilter"/> chain accepts the 
+    ///      <paramref name="loggingEvents"/>.
+    ///      </description>
+    ///    </item>
+    ///    <item>
+    ///      <description>
+    ///      Calls <see cref="M:PreAppendCheck()"/> and checks that 
+    ///      it returns <c>true</c>.</description>
+    ///    </item>
+    /// </list>
+    /// </para>
+    /// <para>
+    /// If all of the above steps succeed then the <paramref name="loggingEvents"/>
+    /// will be passed to the <see cref="M:Append(LoggingEvent[])"/> method.
+    /// </para>
+    /// </remarks>
+    public void DoAppend(LoggingEvent[] loggingEvents)
+    {
+      // This lock is absolutely critical for correct formatting
+      // of the message in a multi-threaded environment.  Without
+      // this, the message may be broken up into elements from
+      // multiple thread contexts (like get the wrong thread ID).
 
-			lock(this)
-			{
-				if (m_closed)
-				{
-					ErrorHandler.Error("Attempted to append to closed appender named ["+m_name+"].");
-					return;
-				}
+      lock (this)
+      {
+        if (m_closed)
+        {
+          ErrorHandler.Error("Attempted to append to closed appender named [" + m_name + "].");
+          return;
+        }
 
-				// prevent re-entry
-				if (m_recursiveGuard)
-				{
-					return;
-				}
+        // prevent re-entry
+        if (m_recursiveGuard)
+        {
+          return;
+        }
 
-				try
-				{
-					m_recursiveGuard = true;
+        try
+        {
+          m_recursiveGuard = true;
 
-					ArrayList filteredEvents = new ArrayList(loggingEvents.Length);
+          ArrayList filteredEvents = new ArrayList(loggingEvents.Length);
 
-					foreach(LoggingEvent loggingEvent in loggingEvents)
-					{
-						if (FilterEvent(loggingEvent))
-						{
-							filteredEvents.Add(loggingEvent);
-						}
-					}
-
-					if (filteredEvents.Count > 0 && PreAppendCheck())
-					{
-						this.Append((LoggingEvent[])filteredEvents.ToArray(typeof(LoggingEvent)));
-					}
-				}
-				catch(Exception ex)
-				{
-					ErrorHandler.Error("Failed in Bulk DoAppend", ex);
-				}
-#if !MONO && !NET_2_0 && !NETSTANDARD
-				// on .NET 2.0 (and higher) and Mono (all profiles), 
-				// exceptions that do not derive from System.Exception will be
-				// wrapped in a RuntimeWrappedException by the runtime, and as
-				// such will be catched by the catch clause above
-				catch
-				{
-					// Catch handler for non System.Exception types
-					ErrorHandler.Error("Failed in Bulk DoAppend (unknown exception)");
-				}
-#endif
-				finally
-				{
-					m_recursiveGuard = false;
-				}
-			}
-		}
-
-		#endregion Implementation of IBulkAppender
-
-		/// <summary>
-		/// Test if the logging event should we output by this appender
-		/// </summary>
-		/// <param name="loggingEvent">the event to test</param>
-		/// <returns><c>true</c> if the event should be output, <c>false</c> if the event should be ignored</returns>
-		/// <remarks>
-		/// <para>
-		/// This method checks the logging event against the threshold level set
-		/// on this appender and also against the filters specified on this
-		/// appender.
-		/// </para>
-		/// <para>
-		/// The implementation of this method is as follows:
-		/// </para>
-		/// <para>
-		/// <list type="bullet">
-		///		<item>
-		///			<description>
-		///			Checks that the severity of the <paramref name="loggingEvent"/>
-		///			is greater than or equal to the <see cref="Threshold"/> of this
-		///			appender.</description>
-		///		</item>
-		///		<item>
-		///			<description>
-		///			Checks that the <see cref="IFilter"/> chain accepts the 
-		///			<paramref name="loggingEvent"/>.
-		///			</description>
-		///		</item>
-		/// </list>
-		/// </para>
-		/// </remarks>
-		protected virtual bool FilterEvent(LoggingEvent loggingEvent)
-		{
-			if (!IsAsSevereAsThreshold(loggingEvent.Level)) 
-			{
-				return false;
-			}
-
-			IFilter f = this.FilterHead;
-
-			while(f != null) 
-			{
-				switch(f.Decide(loggingEvent)) 
-				{
-					case FilterDecision.Deny: 
-						return false;	// Return without appending
-
-					case FilterDecision.Accept:
-						f = null;		// Break out of the loop
-						break;
-
-					case FilterDecision.Neutral:
-						f = f.Next;		// Move to next filter
-						break;
-				}
-			}
-
-			return true;
-		}
-
-		#region Public Instance Methods
-
-		/// <summary>
-		/// Adds a filter to the end of the filter chain.
-		/// </summary>
-		/// <param name="filter">the filter to add to this appender</param>
-		/// <remarks>
-		/// <para>
-		/// The Filters are organized in a linked list.
-		/// </para>
-		/// <para>
-		/// Setting this property causes the new filter to be pushed onto the 
-		/// back of the filter chain.
-		/// </para>
-		/// </remarks>
-		public virtual void AddFilter(IFilter filter)
-		{
-			if (filter == null)
-			{
-				throw new ArgumentNullException("filter param must not be null");
-			}
-
-			if (m_headFilter == null) 
-			{
-				m_headFilter = m_tailFilter = filter;
-			} 
-			else 
-			{
-				m_tailFilter.Next = filter;
-				m_tailFilter = filter;	
-			}
-		}
-
-		/// <summary>
-		/// Clears the filter list for this appender.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clears the filter list for this appender.
-		/// </para>
-		/// </remarks>
-		public virtual void ClearFilters()
-		{
-			m_headFilter = m_tailFilter = null;
-		}
-
-		#endregion Public Instance Methods
-
-		#region Protected Instance Methods
-
-		/// <summary>
-		/// Checks if the message level is below this appender's threshold.
-		/// </summary>
-		/// <param name="level"><see cref="Level"/> to test against.</param>
-		/// <remarks>
-		/// <para>
-		/// If there is no threshold set, then the return value is always <c>true</c>.
-		/// </para>
-		/// </remarks>
-		/// <returns>
-		/// <c>true</c> if the <paramref name="level"/> meets the <see cref="Threshold"/> 
-		/// requirements of this appender.
-		/// </returns>
-		protected virtual bool IsAsSevereAsThreshold(Level level) 
-		{
-			return ((m_threshold == null) || level >= m_threshold);
-		}
-
-		/// <summary>
-		/// Is called when the appender is closed. Derived classes should override 
-		/// this method if resources need to be released.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Releases any resources allocated within the appender such as file handles, 
-		/// network connections, etc.
-		/// </para>
-		/// <para>
-		/// It is a programming error to append to a closed appender.
-		/// </para>
-		/// </remarks>
-		protected virtual void OnClose() 
-		{
-			// Do nothing by default
-		}
-
-		/// <summary>
-		/// Subclasses of <see cref="AppenderSkeleton"/> should implement this method 
-		/// to perform actual logging.
-		/// </summary>
-		/// <param name="loggingEvent">The event to append.</param>
-		/// <remarks>
-		/// <para>
-		/// A subclass must implement this method to perform
-		/// logging of the <paramref name="loggingEvent"/>.
-		/// </para>
-		/// <para>This method will be called by <see cref="M:DoAppend(LoggingEvent)"/>
-		/// if all the conditions listed for that method are met.
-		/// </para>
-		/// <para>
-		/// To restrict the logging of events in the appender
-		/// override the <see cref="M:PreAppendCheck()"/> method.
-		/// </para>
-		/// </remarks>
-		protected abstract void Append(LoggingEvent loggingEvent);
-
-		/// <summary>
-		/// Append a bulk array of logging events.
-		/// </summary>
-		/// <param name="loggingEvents">the array of logging events</param>
-		/// <remarks>
-		/// <para>
-		/// This base class implementation calls the <see cref="M:Append(LoggingEvent)"/>
-		/// method for each element in the bulk array.
-		/// </para>
-		/// <para>
-		/// A sub class that can better process a bulk array of events should
-		/// override this method in addition to <see cref="M:Append(LoggingEvent)"/>.
-		/// </para>
-		/// </remarks>
-		protected virtual void Append(LoggingEvent[] loggingEvents)
-		{
-			foreach(LoggingEvent loggingEvent in loggingEvents)
-			{
-				Append(loggingEvent);
-			}
-		}
-
-		/// <summary>
-		/// Called before <see cref="M:Append(LoggingEvent)"/> as a precondition.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method is called by <see cref="M:DoAppend(LoggingEvent)"/>
-		/// before the call to the abstract <see cref="M:Append(LoggingEvent)"/> method.
-		/// </para>
-		/// <para>
-		/// This method can be overridden in a subclass to extend the checks 
-		/// made before the event is passed to the <see cref="M:Append(LoggingEvent)"/> method.
-		/// </para>
-		/// <para>
-		/// A subclass should ensure that they delegate this call to
-		/// this base class if it is overridden.
-		/// </para>
-		/// </remarks>
-		/// <returns><c>true</c> if the call to <see cref="M:Append(LoggingEvent)"/> should proceed.</returns>
-		protected virtual bool PreAppendCheck()
-		{
-			if ((m_layout == null) && RequiresLayout)
-			{
-				ErrorHandler.Error("AppenderSkeleton: No layout set for the appender named ["+m_name+"].");
-				return false;
-			}
-
-			return true;
-		}
-
-		/// <summary>
-		/// Renders the <see cref="LoggingEvent"/> to a string.
-		/// </summary>
-		/// <param name="loggingEvent">The event to render.</param>
-		/// <returns>The event rendered as a string.</returns>
-		/// <remarks>
-		/// <para>
-		/// Helper method to render a <see cref="LoggingEvent"/> to 
-		/// a string. This appender must have a <see cref="Layout"/>
-		/// set to render the <paramref name="loggingEvent"/> to 
-		/// a string.
-		/// </para>
-		/// <para>If there is exception data in the logging event and 
-		/// the layout does not process the exception, this method 
-		/// will append the exception text to the rendered string.
-		/// </para>
-		/// <para>
-		/// Where possible use the alternative version of this method
-		/// <see cref="M:RenderLoggingEvent(TextWriter,LoggingEvent)"/>.
-		/// That method streams the rendering onto an existing Writer
-		/// which can give better performance if the caller already has
-		/// a <see cref="TextWriter"/> open and ready for writing.
-		/// </para>
-		/// </remarks>
-		protected string RenderLoggingEvent(LoggingEvent loggingEvent)
-		{
-			// Create the render writer on first use
-			if (m_renderWriter == null)
-			{
-				m_renderWriter = new ReusableStringWriter(System.Globalization.CultureInfo.InvariantCulture);
-			}
-
-            lock (m_renderWriter)
+          foreach (LoggingEvent loggingEvent in loggingEvents)
+          {
+            if (FilterEvent(loggingEvent))
             {
-                // Reset the writer so we can reuse it
-                m_renderWriter.Reset(c_renderBufferMaxCapacity, c_renderBufferSize);
-
-                RenderLoggingEvent(m_renderWriter, loggingEvent);
-                return m_renderWriter.ToString();
+              filteredEvents.Add(loggingEvent);
             }
-		}
+          }
 
-		/// <summary>
-		/// Renders the <see cref="LoggingEvent"/> to a string.
-		/// </summary>
-		/// <param name="loggingEvent">The event to render.</param>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <remarks>
-		/// <para>
-		/// Helper method to render a <see cref="LoggingEvent"/> to 
-		/// a string. This appender must have a <see cref="Layout"/>
-		/// set to render the <paramref name="loggingEvent"/> to 
-		/// a string.
-		/// </para>
-		/// <para>If there is exception data in the logging event and 
-		/// the layout does not process the exception, this method 
-		/// will append the exception text to the rendered string.
-		/// </para>
-		/// <para>
-		/// Use this method in preference to <see cref="M:RenderLoggingEvent(LoggingEvent)"/>
-		/// where possible. If, however, the caller needs to render the event
-		/// to a string then <see cref="M:RenderLoggingEvent(LoggingEvent)"/> does
-		/// provide an efficient mechanism for doing so.
-		/// </para>
-		/// </remarks>
-		protected void RenderLoggingEvent(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			if (m_layout == null) 
-			{
-				throw new InvalidOperationException("A layout must be set");
-			}
+          if (filteredEvents.Count > 0 && PreAppendCheck())
+          {
+            this.Append((LoggingEvent[])filteredEvents.ToArray(typeof(LoggingEvent)));
+          }
+        }
+        catch (Exception ex)
+        {
+          ErrorHandler.Error("Failed in Bulk DoAppend", ex);
+        }
+#if !MONO && !NET_2_0 && !NETSTANDARD
+        // on .NET 2.0 (and higher) and Mono (all profiles), 
+        // exceptions that do not derive from System.Exception will be
+        // wrapped in a RuntimeWrappedException by the runtime, and as
+        // such will be catched by the catch clause above
+        catch
+        {
+          // Catch handler for non System.Exception types
+          ErrorHandler.Error("Failed in Bulk DoAppend (unknown exception)");
+        }
+#endif
+        finally
+        {
+          m_recursiveGuard = false;
+        }
+      }
+    }
 
-			if (m_layout.IgnoresException) 
-			{
-				string exceptionStr = loggingEvent.GetExceptionString();
-				if (exceptionStr != null && exceptionStr.Length > 0) 
-				{
-					// render the event and the exception
-					m_layout.Format(writer, loggingEvent);
-					writer.WriteLine(exceptionStr);
-				}
-				else 
-				{
-					// there is no exception to render
-					m_layout.Format(writer, loggingEvent);
-				}
-			}
-			else 
-			{
-				// The layout will render the exception
-				m_layout.Format(writer, loggingEvent);
-			}
-		}
+    #endregion Implementation of IBulkAppender
 
-		/// <summary>
-		/// Tests if this appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// In the rather exceptional case, where the appender 
-		/// implementation admits a layout but can also work without it, 
-		/// then the appender should return <c>true</c>.
-		/// </para>
-		/// <para>
-		/// This default implementation always returns <c>false</c>.
-		/// </para>
-		/// </remarks>
-		/// <returns>
-		/// <c>true</c> if the appender requires a layout object, otherwise <c>false</c>.
-		/// </returns>
-		protected virtual bool RequiresLayout
-		{
-			get { return false; }
-		}
+    /// <summary>
+    /// Test if the logging event should we output by this appender
+    /// </summary>
+    /// <param name="loggingEvent">the event to test</param>
+    /// <returns><c>true</c> if the event should be output, <c>false</c> if the event should be ignored</returns>
+    /// <remarks>
+    /// <para>
+    /// This method checks the logging event against the threshold level set
+    /// on this appender and also against the filters specified on this
+    /// appender.
+    /// </para>
+    /// <para>
+    /// The implementation of this method is as follows:
+    /// </para>
+    /// <para>
+    /// <list type="bullet">
+    ///    <item>
+    ///      <description>
+    ///      Checks that the severity of the <paramref name="loggingEvent"/>
+    ///      is greater than or equal to the <see cref="Threshold"/> of this
+    ///      appender.</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>
+    ///      Checks that the <see cref="IFilter"/> chain accepts the 
+    ///      <paramref name="loggingEvent"/>.
+    ///      </description>
+    ///    </item>
+    /// </list>
+    /// </para>
+    /// </remarks>
+    protected virtual bool FilterEvent(LoggingEvent loggingEvent)
+    {
+      if (!IsAsSevereAsThreshold(loggingEvent.Level))
+      {
+        return false;
+      }
 
-		#endregion
+      IFilter f = this.FilterHead;
 
-		/// <summary>
-        	/// Flushes any buffered log data.
-        	/// </summary>
-		/// <remarks>
-		/// This implementation doesn't flush anything and always returns true
-		/// </remarks>
-        	/// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-        	public virtual bool Flush(int millisecondsTimeout)
-        	{
-		    return true;
-        	}
+      while (f != null)
+      {
+        switch (f.Decide(loggingEvent))
+        {
+          case FilterDecision.Deny:
+            return false;  // Return without appending
 
-		#region Private Instance Fields
+          case FilterDecision.Accept:
+            f = null;    // Break out of the loop
+            break;
 
-		/// <summary>
-		/// The layout of this appender.
-		/// </summary>
-		/// <remarks>
-		/// See <see cref="Layout"/> for more information.
-		/// </remarks>
-		private ILayout m_layout;
+          case FilterDecision.Neutral:
+            f = f.Next;    // Move to next filter
+            break;
+        }
+      }
 
-		/// <summary>
-		/// The name of this appender.
-		/// </summary>
-		/// <remarks>
-		/// See <see cref="Name"/> for more information.
-		/// </remarks>
-		private string m_name;
+      return true;
+    }
 
-		/// <summary>
-		/// The level threshold of this appender.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// There is no level threshold filtering by default.
-		/// </para>
-		/// <para>
-		/// See <see cref="Threshold"/> for more information.
-		/// </para>
-		/// </remarks>
-		private Level m_threshold;
+    #region Public Instance Methods
 
-		/// <summary>
-		/// It is assumed and enforced that errorHandler is never null.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// It is assumed and enforced that errorHandler is never null.
-		/// </para>
-		/// <para>
-		/// See <see cref="ErrorHandler"/> for more information.
-		/// </para>
-		/// </remarks>
-		private IErrorHandler m_errorHandler;
+    /// <summary>
+    /// Adds a filter to the end of the filter chain.
+    /// </summary>
+    /// <param name="filter">the filter to add to this appender</param>
+    /// <remarks>
+    /// <para>
+    /// The Filters are organized in a linked list.
+    /// </para>
+    /// <para>
+    /// Setting this property causes the new filter to be pushed onto the 
+    /// back of the filter chain.
+    /// </para>
+    /// </remarks>
+    public virtual void AddFilter(IFilter filter)
+    {
+      if (filter == null)
+      {
+        throw new ArgumentNullException("filter param must not be null");
+      }
 
-		/// <summary>
-		/// The first filter in the filter chain.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Set to <c>null</c> initially.
-		/// </para>
-		/// <para>
-		/// See <see cref="IFilter"/> for more information.
-		/// </para>
-		/// </remarks>
-		private IFilter m_headFilter;
+      if (m_headFilter == null)
+      {
+        m_headFilter = m_tailFilter = filter;
+      }
+      else
+      {
+        m_tailFilter.Next = filter;
+        m_tailFilter = filter;
+      }
+    }
 
-		/// <summary>
-		/// The last filter in the filter chain.
-		/// </summary>
-		/// <remarks>
-		/// See <see cref="IFilter"/> for more information.
-		/// </remarks>
-		private IFilter m_tailFilter;
+    /// <summary>
+    /// Clears the filter list for this appender.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clears the filter list for this appender.
+    /// </para>
+    /// </remarks>
+    public virtual void ClearFilters()
+    {
+      m_headFilter = m_tailFilter = null;
+    }
 
-		/// <summary>
-		/// Flag indicating if this appender is closed.
-		/// </summary>
-		/// <remarks>
-		/// See <see cref="Close"/> for more information.
-		/// </remarks>
-		private bool m_closed = false;
+    #endregion Public Instance Methods
 
-		/// <summary>
-		/// The guard prevents an appender from repeatedly calling its own DoAppend method
-		/// </summary>
-		private bool m_recursiveGuard = false;
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// StringWriter used to render events
-		/// </summary>
-		private ReusableStringWriter m_renderWriter = null;
+    /// <summary>
+    /// Checks if the message level is below this appender's threshold.
+    /// </summary>
+    /// <param name="level"><see cref="Level"/> to test against.</param>
+    /// <remarks>
+    /// <para>
+    /// If there is no threshold set, then the return value is always <c>true</c>.
+    /// </para>
+    /// </remarks>
+    /// <returns>
+    /// <c>true</c> if the <paramref name="level"/> meets the <see cref="Threshold"/> 
+    /// requirements of this appender.
+    /// </returns>
+    protected virtual bool IsAsSevereAsThreshold(Level level)
+    {
+      return ((m_threshold == null) || level >= m_threshold);
+    }
 
-		#endregion Private Instance Fields
+    /// <summary>
+    /// Is called when the appender is closed. Derived classes should override 
+    /// this method if resources need to be released.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Releases any resources allocated within the appender such as file handles, 
+    /// network connections, etc.
+    /// </para>
+    /// <para>
+    /// It is a programming error to append to a closed appender.
+    /// </para>
+    /// </remarks>
+    protected virtual void OnClose()
+    {
+      // Do nothing by default
+    }
 
-		#region Constants
+    /// <summary>
+    /// Subclasses of <see cref="AppenderSkeleton"/> should implement this method 
+    /// to perform actual logging.
+    /// </summary>
+    /// <param name="loggingEvent">The event to append.</param>
+    /// <remarks>
+    /// <para>
+    /// A subclass must implement this method to perform
+    /// logging of the <paramref name="loggingEvent"/>.
+    /// </para>
+    /// <para>This method will be called by <see cref="M:DoAppend(LoggingEvent)"/>
+    /// if all the conditions listed for that method are met.
+    /// </para>
+    /// <para>
+    /// To restrict the logging of events in the appender
+    /// override the <see cref="M:PreAppendCheck()"/> method.
+    /// </para>
+    /// </remarks>
+    protected abstract void Append(LoggingEvent loggingEvent);
 
-		/// <summary>
-		/// Initial buffer size
-		/// </summary>
-		private const int c_renderBufferSize = 256;
+    /// <summary>
+    /// Append a bulk array of logging events.
+    /// </summary>
+    /// <param name="loggingEvents">the array of logging events</param>
+    /// <remarks>
+    /// <para>
+    /// This base class implementation calls the <see cref="M:Append(LoggingEvent)"/>
+    /// method for each element in the bulk array.
+    /// </para>
+    /// <para>
+    /// A sub class that can better process a bulk array of events should
+    /// override this method in addition to <see cref="M:Append(LoggingEvent)"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual void Append(LoggingEvent[] loggingEvents)
+    {
+      foreach (LoggingEvent loggingEvent in loggingEvents)
+      {
+        Append(loggingEvent);
+      }
+    }
 
-		/// <summary>
-		/// Maximum buffer size before it is recycled
-		/// </summary>
-		private const int c_renderBufferMaxCapacity = 1024;
+    /// <summary>
+    /// Called before <see cref="M:Append(LoggingEvent)"/> as a precondition.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method is called by <see cref="M:DoAppend(LoggingEvent)"/>
+    /// before the call to the abstract <see cref="M:Append(LoggingEvent)"/> method.
+    /// </para>
+    /// <para>
+    /// This method can be overridden in a subclass to extend the checks 
+    /// made before the event is passed to the <see cref="M:Append(LoggingEvent)"/> method.
+    /// </para>
+    /// <para>
+    /// A subclass should ensure that they delegate this call to
+    /// this base class if it is overridden.
+    /// </para>
+    /// </remarks>
+    /// <returns><c>true</c> if the call to <see cref="M:Append(LoggingEvent)"/> should proceed.</returns>
+    protected virtual bool PreAppendCheck()
+    {
+      if ((m_layout == null) && RequiresLayout)
+      {
+        ErrorHandler.Error("AppenderSkeleton: No layout set for the appender named [" + m_name + "].");
+        return false;
+      }
 
-		#endregion
+      return true;
+    }
 
-	    #region Private Static Fields
+    /// <summary>
+    /// Renders the <see cref="LoggingEvent"/> to a string.
+    /// </summary>
+    /// <param name="loggingEvent">The event to render.</param>
+    /// <returns>The event rendered as a string.</returns>
+    /// <remarks>
+    /// <para>
+    /// Helper method to render a <see cref="LoggingEvent"/> to 
+    /// a string. This appender must have a <see cref="Layout"/>
+    /// set to render the <paramref name="loggingEvent"/> to 
+    /// a string.
+    /// </para>
+    /// <para>If there is exception data in the logging event and 
+    /// the layout does not process the exception, this method 
+    /// will append the exception text to the rendered string.
+    /// </para>
+    /// <para>
+    /// Where possible use the alternative version of this method
+    /// <see cref="M:RenderLoggingEvent(TextWriter,LoggingEvent)"/>.
+    /// That method streams the rendering onto an existing Writer
+    /// which can give better performance if the caller already has
+    /// a <see cref="TextWriter"/> open and ready for writing.
+    /// </para>
+    /// </remarks>
+    protected string RenderLoggingEvent(LoggingEvent loggingEvent)
+    {
+      // Create the render writer on first use
+      if (m_renderWriter == null)
+      {
+        m_renderWriter = new ReusableStringWriter(System.Globalization.CultureInfo.InvariantCulture);
+      }
 
-	    /// <summary>
-	    /// The fully qualified type of the AppenderSkeleton class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(AppenderSkeleton);
+      lock (m_renderWriter)
+      {
+        // Reset the writer so we can reuse it
+        m_renderWriter.Reset(c_renderBufferMaxCapacity, c_renderBufferSize);
 
-	    #endregion Private Static Fields
-	}
+        RenderLoggingEvent(m_renderWriter, loggingEvent);
+        return m_renderWriter.ToString();
+      }
+    }
+
+    /// <summary>
+    /// Renders the <see cref="LoggingEvent"/> to a string.
+    /// </summary>
+    /// <param name="loggingEvent">The event to render.</param>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <remarks>
+    /// <para>
+    /// Helper method to render a <see cref="LoggingEvent"/> to 
+    /// a string. This appender must have a <see cref="Layout"/>
+    /// set to render the <paramref name="loggingEvent"/> to 
+    /// a string.
+    /// </para>
+    /// <para>If there is exception data in the logging event and 
+    /// the layout does not process the exception, this method 
+    /// will append the exception text to the rendered string.
+    /// </para>
+    /// <para>
+    /// Use this method in preference to <see cref="M:RenderLoggingEvent(LoggingEvent)"/>
+    /// where possible. If, however, the caller needs to render the event
+    /// to a string then <see cref="M:RenderLoggingEvent(LoggingEvent)"/> does
+    /// provide an efficient mechanism for doing so.
+    /// </para>
+    /// </remarks>
+    protected void RenderLoggingEvent(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (m_layout == null)
+      {
+        throw new InvalidOperationException("A layout must be set");
+      }
+
+      if (m_layout.IgnoresException)
+      {
+        string exceptionStr = loggingEvent.GetExceptionString();
+        if (exceptionStr != null && exceptionStr.Length > 0)
+        {
+          // render the event and the exception
+          m_layout.Format(writer, loggingEvent);
+          writer.WriteLine(exceptionStr);
+        }
+        else
+        {
+          // there is no exception to render
+          m_layout.Format(writer, loggingEvent);
+        }
+      }
+      else
+      {
+        // The layout will render the exception
+        m_layout.Format(writer, loggingEvent);
+      }
+    }
+
+    /// <summary>
+    /// Tests if this appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// In the rather exceptional case, where the appender 
+    /// implementation admits a layout but can also work without it, 
+    /// then the appender should return <c>true</c>.
+    /// </para>
+    /// <para>
+    /// This default implementation always returns <c>false</c>.
+    /// </para>
+    /// </remarks>
+    /// <returns>
+    /// <c>true</c> if the appender requires a layout object, otherwise <c>false</c>.
+    /// </returns>
+    protected virtual bool RequiresLayout
+    {
+      get { return false; }
+    }
+
+    #endregion
+
+    /// <summary>
+    /// Flushes any buffered log data.
+    /// </summary>
+    /// <remarks>
+    /// This implementation doesn't flush anything and always returns true
+    /// </remarks>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public virtual bool Flush(int millisecondsTimeout)
+    {
+      return true;
+    }
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// The layout of this appender.
+    /// </summary>
+    /// <remarks>
+    /// See <see cref="Layout"/> for more information.
+    /// </remarks>
+    private ILayout m_layout;
+
+    /// <summary>
+    /// The name of this appender.
+    /// </summary>
+    /// <remarks>
+    /// See <see cref="Name"/> for more information.
+    /// </remarks>
+    private string m_name;
+
+    /// <summary>
+    /// The level threshold of this appender.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// There is no level threshold filtering by default.
+    /// </para>
+    /// <para>
+    /// See <see cref="Threshold"/> for more information.
+    /// </para>
+    /// </remarks>
+    private Level m_threshold;
+
+    /// <summary>
+    /// It is assumed and enforced that errorHandler is never null.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// It is assumed and enforced that errorHandler is never null.
+    /// </para>
+    /// <para>
+    /// See <see cref="ErrorHandler"/> for more information.
+    /// </para>
+    /// </remarks>
+    private IErrorHandler m_errorHandler;
+
+    /// <summary>
+    /// The first filter in the filter chain.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Set to <c>null</c> initially.
+    /// </para>
+    /// <para>
+    /// See <see cref="IFilter"/> for more information.
+    /// </para>
+    /// </remarks>
+    private IFilter m_headFilter;
+
+    /// <summary>
+    /// The last filter in the filter chain.
+    /// </summary>
+    /// <remarks>
+    /// See <see cref="IFilter"/> for more information.
+    /// </remarks>
+    private IFilter m_tailFilter;
+
+    /// <summary>
+    /// Flag indicating if this appender is closed.
+    /// </summary>
+    /// <remarks>
+    /// See <see cref="Close"/> for more information.
+    /// </remarks>
+    private bool m_closed = false;
+
+    /// <summary>
+    /// The guard prevents an appender from repeatedly calling its own DoAppend method
+    /// </summary>
+    private bool m_recursiveGuard = false;
+
+    /// <summary>
+    /// StringWriter used to render events
+    /// </summary>
+    private ReusableStringWriter m_renderWriter = null;
+
+    #endregion Private Instance Fields
+
+    #region Constants
+
+    /// <summary>
+    /// Initial buffer size
+    /// </summary>
+    private const int c_renderBufferSize = 256;
+
+    /// <summary>
+    /// Maximum buffer size before it is recycled
+    /// </summary>
+    private const int c_renderBufferMaxCapacity = 1024;
+
+    #endregion
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the AppenderSkeleton class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(AppenderSkeleton);
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Appender/AspNetTraceAppender.cs b/src/log4net/Appender/AspNetTraceAppender.cs
index bffa045..c478a49 100644
--- a/src/log4net/Appender/AspNetTraceAppender.cs
+++ b/src/log4net/Appender/AspNetTraceAppender.cs
@@ -27,130 +27,130 @@
 using log4net.Layout;
 using log4net.Core;
 
-namespace log4net.Appender 
+namespace log4net.Appender
 {
-	/// <summary>
-	/// <para>
-	/// Appends log events to the ASP.NET <see cref="TraceContext"/> system.
-	/// </para>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Diagnostic information and tracing messages that you specify are appended to the output 
-	/// of the page that is sent to the requesting browser. Optionally, you can view this information
-	/// from a separate trace viewer (Trace.axd) that displays trace information for every page in a 
-	/// given application.
-	/// </para>
-	/// <para>
-	/// Trace statements are processed and displayed only when tracing is enabled. You can control 
-	/// whether tracing is displayed to a page, to the trace viewer, or both.
-	/// </para>
-	/// <para>
-	/// The logging event is passed to the <see cref="M:TraceContext.Write(string)"/> or 
-	/// <see cref="M:TraceContext.Warn(string)"/> method depending on the level of the logging event.
-    /// The event's logger name is the default value for the category parameter of the Write/Warn method. 
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Ron Grabowski</author>
-	public class AspNetTraceAppender : AppenderSkeleton 
-	{
-		#region Public Instances Constructors
+  /// <summary>
+  /// <para>
+  /// Appends log events to the ASP.NET <see cref="TraceContext"/> system.
+  /// </para>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Diagnostic information and tracing messages that you specify are appended to the output 
+  /// of the page that is sent to the requesting browser. Optionally, you can view this information
+  /// from a separate trace viewer (Trace.axd) that displays trace information for every page in a 
+  /// given application.
+  /// </para>
+  /// <para>
+  /// Trace statements are processed and displayed only when tracing is enabled. You can control 
+  /// whether tracing is displayed to a page, to the trace viewer, or both.
+  /// </para>
+  /// <para>
+  /// The logging event is passed to the <see cref="M:TraceContext.Write(string)"/> or 
+  /// <see cref="M:TraceContext.Warn(string)"/> method depending on the level of the logging event.
+  /// The event's logger name is the default value for the category parameter of the Write/Warn method. 
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Ron Grabowski</author>
+  public class AspNetTraceAppender : AppenderSkeleton
+  {
+    #region Public Instances Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="AspNetTraceAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public AspNetTraceAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AspNetTraceAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public AspNetTraceAppender()
+    {
+    }
 
-		#endregion // Public Instances Constructors
+    #endregion // Public Instances Constructors
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Write the logging event to the ASP.NET trace
-		/// </summary>
-		/// <param name="loggingEvent">the event to log</param>
-		/// <remarks>
-		/// <para>
-		/// Write the logging event to the ASP.NET trace
-		/// <c>HttpContext.Current.Trace</c> 
-		/// (<see cref="TraceContext"/>).
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			// check if log4net is running in the context of an ASP.NET application
-			if (HttpContext.Current != null) 
-			{
-				// check if tracing is enabled for the current context
-				if (HttpContext.Current.Trace.IsEnabled) 
-				{
-					if (loggingEvent.Level >= Level.Warn) 
-					{
-                        HttpContext.Current.Trace.Warn(m_category.Format(loggingEvent), RenderLoggingEvent(loggingEvent));
-					}
-					else 
-					{
-                        HttpContext.Current.Trace.Write(m_category.Format(loggingEvent), RenderLoggingEvent(loggingEvent));
-					}
-				}
-			}
-		}
-
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
-
-		#endregion // Override implementation of AppenderSkeleton
-
-        #region Public Instance Properties
-
-        /// <summary>
-        /// The category parameter sent to the Trace method.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Defaults to %logger which will use the logger name of the current 
-        /// <see cref="LoggingEvent"/> as the category parameter.
-        /// </para>
-        /// <para>
-        /// </para> 
-        /// </remarks>
-        public PatternLayout Category
+    /// <summary>
+    /// Write the logging event to the ASP.NET trace
+    /// </summary>
+    /// <param name="loggingEvent">the event to log</param>
+    /// <remarks>
+    /// <para>
+    /// Write the logging event to the ASP.NET trace
+    /// <c>HttpContext.Current.Trace</c> 
+    /// (<see cref="TraceContext"/>).
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      // check if log4net is running in the context of an ASP.NET application
+      if (HttpContext.Current != null)
+      {
+        // check if tracing is enabled for the current context
+        if (HttpContext.Current.Trace.IsEnabled)
         {
-            get { return m_category; }
-            set { m_category = value; }
+          if (loggingEvent.Level >= Level.Warn)
+          {
+            HttpContext.Current.Trace.Warn(m_category.Format(loggingEvent), RenderLoggingEvent(loggingEvent));
+          }
+          else
+          {
+            HttpContext.Current.Trace.Write(m_category.Format(loggingEvent), RenderLoggingEvent(loggingEvent));
+          }
         }
+      }
+    }
 
-	    #endregion
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-	    #region Private Instance Fields
+    #endregion // Override implementation of AppenderSkeleton
 
-	    /// <summary>
-	    /// Defaults to %logger
-	    /// </summary>
-	    private PatternLayout m_category = new PatternLayout("%logger");
+    #region Public Instance Properties
 
-	    #endregion
-	}
+    /// <summary>
+    /// The category parameter sent to the Trace method.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defaults to %logger which will use the logger name of the current 
+    /// <see cref="LoggingEvent"/> as the category parameter.
+    /// </para>
+    /// <para>
+    /// </para> 
+    /// </remarks>
+    public PatternLayout Category
+    {
+      get { return m_category; }
+      set { m_category = value; }
+    }
+
+    #endregion
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// Defaults to %logger
+    /// </summary>
+    private PatternLayout m_category = new PatternLayout("%logger");
+
+    #endregion
+  }
 }
 
 #endif // !NETCF && !SSCLI
diff --git a/src/log4net/Appender/BufferingAppenderSkeleton.cs b/src/log4net/Appender/BufferingAppenderSkeleton.cs
index c49d838..5af27c8 100644
--- a/src/log4net/Appender/BufferingAppenderSkeleton.cs
+++ b/src/log4net/Appender/BufferingAppenderSkeleton.cs
@@ -25,635 +25,635 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Abstract base class implementation of <see cref="IAppender"/> that 
-	/// buffers events in a fixed size buffer.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This base class should be used by appenders that need to buffer a 
-	/// number of events before logging them.
-	/// For example the <see cref="AdoNetAppender"/> 
-	/// buffers events and then submits the entire contents of the buffer to 
-	/// the underlying database in one go.
-	/// </para>
-	/// <para>
-	/// Subclasses should override the <see cref="M:SendBuffer(LoggingEvent[])"/>
-	/// method to deliver the buffered events.
-	/// </para>
-	/// <para>The BufferingAppenderSkeleton maintains a fixed size cyclic 
-	/// buffer of events. The size of the buffer is set using 
-	/// the <see cref="BufferSize"/> property.
-	/// </para>
-	/// <para>A <see cref="ITriggeringEventEvaluator"/> is used to inspect 
-	/// each event as it arrives in the appender. If the <see cref="Evaluator"/> 
-	/// triggers, then the current buffer is sent immediately 
-	/// (see <see cref="M:SendBuffer(LoggingEvent[])"/>). Otherwise the event 
-	/// is stored in the buffer. For example, an evaluator can be used to 
-	/// deliver the events immediately when an ERROR event arrives.
-	/// </para>
-	/// <para>
-	/// The buffering appender can be configured in a <see cref="Lossy"/> mode. 
-	/// By default the appender is NOT lossy. When the buffer is full all 
-	/// the buffered events are sent with <see cref="M:SendBuffer(LoggingEvent[])"/>.
-	/// If the <see cref="Lossy"/> property is set to <c>true</c> then the 
-	/// buffer will not be sent when it is full, and new events arriving 
-	/// in the appender will overwrite the oldest event in the buffer. 
-	/// In lossy mode the buffer will only be sent when the <see cref="Evaluator"/>
-	/// triggers. This can be useful behavior when you need to know about 
-	/// ERROR events but not about events with a lower level, configure an 
-	/// evaluator that will trigger when an ERROR event arrives, the whole 
-	/// buffer will be sent which gives a history of events leading up to
-	/// the ERROR event.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-    public abstract class BufferingAppenderSkeleton : AppenderSkeleton
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Abstract base class implementation of <see cref="IAppender"/> that 
+  /// buffers events in a fixed size buffer.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This base class should be used by appenders that need to buffer a 
+  /// number of events before logging them.
+  /// For example the <see cref="AdoNetAppender"/> 
+  /// buffers events and then submits the entire contents of the buffer to 
+  /// the underlying database in one go.
+  /// </para>
+  /// <para>
+  /// Subclasses should override the <see cref="M:SendBuffer(LoggingEvent[])"/>
+  /// method to deliver the buffered events.
+  /// </para>
+  /// <para>The BufferingAppenderSkeleton maintains a fixed size cyclic 
+  /// buffer of events. The size of the buffer is set using 
+  /// the <see cref="BufferSize"/> property.
+  /// </para>
+  /// <para>A <see cref="ITriggeringEventEvaluator"/> is used to inspect 
+  /// each event as it arrives in the appender. If the <see cref="Evaluator"/> 
+  /// triggers, then the current buffer is sent immediately 
+  /// (see <see cref="M:SendBuffer(LoggingEvent[])"/>). Otherwise the event 
+  /// is stored in the buffer. For example, an evaluator can be used to 
+  /// deliver the events immediately when an ERROR event arrives.
+  /// </para>
+  /// <para>
+  /// The buffering appender can be configured in a <see cref="Lossy"/> mode. 
+  /// By default the appender is NOT lossy. When the buffer is full all 
+  /// the buffered events are sent with <see cref="M:SendBuffer(LoggingEvent[])"/>.
+  /// If the <see cref="Lossy"/> property is set to <c>true</c> then the 
+  /// buffer will not be sent when it is full, and new events arriving 
+  /// in the appender will overwrite the oldest event in the buffer. 
+  /// In lossy mode the buffer will only be sent when the <see cref="Evaluator"/>
+  /// triggers. This can be useful behavior when you need to know about 
+  /// ERROR events but not about events with a lower level, configure an 
+  /// evaluator that will trigger when an ERROR event arrives, the whole 
+  /// buffer will be sent which gives a history of events leading up to
+  /// the ERROR event.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class BufferingAppenderSkeleton : AppenderSkeleton
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="BufferingAppenderSkeleton" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Protected default constructor to allow subclassing.
-		/// </para>
-		/// </remarks>
-		protected BufferingAppenderSkeleton() : this(true)
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BufferingAppenderSkeleton" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Protected default constructor to allow subclassing.
+    /// </para>
+    /// </remarks>
+    protected BufferingAppenderSkeleton() : this(true)
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="BufferingAppenderSkeleton" /> class.
-		/// </summary>
-		/// <param name="eventMustBeFixed">the events passed through this appender must be
-		/// fixed by the time that they arrive in the derived class' <c>SendBuffer</c> method.</param>
-		/// <remarks>
-		/// <para>
-		/// Protected constructor to allow subclassing.
-		/// </para>
-		/// <para>
-		/// The <paramref name="eventMustBeFixed"/> should be set if the subclass
-		/// expects the events delivered to be fixed even if the 
-		/// <see cref="BufferSize"/> is set to zero, i.e. when no buffering occurs.
-		/// </para>
-		/// </remarks>
-		protected BufferingAppenderSkeleton(bool eventMustBeFixed) : base()
-		{
-			m_eventMustBeFixed = eventMustBeFixed;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BufferingAppenderSkeleton" /> class.
+    /// </summary>
+    /// <param name="eventMustBeFixed">the events passed through this appender must be
+    /// fixed by the time that they arrive in the derived class' <c>SendBuffer</c> method.</param>
+    /// <remarks>
+    /// <para>
+    /// Protected constructor to allow subclassing.
+    /// </para>
+    /// <para>
+    /// The <paramref name="eventMustBeFixed"/> should be set if the subclass
+    /// expects the events delivered to be fixed even if the 
+    /// <see cref="BufferSize"/> is set to zero, i.e. when no buffering occurs.
+    /// </para>
+    /// </remarks>
+    protected BufferingAppenderSkeleton(bool eventMustBeFixed) : base()
+    {
+      m_eventMustBeFixed = eventMustBeFixed;
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets a value that indicates whether the appender is lossy.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if the appender is lossy, otherwise <c>false</c>. The default is <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This appender uses a buffer to store logging events before 
-		/// delivering them. A triggering event causes the whole buffer
-		/// to be send to the remote sink. If the buffer overruns before
-		/// a triggering event then logging events could be lost. Set
-		/// <see cref="Lossy"/> to <c>false</c> to prevent logging events 
-		/// from being lost.
-		/// </para>
-		/// <para>If <see cref="Lossy"/> is set to <c>true</c> then an
-		/// <see cref="Evaluator"/> must be specified.</para>
-		/// </remarks>
-		public bool Lossy
-		{
-			get { return m_lossy; }
-			set { m_lossy = value; }
-		}
+    /// <summary>
+    /// Gets or sets a value that indicates whether the appender is lossy.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if the appender is lossy, otherwise <c>false</c>. The default is <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This appender uses a buffer to store logging events before 
+    /// delivering them. A triggering event causes the whole buffer
+    /// to be send to the remote sink. If the buffer overruns before
+    /// a triggering event then logging events could be lost. Set
+    /// <see cref="Lossy"/> to <c>false</c> to prevent logging events 
+    /// from being lost.
+    /// </para>
+    /// <para>If <see cref="Lossy"/> is set to <c>true</c> then an
+    /// <see cref="Evaluator"/> must be specified.</para>
+    /// </remarks>
+    public bool Lossy
+    {
+      get { return m_lossy; }
+      set { m_lossy = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the size of the cyclic buffer used to hold the 
-		/// logging events.
-		/// </summary>
-		/// <value>
-		/// The size of the cyclic buffer used to hold the logging events.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="BufferSize"/> option takes a positive integer
-		/// representing the maximum number of logging events to collect in 
-		/// a cyclic buffer. When the <see cref="BufferSize"/> is reached,
-		/// oldest events are deleted as new events are added to the
-		/// buffer. By default the size of the cyclic buffer is 512 events.
-		/// </para>
-		/// <para>
-		/// If the <see cref="BufferSize"/> is set to a value less than
-		/// or equal to 1 then no buffering will occur. The logging event
-		/// will be delivered synchronously (depending on the <see cref="Lossy"/>
-		/// and <see cref="Evaluator"/> properties). Otherwise the event will
-		/// be buffered.
-		/// </para>
-		/// </remarks>
-		public int BufferSize
-		{
-			get { return m_bufferSize; }
-			set { m_bufferSize = value; }
-		}
+    /// <summary>
+    /// Gets or sets the size of the cyclic buffer used to hold the 
+    /// logging events.
+    /// </summary>
+    /// <value>
+    /// The size of the cyclic buffer used to hold the logging events.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="BufferSize"/> option takes a positive integer
+    /// representing the maximum number of logging events to collect in 
+    /// a cyclic buffer. When the <see cref="BufferSize"/> is reached,
+    /// oldest events are deleted as new events are added to the
+    /// buffer. By default the size of the cyclic buffer is 512 events.
+    /// </para>
+    /// <para>
+    /// If the <see cref="BufferSize"/> is set to a value less than
+    /// or equal to 1 then no buffering will occur. The logging event
+    /// will be delivered synchronously (depending on the <see cref="Lossy"/>
+    /// and <see cref="Evaluator"/> properties). Otherwise the event will
+    /// be buffered.
+    /// </para>
+    /// </remarks>
+    public int BufferSize
+    {
+      get { return m_bufferSize; }
+      set { m_bufferSize = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="ITriggeringEventEvaluator"/> that causes the 
-		/// buffer to be sent immediately.
-		/// </summary>
-		/// <value>
-		/// The <see cref="ITriggeringEventEvaluator"/> that causes the buffer to be
-		/// sent immediately.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The evaluator will be called for each event that is appended to this 
-		/// appender. If the evaluator triggers then the current buffer will 
-		/// immediately be sent (see <see cref="M:SendBuffer(LoggingEvent[])"/>).
-		/// </para>
-		/// <para>If <see cref="Lossy"/> is set to <c>true</c> then an
-		/// <see cref="Evaluator"/> must be specified.</para>
-		/// </remarks>
-		public ITriggeringEventEvaluator Evaluator
-		{
-			get { return m_evaluator; }
-			set	{ m_evaluator = value; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="ITriggeringEventEvaluator"/> that causes the 
+    /// buffer to be sent immediately.
+    /// </summary>
+    /// <value>
+    /// The <see cref="ITriggeringEventEvaluator"/> that causes the buffer to be
+    /// sent immediately.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The evaluator will be called for each event that is appended to this 
+    /// appender. If the evaluator triggers then the current buffer will 
+    /// immediately be sent (see <see cref="M:SendBuffer(LoggingEvent[])"/>).
+    /// </para>
+    /// <para>If <see cref="Lossy"/> is set to <c>true</c> then an
+    /// <see cref="Evaluator"/> must be specified.</para>
+    /// </remarks>
+    public ITriggeringEventEvaluator Evaluator
+    {
+      get { return m_evaluator; }
+      set { m_evaluator = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the value of the <see cref="ITriggeringEventEvaluator"/> to use.
-		/// </summary>
-		/// <value>
-		/// The value of the <see cref="ITriggeringEventEvaluator"/> to use.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The evaluator will be called for each event that is discarded from this 
-		/// appender. If the evaluator triggers then the current buffer will immediately 
-		/// be sent (see <see cref="M:SendBuffer(LoggingEvent[])"/>).
-		/// </para>
-		/// </remarks>
-		public ITriggeringEventEvaluator LossyEvaluator
-		{
-			get { return m_lossyEvaluator; }
-			set	{ m_lossyEvaluator = value; }
-		}
+    /// <summary>
+    /// Gets or sets the value of the <see cref="ITriggeringEventEvaluator"/> to use.
+    /// </summary>
+    /// <value>
+    /// The value of the <see cref="ITriggeringEventEvaluator"/> to use.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The evaluator will be called for each event that is discarded from this 
+    /// appender. If the evaluator triggers then the current buffer will immediately 
+    /// be sent (see <see cref="M:SendBuffer(LoggingEvent[])"/>).
+    /// </para>
+    /// </remarks>
+    public ITriggeringEventEvaluator LossyEvaluator
+    {
+      get { return m_lossyEvaluator; }
+      set { m_lossyEvaluator = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets a value indicating if only part of the logging event data
-		/// should be fixed.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if the appender should only fix part of the logging event 
-		/// data, otherwise <c>false</c>. The default is <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Setting this property to <c>true</c> will cause only part of the
-		/// event data to be fixed and serialized. This will improve performance.
-		/// </para>
-		/// <para>
-		/// See <see cref="M:LoggingEvent.FixVolatileData(FixFlags)"/> for more information.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use Fix property")]
-		public virtual bool OnlyFixPartialEventData
-		{
-			get { return (Fix == FixFlags.Partial); }
-			set 
-			{ 
-				if (value)
-				{
-					Fix = FixFlags.Partial;
-				}
-				else
-				{
-					Fix = FixFlags.All;
-				}
-			}
-		}
-
-		/// <summary>
-		/// Gets or sets a the fields that will be fixed in the event
-		/// </summary>
-		/// <value>
-		/// The event fields that will be fixed before the event is buffered
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The logging event needs to have certain thread specific values 
-		/// captured before it can be buffered. See <see cref="LoggingEvent.Fix"/>
-		/// for details.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="LoggingEvent.Fix"/>
-		public virtual FixFlags Fix
-		{
-			get { return m_fixFlags; }
-			set { m_fixFlags = value; }
-		}
-
-		#endregion Public Instance Properties
-
-		#region Public Methods
-
-        /// <summary>
-        /// Flushes any buffered log data.
-        /// </summary>
-        /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
-        /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-        public override bool Flush(int millisecondsTimeout)
+    /// <summary>
+    /// Gets or sets a value indicating if only part of the logging event data
+    /// should be fixed.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if the appender should only fix part of the logging event 
+    /// data, otherwise <c>false</c>. The default is <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Setting this property to <c>true</c> will cause only part of the
+    /// event data to be fixed and serialized. This will improve performance.
+    /// </para>
+    /// <para>
+    /// See <see cref="M:LoggingEvent.FixVolatileData(FixFlags)"/> for more information.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use Fix property")]
+    public virtual bool OnlyFixPartialEventData
+    {
+      get { return (Fix == FixFlags.Partial); }
+      set
+      {
+        if (value)
         {
-            Flush();
-            return true;
+          Fix = FixFlags.Partial;
         }
+        else
+        {
+          Fix = FixFlags.All;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Flush the currently buffered events
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Flushes any events that have been buffered.
-		/// </para>
-		/// <para>
-		/// If the appender is buffering in <see cref="Lossy"/> mode then the contents
-		/// of the buffer will NOT be flushed to the appender.
-		/// </para>
-		/// </remarks>
-		public virtual void Flush()
-		{
-			Flush(false);
-		}
+    /// <summary>
+    /// Gets or sets a the fields that will be fixed in the event
+    /// </summary>
+    /// <value>
+    /// The event fields that will be fixed before the event is buffered
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The logging event needs to have certain thread specific values 
+    /// captured before it can be buffered. See <see cref="LoggingEvent.Fix"/>
+    /// for details.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="LoggingEvent.Fix"/>
+    public virtual FixFlags Fix
+    {
+      get { return m_fixFlags; }
+      set { m_fixFlags = value; }
+    }
 
-		/// <summary>
-		/// Flush the currently buffered events
-		/// </summary>
-		/// <param name="flushLossyBuffer">set to <c>true</c> to flush the buffer of lossy events</param>
-		/// <remarks>
-		/// <para>
-		/// Flushes events that have been buffered. If <paramref name="flushLossyBuffer" /> is
-		/// <c>false</c> then events will only be flushed if this buffer is non-lossy mode.
-		/// </para>
-		/// <para>
-		/// If the appender is buffering in <see cref="Lossy"/> mode then the contents
-		/// of the buffer will only be flushed if <paramref name="flushLossyBuffer" /> is <c>true</c>.
-		/// In this case the contents of the buffer will be tested against the 
-		/// <see cref="LossyEvaluator"/> and if triggering will be output. All other buffered
-		/// events will be discarded.
-		/// </para>
-		/// <para>
-		/// If <paramref name="flushLossyBuffer" /> is <c>true</c> then the buffer will always
-		/// be emptied by calling this method.
-		/// </para>
-		/// </remarks>
-		public virtual void Flush(bool flushLossyBuffer)
-		{
-			// This method will be called outside of the AppenderSkeleton DoAppend() method
-			// therefore it needs to be protected by its own lock. This will block any
-			// Appends while the buffer is flushed.
-			lock(this)
-			{
-				if (m_cb != null && m_cb.Length > 0)
-				{
-					if (m_lossy)
-					{
-						// If we are allowed to eagerly flush from the lossy buffer
-						if (flushLossyBuffer)
-						{
-							if (m_lossyEvaluator != null)
-							{
-								// Test the contents of the buffer against the lossy evaluator
-								LoggingEvent[] bufferedEvents = m_cb.PopAll();
-								ArrayList filteredEvents = new ArrayList(bufferedEvents.Length);
+    #endregion Public Instance Properties
 
-								foreach(LoggingEvent loggingEvent in bufferedEvents)
-								{
-									if (m_lossyEvaluator.IsTriggeringEvent(loggingEvent))
-									{
-										filteredEvents.Add(loggingEvent);
-									}
-								}
+    #region Public Methods
 
-								// Send the events that meet the lossy evaluator criteria
-								if (filteredEvents.Count > 0)
-								{
-									SendBuffer((LoggingEvent[])filteredEvents.ToArray(typeof(LoggingEvent)));
-								}
-							}
-							else
-							{
-								// No lossy evaluator, all buffered events are discarded
-								m_cb.Clear();
-							}
-						}
-					}
-					else
-					{
-						// Not lossy, send whole buffer
-						SendFromBuffer(null, m_cb);
-					}
-				}
-			}
-		}
+    /// <summary>
+    /// Flushes any buffered log data.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public override bool Flush(int millisecondsTimeout)
+    {
+      Flush();
+      return true;
+    }
 
-		#endregion Public Methods
+    /// <summary>
+    /// Flush the currently buffered events
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Flushes any events that have been buffered.
+    /// </para>
+    /// <para>
+    /// If the appender is buffering in <see cref="Lossy"/> mode then the contents
+    /// of the buffer will NOT be flushed to the appender.
+    /// </para>
+    /// </remarks>
+    public virtual void Flush()
+    {
+      Flush(false);
+    }
 
-		#region Implementation of IOptionHandler
+    /// <summary>
+    /// Flush the currently buffered events
+    /// </summary>
+    /// <param name="flushLossyBuffer">set to <c>true</c> to flush the buffer of lossy events</param>
+    /// <remarks>
+    /// <para>
+    /// Flushes events that have been buffered. If <paramref name="flushLossyBuffer" /> is
+    /// <c>false</c> then events will only be flushed if this buffer is non-lossy mode.
+    /// </para>
+    /// <para>
+    /// If the appender is buffering in <see cref="Lossy"/> mode then the contents
+    /// of the buffer will only be flushed if <paramref name="flushLossyBuffer" /> is <c>true</c>.
+    /// In this case the contents of the buffer will be tested against the 
+    /// <see cref="LossyEvaluator"/> and if triggering will be output. All other buffered
+    /// events will be discarded.
+    /// </para>
+    /// <para>
+    /// If <paramref name="flushLossyBuffer" /> is <c>true</c> then the buffer will always
+    /// be emptied by calling this method.
+    /// </para>
+    /// </remarks>
+    public virtual void Flush(bool flushLossyBuffer)
+    {
+      // This method will be called outside of the AppenderSkeleton DoAppend() method
+      // therefore it needs to be protected by its own lock. This will block any
+      // Appends while the buffer is flushed.
+      lock (this)
+      {
+        if (m_cb != null && m_cb.Length > 0)
+        {
+          if (m_lossy)
+          {
+            // If we are allowed to eagerly flush from the lossy buffer
+            if (flushLossyBuffer)
+            {
+              if (m_lossyEvaluator != null)
+              {
+                // Test the contents of the buffer against the lossy evaluator
+                LoggingEvent[] bufferedEvents = m_cb.PopAll();
+                ArrayList filteredEvents = new ArrayList(bufferedEvents.Length);
 
-		/// <summary>
-		/// Initialize the appender based on the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			base.ActivateOptions();
+                foreach (LoggingEvent loggingEvent in bufferedEvents)
+                {
+                  if (m_lossyEvaluator.IsTriggeringEvent(loggingEvent))
+                  {
+                    filteredEvents.Add(loggingEvent);
+                  }
+                }
 
-			// If the appender is in Lossy mode then we will
-			// only send the buffer when the Evaluator triggers
-			// therefore check we have an evaluator.
-			if (m_lossy && m_evaluator == null)
-			{
-				ErrorHandler.Error("Appender ["+Name+"] is Lossy but has no Evaluator. The buffer will never be sent!"); 
-			}
+                // Send the events that meet the lossy evaluator criteria
+                if (filteredEvents.Count > 0)
+                {
+                  SendBuffer((LoggingEvent[])filteredEvents.ToArray(typeof(LoggingEvent)));
+                }
+              }
+              else
+              {
+                // No lossy evaluator, all buffered events are discarded
+                m_cb.Clear();
+              }
+            }
+          }
+          else
+          {
+            // Not lossy, send whole buffer
+            SendFromBuffer(null, m_cb);
+          }
+        }
+      }
+    }
 
-			if (m_bufferSize > 1)
-			{
-				m_cb = new CyclicBuffer(m_bufferSize);
-			}
-			else
-			{
-				m_cb = null;
-			}
-		}
+    #endregion Public Methods
 
-		#endregion Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		#region Override implementation of AppenderSkeleton
+    /// <summary>
+    /// Initialize the appender based on the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-		/// <summary>
-		/// Close this appender instance.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Close this appender instance. If this appender is marked
-		/// as not <see cref="Lossy"/> then the remaining events in 
-		/// the buffer must be sent when the appender is closed.
-		/// </para>
-		/// </remarks>
-		protected override void OnClose() 
-		{
-			// Flush the buffer on close
-			Flush(true);
-		}
+      // If the appender is in Lossy mode then we will
+      // only send the buffer when the Evaluator triggers
+      // therefore check we have an evaluator.
+      if (m_lossy && m_evaluator == null)
+      {
+        ErrorHandler.Error("Appender [" + Name + "] is Lossy but has no Evaluator. The buffer will never be sent!");
+      }
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method. 
-		/// </summary>
-		/// <param name="loggingEvent">the event to log</param>
-		/// <remarks>
-		/// <para>
-		/// Stores the <paramref name="loggingEvent"/> in the cyclic buffer.
-		/// </para>
-		/// <para>
-		/// The buffer will be sent (i.e. passed to the <see cref="SendBuffer"/> 
-		/// method) if one of the following conditions is met:
-		/// </para>
-		/// <list type="bullet">
-		///		<item>
-		///			<description>The cyclic buffer is full and this appender is
-		///			marked as not lossy (see <see cref="Lossy"/>)</description>
-		///		</item>
-		///		<item>
-		///			<description>An <see cref="Evaluator"/> is set and
-		///			it is triggered for the <paramref name="loggingEvent"/>
-		///			specified.</description>
-		///		</item>
-		/// </list>
-		/// <para>
-		/// Before the event is stored in the buffer it is fixed
-		/// (see <see cref="M:LoggingEvent.FixVolatileData(FixFlags)"/>) to ensure that
-		/// any data referenced by the event will be valid when the buffer
-		/// is processed.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			// If the buffer size is set to 1 or less then the buffer will be
-			// sent immediately because there is not enough space in the buffer
-			// to buffer up more than 1 event. Therefore as a special case
-			// we don't use the buffer at all.
-			if (m_cb == null || m_bufferSize <= 1)
-			{
-				// Only send the event if we are in non lossy mode or the event is a triggering event
-				if ((!m_lossy) || 
-					(m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent)) || 
-					(m_lossyEvaluator != null && m_lossyEvaluator.IsTriggeringEvent(loggingEvent)))
-				{
-					if (m_eventMustBeFixed)
-					{
-						// Derive class expects fixed events
-						loggingEvent.Fix = this.Fix;
-					}
+      if (m_bufferSize > 1)
+      {
+        m_cb = new CyclicBuffer(m_bufferSize);
+      }
+      else
+      {
+        m_cb = null;
+      }
+    }
 
-					// Not buffering events, send immediately
-					SendBuffer(new LoggingEvent[] { loggingEvent } );
-				}
-			}
-			else
-			{
-				// Because we are caching the LoggingEvent beyond the
-				// lifetime of the Append() method we must fix any
-				// volatile data in the event.
-				loggingEvent.Fix = this.Fix;
+    #endregion Implementation of IOptionHandler
 
-				// Add to the buffer, returns the event discarded from the buffer if there is no space remaining after the append
-				LoggingEvent discardedLoggingEvent = m_cb.Append(loggingEvent);
+    #region Override implementation of AppenderSkeleton
 
-				if (discardedLoggingEvent != null)
-				{
-					// Buffer is full and has had to discard an event
-					if (!m_lossy)
-					{
-						// Not lossy, must send all events
-						SendFromBuffer(discardedLoggingEvent, m_cb);
-					}
-					else
-					{
-						// Check if the discarded event should not be logged
-						if (m_lossyEvaluator == null || !m_lossyEvaluator.IsTriggeringEvent(discardedLoggingEvent))
-						{
-							// Clear the discarded event as we should not forward it
-							discardedLoggingEvent = null;
-						}
+    /// <summary>
+    /// Close this appender instance.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Close this appender instance. If this appender is marked
+    /// as not <see cref="Lossy"/> then the remaining events in 
+    /// the buffer must be sent when the appender is closed.
+    /// </para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      // Flush the buffer on close
+      Flush(true);
+    }
 
-						// Check if the event should trigger the whole buffer to be sent
-						if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent))
-						{
-							SendFromBuffer(discardedLoggingEvent, m_cb);
-						}
-						else if (discardedLoggingEvent != null)
-						{
-							// Just send the discarded event
-							SendBuffer(new LoggingEvent[] { discardedLoggingEvent } );
-						}
-					}
-				}
-				else
-				{
-					// Buffer is not yet full
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method. 
+    /// </summary>
+    /// <param name="loggingEvent">the event to log</param>
+    /// <remarks>
+    /// <para>
+    /// Stores the <paramref name="loggingEvent"/> in the cyclic buffer.
+    /// </para>
+    /// <para>
+    /// The buffer will be sent (i.e. passed to the <see cref="SendBuffer"/> 
+    /// method) if one of the following conditions is met:
+    /// </para>
+    /// <list type="bullet">
+    ///    <item>
+    ///      <description>The cyclic buffer is full and this appender is
+    ///      marked as not lossy (see <see cref="Lossy"/>)</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>An <see cref="Evaluator"/> is set and
+    ///      it is triggered for the <paramref name="loggingEvent"/>
+    ///      specified.</description>
+    ///    </item>
+    /// </list>
+    /// <para>
+    /// Before the event is stored in the buffer it is fixed
+    /// (see <see cref="M:LoggingEvent.FixVolatileData(FixFlags)"/>) to ensure that
+    /// any data referenced by the event will be valid when the buffer
+    /// is processed.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      // If the buffer size is set to 1 or less then the buffer will be
+      // sent immediately because there is not enough space in the buffer
+      // to buffer up more than 1 event. Therefore as a special case
+      // we don't use the buffer at all.
+      if (m_cb == null || m_bufferSize <= 1)
+      {
+        // Only send the event if we are in non lossy mode or the event is a triggering event
+        if ((!m_lossy) ||
+          (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent)) ||
+          (m_lossyEvaluator != null && m_lossyEvaluator.IsTriggeringEvent(loggingEvent)))
+        {
+          if (m_eventMustBeFixed)
+          {
+            // Derive class expects fixed events
+            loggingEvent.Fix = this.Fix;
+          }
 
-					// Check if the event should trigger the whole buffer to be sent
-					if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent))
-					{
-						SendFromBuffer(null, m_cb);
-					}
-				}
-			}
-		}
+          // Not buffering events, send immediately
+          SendBuffer(new LoggingEvent[] { loggingEvent });
+        }
+      }
+      else
+      {
+        // Because we are caching the LoggingEvent beyond the
+        // lifetime of the Append() method we must fix any
+        // volatile data in the event.
+        loggingEvent.Fix = this.Fix;
 
-		#endregion Override implementation of AppenderSkeleton
+        // Add to the buffer, returns the event discarded from the buffer if there is no space remaining after the append
+        LoggingEvent discardedLoggingEvent = m_cb.Append(loggingEvent);
 
-		#region Protected Instance Methods
+        if (discardedLoggingEvent != null)
+        {
+          // Buffer is full and has had to discard an event
+          if (!m_lossy)
+          {
+            // Not lossy, must send all events
+            SendFromBuffer(discardedLoggingEvent, m_cb);
+          }
+          else
+          {
+            // Check if the discarded event should not be logged
+            if (m_lossyEvaluator == null || !m_lossyEvaluator.IsTriggeringEvent(discardedLoggingEvent))
+            {
+              // Clear the discarded event as we should not forward it
+              discardedLoggingEvent = null;
+            }
 
-		/// <summary>
-		/// Sends the contents of the buffer.
-		/// </summary>
-		/// <param name="firstLoggingEvent">The first logging event.</param>
-		/// <param name="buffer">The buffer containing the events that need to be send.</param>
-		/// <remarks>
-		/// <para>
-		/// The subclass must override <see cref="M:SendBuffer(LoggingEvent[])"/>.
-		/// </para>
-		/// </remarks>
-		protected virtual void SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuffer buffer)
-		{
-			LoggingEvent[] bufferEvents = buffer.PopAll();
+            // Check if the event should trigger the whole buffer to be sent
+            if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent))
+            {
+              SendFromBuffer(discardedLoggingEvent, m_cb);
+            }
+            else if (discardedLoggingEvent != null)
+            {
+              // Just send the discarded event
+              SendBuffer(new LoggingEvent[] { discardedLoggingEvent });
+            }
+          }
+        }
+        else
+        {
+          // Buffer is not yet full
 
-			if (firstLoggingEvent == null)
-			{
-				SendBuffer(bufferEvents);
-			}
-			else if (bufferEvents.Length == 0)
-			{
-				SendBuffer(new LoggingEvent[] { firstLoggingEvent } );
-			}
-			else
-			{
-				// Create new array with the firstLoggingEvent at the head
-				LoggingEvent[] events = new LoggingEvent[bufferEvents.Length + 1];
-				Array.Copy(bufferEvents, 0, events, 1, bufferEvents.Length);
-				events[0] = firstLoggingEvent;
+          // Check if the event should trigger the whole buffer to be sent
+          if (m_evaluator != null && m_evaluator.IsTriggeringEvent(loggingEvent))
+          {
+            SendFromBuffer(null, m_cb);
+          }
+        }
+      }
+    }
 
-				SendBuffer(events);
-			}
-		}
+    #endregion Override implementation of AppenderSkeleton
 
-		#endregion Protected Instance Methods
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Sends the events.
-		/// </summary>
-		/// <param name="events">The events that need to be send.</param>
-		/// <remarks>
-		/// <para>
-		/// The subclass must override this method to process the buffered events.
-		/// </para>
-		/// </remarks>
-		protected abstract void SendBuffer(LoggingEvent[] events);
+    /// <summary>
+    /// Sends the contents of the buffer.
+    /// </summary>
+    /// <param name="firstLoggingEvent">The first logging event.</param>
+    /// <param name="buffer">The buffer containing the events that need to be send.</param>
+    /// <remarks>
+    /// <para>
+    /// The subclass must override <see cref="M:SendBuffer(LoggingEvent[])"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual void SendFromBuffer(LoggingEvent firstLoggingEvent, CyclicBuffer buffer)
+    {
+      LoggingEvent[] bufferEvents = buffer.PopAll();
 
-		#region Private Static Fields
+      if (firstLoggingEvent == null)
+      {
+        SendBuffer(bufferEvents);
+      }
+      else if (bufferEvents.Length == 0)
+      {
+        SendBuffer(new LoggingEvent[] { firstLoggingEvent });
+      }
+      else
+      {
+        // Create new array with the firstLoggingEvent at the head
+        LoggingEvent[] events = new LoggingEvent[bufferEvents.Length + 1];
+        Array.Copy(bufferEvents, 0, events, 1, bufferEvents.Length);
+        events[0] = firstLoggingEvent;
 
-		/// <summary>
-		/// The default buffer size.
-		/// </summary>
-		/// <remarks>
-		/// The default size of the cyclic buffer used to store events.
-		/// This is set to 512 by default.
-		/// </remarks>
-		private const int DEFAULT_BUFFER_SIZE = 512;
+        SendBuffer(events);
+      }
+    }
 
-		#endregion Private Static Fields
+    #endregion Protected Instance Methods
 
-		#region Private Instance Fields
+    /// <summary>
+    /// Sends the events.
+    /// </summary>
+    /// <param name="events">The events that need to be send.</param>
+    /// <remarks>
+    /// <para>
+    /// The subclass must override this method to process the buffered events.
+    /// </para>
+    /// </remarks>
+    protected abstract void SendBuffer(LoggingEvent[] events);
 
-		/// <summary>
-		/// The size of the cyclic buffer used to hold the logging events.
-		/// </summary>
-		/// <remarks>
-		/// Set to <see cref="DEFAULT_BUFFER_SIZE"/> by default.
-		/// </remarks>
-		private int m_bufferSize = DEFAULT_BUFFER_SIZE;
+    #region Private Static Fields
 
-		/// <summary>
-		/// The cyclic buffer used to store the logging events.
-		/// </summary>
-		private CyclicBuffer m_cb;
+    /// <summary>
+    /// The default buffer size.
+    /// </summary>
+    /// <remarks>
+    /// The default size of the cyclic buffer used to store events.
+    /// This is set to 512 by default.
+    /// </remarks>
+    private const int DEFAULT_BUFFER_SIZE = 512;
 
-		/// <summary>
-		/// The triggering event evaluator that causes the buffer to be sent immediately.
-		/// </summary>
-		/// <remarks>
-		/// The object that is used to determine if an event causes the entire
-		/// buffer to be sent immediately. This field can be <c>null</c>, which 
-		/// indicates that event triggering is not to be done. The evaluator
-		/// can be set using the <see cref="Evaluator"/> property. If this appender
-		/// has the <see cref="m_lossy"/> (<see cref="Lossy"/> property) set to 
-		/// <c>true</c> then an <see cref="Evaluator"/> must be set.
-		/// </remarks>
-		private ITriggeringEventEvaluator m_evaluator;
+    #endregion Private Static Fields
 
-		/// <summary>
-		/// Indicates if the appender should overwrite events in the cyclic buffer 
-		/// when it becomes full, or if the buffer should be flushed when the 
-		/// buffer is full.
-		/// </summary>
-		/// <remarks>
-		/// If this field is set to <c>true</c> then an <see cref="Evaluator"/> must 
-		/// be set.
-		/// </remarks>
-		private bool m_lossy = false;
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The triggering event evaluator filters discarded events.
-		/// </summary>
-		/// <remarks>
-		/// The object that is used to determine if an event that is discarded should
-		/// really be discarded or if it should be sent to the appenders. 
-		/// This field can be <c>null</c>, which indicates that all discarded events will
-		/// be discarded. 
-		/// </remarks>
-		private ITriggeringEventEvaluator m_lossyEvaluator;
+    /// <summary>
+    /// The size of the cyclic buffer used to hold the logging events.
+    /// </summary>
+    /// <remarks>
+    /// Set to <see cref="DEFAULT_BUFFER_SIZE"/> by default.
+    /// </remarks>
+    private int m_bufferSize = DEFAULT_BUFFER_SIZE;
 
-		/// <summary>
-		/// Value indicating which fields in the event should be fixed
-		/// </summary>
-		/// <remarks>
-		/// By default all fields are fixed
-		/// </remarks>
-		private FixFlags m_fixFlags = FixFlags.All;
+    /// <summary>
+    /// The cyclic buffer used to store the logging events.
+    /// </summary>
+    private CyclicBuffer m_cb;
 
-		/// <summary>
-		/// The events delivered to the subclass must be fixed.
-		/// </summary>
-		private readonly bool m_eventMustBeFixed;
+    /// <summary>
+    /// The triggering event evaluator that causes the buffer to be sent immediately.
+    /// </summary>
+    /// <remarks>
+    /// The object that is used to determine if an event causes the entire
+    /// buffer to be sent immediately. This field can be <c>null</c>, which 
+    /// indicates that event triggering is not to be done. The evaluator
+    /// can be set using the <see cref="Evaluator"/> property. If this appender
+    /// has the <see cref="m_lossy"/> (<see cref="Lossy"/> property) set to 
+    /// <c>true</c> then an <see cref="Evaluator"/> must be set.
+    /// </remarks>
+    private ITriggeringEventEvaluator m_evaluator;
 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// Indicates if the appender should overwrite events in the cyclic buffer 
+    /// when it becomes full, or if the buffer should be flushed when the 
+    /// buffer is full.
+    /// </summary>
+    /// <remarks>
+    /// If this field is set to <c>true</c> then an <see cref="Evaluator"/> must 
+    /// be set.
+    /// </remarks>
+    private bool m_lossy = false;
+
+    /// <summary>
+    /// The triggering event evaluator filters discarded events.
+    /// </summary>
+    /// <remarks>
+    /// The object that is used to determine if an event that is discarded should
+    /// really be discarded or if it should be sent to the appenders. 
+    /// This field can be <c>null</c>, which indicates that all discarded events will
+    /// be discarded. 
+    /// </remarks>
+    private ITriggeringEventEvaluator m_lossyEvaluator;
+
+    /// <summary>
+    /// Value indicating which fields in the event should be fixed
+    /// </summary>
+    /// <remarks>
+    /// By default all fields are fixed
+    /// </remarks>
+    private FixFlags m_fixFlags = FixFlags.All;
+
+    /// <summary>
+    /// The events delivered to the subclass must be fixed.
+    /// </summary>
+    private readonly bool m_eventMustBeFixed;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Appender/BufferingForwardingAppender.cs b/src/log4net/Appender/BufferingForwardingAppender.cs
index 20c3624..360c8f9 100644
--- a/src/log4net/Appender/BufferingForwardingAppender.cs
+++ b/src/log4net/Appender/BufferingForwardingAppender.cs
@@ -25,250 +25,250 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Buffers events and then forwards them to attached appenders.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The events are buffered in this appender until conditions are
-	/// met to allow the appender to deliver the events to the attached 
-	/// appenders. See <see cref="BufferingAppenderSkeleton"/> for the
-	/// conditions that cause the buffer to be sent.
-	/// </para>
-	/// <para>The forwarding appender can be used to specify different 
-	/// thresholds and filters for the same appender at different locations 
-	/// within the hierarchy.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class BufferingForwardingAppender : BufferingAppenderSkeleton, IAppenderAttachable
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Buffers events and then forwards them to attached appenders.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The events are buffered in this appender until conditions are
+  /// met to allow the appender to deliver the events to the attached 
+  /// appenders. See <see cref="BufferingAppenderSkeleton"/> for the
+  /// conditions that cause the buffer to be sent.
+  /// </para>
+  /// <para>The forwarding appender can be used to specify different 
+  /// thresholds and filters for the same appender at different locations 
+  /// within the hierarchy.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class BufferingForwardingAppender : BufferingAppenderSkeleton, IAppenderAttachable
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="BufferingForwardingAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public BufferingForwardingAppender()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BufferingForwardingAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public BufferingForwardingAppender()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Closes the appender and releases resources.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Releases any resources allocated within the appender such as file handles, 
-		/// network connections, etc.
-		/// </para>
-		/// <para>
-		/// It is a programming error to append to a closed appender.
-		/// </para>
-		/// </remarks>
-		protected override void OnClose()
-		{
-			// Remove all the attached appenders
-			lock(this)
-			{
-				// Delegate to base, which will flush buffers
-				base.OnClose();
+    /// <summary>
+    /// Closes the appender and releases resources.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Releases any resources allocated within the appender such as file handles, 
+    /// network connections, etc.
+    /// </para>
+    /// <para>
+    /// It is a programming error to append to a closed appender.
+    /// </para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      // Remove all the attached appenders
+      lock (this)
+      {
+        // Delegate to base, which will flush buffers
+        base.OnClose();
 
-				if (m_appenderAttachedImpl != null)
-				{
-					m_appenderAttachedImpl.RemoveAllAppenders();
-				}
-			}
-		}
+        if (m_appenderAttachedImpl != null)
+        {
+          m_appenderAttachedImpl.RemoveAllAppenders();
+        }
+      }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Override implementation of BufferingAppenderSkeleton
+    #region Override implementation of BufferingAppenderSkeleton
 
-		/// <summary>
-		/// Send the events.
-		/// </summary>
-		/// <param name="events">The events that need to be send.</param>
-		/// <remarks>
-		/// <para>
-		/// Forwards the events to the attached appenders.
-		/// </para>
-		/// </remarks>
-		protected override void SendBuffer(LoggingEvent[] events)
-		{
-			// Pass the logging event on to the attached appenders
-			if (m_appenderAttachedImpl != null)
-			{
-				m_appenderAttachedImpl.AppendLoopOnAppenders(events);
-			}
-		}
+    /// <summary>
+    /// Send the events.
+    /// </summary>
+    /// <param name="events">The events that need to be send.</param>
+    /// <remarks>
+    /// <para>
+    /// Forwards the events to the attached appenders.
+    /// </para>
+    /// </remarks>
+    protected override void SendBuffer(LoggingEvent[] events)
+    {
+      // Pass the logging event on to the attached appenders
+      if (m_appenderAttachedImpl != null)
+      {
+        m_appenderAttachedImpl.AppendLoopOnAppenders(events);
+      }
+    }
 
-		#endregion Override implementation of BufferingAppenderSkeleton
+    #endregion Override implementation of BufferingAppenderSkeleton
 
-		#region Implementation of IAppenderAttachable
+    #region Implementation of IAppenderAttachable
 
-		/// <summary>
-		/// Adds an <see cref="IAppender" /> to the list of appenders of this
-		/// instance.
-		/// </summary>
-		/// <param name="newAppender">The <see cref="IAppender" /> to add to this appender.</param>
-		/// <remarks>
-		/// <para>
-		/// If the specified <see cref="IAppender" /> is already in the list of
-		/// appenders, then it won't be added again.
-		/// </para>
-		/// </remarks>
-		public virtual void AddAppender(IAppender newAppender) 
-		{
-			if (newAppender == null)
-			{
-				throw new ArgumentNullException("newAppender");
-			}
-			lock(this)
-			{
-				if (m_appenderAttachedImpl == null) 
-				{
-					m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
-				}
-				m_appenderAttachedImpl.AddAppender(newAppender);
-			}
-		}
+    /// <summary>
+    /// Adds an <see cref="IAppender" /> to the list of appenders of this
+    /// instance.
+    /// </summary>
+    /// <param name="newAppender">The <see cref="IAppender" /> to add to this appender.</param>
+    /// <remarks>
+    /// <para>
+    /// If the specified <see cref="IAppender" /> is already in the list of
+    /// appenders, then it won't be added again.
+    /// </para>
+    /// </remarks>
+    public virtual void AddAppender(IAppender newAppender)
+    {
+      if (newAppender == null)
+      {
+        throw new ArgumentNullException("newAppender");
+      }
+      lock (this)
+      {
+        if (m_appenderAttachedImpl == null)
+        {
+          m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
+        }
+        m_appenderAttachedImpl.AddAppender(newAppender);
+      }
+    }
 
-		/// <summary>
-		/// Gets the appenders contained in this appender as an 
-		/// <see cref="System.Collections.ICollection"/>.
-		/// </summary>
-		/// <remarks>
-		/// If no appenders can be found, then an <see cref="EmptyCollection"/> 
-		/// is returned.
-		/// </remarks>
-		/// <returns>
-		/// A collection of the appenders in this appender.
-		/// </returns>
-		public virtual AppenderCollection Appenders
-		{
-			get
-			{
-				lock(this)
-				{
-					if (m_appenderAttachedImpl == null)
-					{
-						return AppenderCollection.EmptyCollection;
-					}
-					else 
-					{
-						return m_appenderAttachedImpl.Appenders;
-					}
-				}
-			}
-		}
+    /// <summary>
+    /// Gets the appenders contained in this appender as an 
+    /// <see cref="System.Collections.ICollection"/>.
+    /// </summary>
+    /// <remarks>
+    /// If no appenders can be found, then an <see cref="EmptyCollection"/> 
+    /// is returned.
+    /// </remarks>
+    /// <returns>
+    /// A collection of the appenders in this appender.
+    /// </returns>
+    public virtual AppenderCollection Appenders
+    {
+      get
+      {
+        lock (this)
+        {
+          if (m_appenderAttachedImpl == null)
+          {
+            return AppenderCollection.EmptyCollection;
+          }
+          else
+          {
+            return m_appenderAttachedImpl.Appenders;
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Looks for the appender with the specified name.
-		/// </summary>
-		/// <param name="name">The name of the appender to lookup.</param>
-		/// <returns>
-		/// The appender with the specified name, or <c>null</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Get the named appender attached to this buffering appender.
-		/// </para>
-		/// </remarks>
-		public virtual IAppender GetAppender(string name) 
-		{
-			lock(this)
-			{
-				if (m_appenderAttachedImpl == null || name == null)
-				{
-					return null;
-				}
+    /// <summary>
+    /// Looks for the appender with the specified name.
+    /// </summary>
+    /// <param name="name">The name of the appender to lookup.</param>
+    /// <returns>
+    /// The appender with the specified name, or <c>null</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Get the named appender attached to this buffering appender.
+    /// </para>
+    /// </remarks>
+    public virtual IAppender GetAppender(string name)
+    {
+      lock (this)
+      {
+        if (m_appenderAttachedImpl == null || name == null)
+        {
+          return null;
+        }
 
-				return m_appenderAttachedImpl.GetAppender(name);
-			}
-		}
+        return m_appenderAttachedImpl.GetAppender(name);
+      }
+    }
 
-		/// <summary>
-		/// Removes all previously added appenders from this appender.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is useful when re-reading configuration information.
-		/// </para>
-		/// </remarks>
-		public virtual void RemoveAllAppenders() 
-		{
-			lock(this)
-			{
-				if (m_appenderAttachedImpl != null) 
-				{
-					m_appenderAttachedImpl.RemoveAllAppenders();
-					m_appenderAttachedImpl = null;
-				}
-			}
-		}
+    /// <summary>
+    /// Removes all previously added appenders from this appender.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is useful when re-reading configuration information.
+    /// </para>
+    /// </remarks>
+    public virtual void RemoveAllAppenders()
+    {
+      lock (this)
+      {
+        if (m_appenderAttachedImpl != null)
+        {
+          m_appenderAttachedImpl.RemoveAllAppenders();
+          m_appenderAttachedImpl = null;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Removes the specified appender from the list of appenders.
-		/// </summary>
-		/// <param name="appender">The appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </remarks>
-		public virtual IAppender RemoveAppender(IAppender appender) 
-		{
-			lock(this)
-			{
-				if (appender != null && m_appenderAttachedImpl != null) 
-				{
-					return m_appenderAttachedImpl.RemoveAppender(appender);
-				}
-			}
-			return null;
-		}
+    /// <summary>
+    /// Removes the specified appender from the list of appenders.
+    /// </summary>
+    /// <param name="appender">The appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </remarks>
+    public virtual IAppender RemoveAppender(IAppender appender)
+    {
+      lock (this)
+      {
+        if (appender != null && m_appenderAttachedImpl != null)
+        {
+          return m_appenderAttachedImpl.RemoveAppender(appender);
+        }
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Removes the appender with the specified name from the list of appenders.
-		/// </summary>
-		/// <param name="name">The name of the appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </remarks>
-		public virtual IAppender RemoveAppender(string name) 
-		{
-			lock(this)
-			{
-				if (name != null && m_appenderAttachedImpl != null)
-				{
-					return m_appenderAttachedImpl.RemoveAppender(name);
-				}
-			}
-			return null;
-		}
-  
-		#endregion Implementation of IAppenderAttachable
+    /// <summary>
+    /// Removes the appender with the specified name from the list of appenders.
+    /// </summary>
+    /// <param name="name">The name of the appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </remarks>
+    public virtual IAppender RemoveAppender(string name)
+    {
+      lock (this)
+      {
+        if (name != null && m_appenderAttachedImpl != null)
+        {
+          return m_appenderAttachedImpl.RemoveAppender(name);
+        }
+      }
+      return null;
+    }
 
-		#region Private Instance Fields
+    #endregion Implementation of IAppenderAttachable
 
-		/// <summary>
-		/// Implementation of the <see cref="IAppenderAttachable"/> interface
-		/// </summary>
-		private AppenderAttachedImpl m_appenderAttachedImpl;
+    #region Private Instance Fields
 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// Implementation of the <see cref="IAppenderAttachable"/> interface
+    /// </summary>
+    private AppenderAttachedImpl m_appenderAttachedImpl;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Appender/ColoredConsoleAppender.cs b/src/log4net/Appender/ColoredConsoleAppender.cs
index cbcc875..00a07d2 100644
--- a/src/log4net/Appender/ColoredConsoleAppender.cs
+++ b/src/log4net/Appender/ColoredConsoleAppender.cs
@@ -38,627 +38,627 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends logging events to the console.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// ColoredConsoleAppender appends log events to the standard output stream
-	/// or the error output stream using a layout specified by the 
-	/// user. It also allows the color of a specific type of message to be set.
-	/// </para>
-	/// <para>
-	/// By default, all output is written to the console's standard output stream.
-	/// The <see cref="Target"/> property can be set to direct the output to the
-	/// error stream.
-	/// </para>
-	/// <para>
-	/// NOTE: This appender writes directly to the application's attached console
-	/// not to the <c>System.Console.Out</c> or <c>System.Console.Error</c> <c>TextWriter</c>.
-	/// The <c>System.Console.Out</c> and <c>System.Console.Error</c> streams can be
-	/// programmatically redirected (for example NUnit does this to capture program output).
-	/// This appender will ignore these redirections because it needs to use Win32
-	/// API calls to colorize the output. To respect these redirections the <see cref="ConsoleAppender"/>
-	/// must be used.
-	/// </para>
-	/// <para>
-	/// When configuring the colored console appender, mapping should be
-	/// specified to map a logging level to a color. For example:
-	/// </para>
-	/// <code lang="XML" escaped="true">
-	/// <mapping>
-	/// 	<level value="ERROR" />
-	/// 	<foreColor value="White" />
-	/// 	<backColor value="Red, HighIntensity" />
-	/// </mapping>
-	/// <mapping>
-	/// 	<level value="DEBUG" />
-	/// 	<backColor value="Green" />
-	/// </mapping>
-	/// </code>
-	/// <para>
-	/// The Level is the standard log4net logging level and ForeColor and BackColor can be any
-	/// combination of the following values:
-	/// <list type="bullet">
-	/// <item><term>Blue</term><description></description></item>
-	/// <item><term>Green</term><description></description></item>
-	/// <item><term>Red</term><description></description></item>
-	/// <item><term>White</term><description></description></item>
-	/// <item><term>Yellow</term><description></description></item>
-	/// <item><term>Purple</term><description></description></item>
-	/// <item><term>Cyan</term><description></description></item>
-	/// <item><term>HighIntensity</term><description></description></item>
-	/// </list>
-	/// </para>
-	/// </remarks>
-	/// <author>Rick Hobbs</author>
-	/// <author>Nicko Cadell</author>
-	public class ColoredConsoleAppender : AppenderSkeleton
-	{
-		#region Colors Enum
+  /// <summary>
+  /// Appends logging events to the console.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// ColoredConsoleAppender appends log events to the standard output stream
+  /// or the error output stream using a layout specified by the 
+  /// user. It also allows the color of a specific type of message to be set.
+  /// </para>
+  /// <para>
+  /// By default, all output is written to the console's standard output stream.
+  /// The <see cref="Target"/> property can be set to direct the output to the
+  /// error stream.
+  /// </para>
+  /// <para>
+  /// NOTE: This appender writes directly to the application's attached console
+  /// not to the <c>System.Console.Out</c> or <c>System.Console.Error</c> <c>TextWriter</c>.
+  /// The <c>System.Console.Out</c> and <c>System.Console.Error</c> streams can be
+  /// programmatically redirected (for example NUnit does this to capture program output).
+  /// This appender will ignore these redirections because it needs to use Win32
+  /// API calls to colorize the output. To respect these redirections the <see cref="ConsoleAppender"/>
+  /// must be used.
+  /// </para>
+  /// <para>
+  /// When configuring the colored console appender, mapping should be
+  /// specified to map a logging level to a color. For example:
+  /// </para>
+  /// <code lang="XML" escaped="true">
+  /// <mapping>
+  ///   <level value="ERROR" />
+  ///   <foreColor value="White" />
+  ///   <backColor value="Red, HighIntensity" />
+  /// </mapping>
+  /// <mapping>
+  ///   <level value="DEBUG" />
+  ///   <backColor value="Green" />
+  /// </mapping>
+  /// </code>
+  /// <para>
+  /// The Level is the standard log4net logging level and ForeColor and BackColor can be any
+  /// combination of the following values:
+  /// <list type="bullet">
+  /// <item><term>Blue</term><description></description></item>
+  /// <item><term>Green</term><description></description></item>
+  /// <item><term>Red</term><description></description></item>
+  /// <item><term>White</term><description></description></item>
+  /// <item><term>Yellow</term><description></description></item>
+  /// <item><term>Purple</term><description></description></item>
+  /// <item><term>Cyan</term><description></description></item>
+  /// <item><term>HighIntensity</term><description></description></item>
+  /// </list>
+  /// </para>
+  /// </remarks>
+  /// <author>Rick Hobbs</author>
+  /// <author>Nicko Cadell</author>
+  public class ColoredConsoleAppender : AppenderSkeleton
+  {
+    #region Colors Enum
 
-		/// <summary>
-		/// The enum of possible color values for use with the color mapping method
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The following flags can be combined together to
-		/// form the colors.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ColoredConsoleAppender" />
-		[Flags]
-		public enum Colors : int
-		{
-			/// <summary>
-			/// color is blue
-			/// </summary>
-			Blue = 0x0001,
+    /// <summary>
+    /// The enum of possible color values for use with the color mapping method
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The following flags can be combined together to
+    /// form the colors.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ColoredConsoleAppender" />
+    [Flags]
+    public enum Colors : int
+    {
+      /// <summary>
+      /// color is blue
+      /// </summary>
+      Blue = 0x0001,
 
-			/// <summary>
-			/// color is green
-			/// </summary>
-			Green = 0x0002,
+      /// <summary>
+      /// color is green
+      /// </summary>
+      Green = 0x0002,
 
-			/// <summary>
-			/// color is red
-			/// </summary>
-			Red = 0x0004,
+      /// <summary>
+      /// color is red
+      /// </summary>
+      Red = 0x0004,
 
-			/// <summary>
-			/// color is white
-			/// </summary>
-			White = Blue | Green | Red,
+      /// <summary>
+      /// color is white
+      /// </summary>
+      White = Blue | Green | Red,
 
-			/// <summary>
-			/// color is yellow
-			/// </summary>
-			Yellow = Red | Green,
+      /// <summary>
+      /// color is yellow
+      /// </summary>
+      Yellow = Red | Green,
 
-			/// <summary>
-			/// color is purple
-			/// </summary>
-			Purple = Red | Blue,
+      /// <summary>
+      /// color is purple
+      /// </summary>
+      Purple = Red | Blue,
 
-			/// <summary>
-			/// color is cyan
-			/// </summary>
-			Cyan = Green | Blue,
+      /// <summary>
+      /// color is cyan
+      /// </summary>
+      Cyan = Green | Blue,
 
-			/// <summary>
-			/// color is intensified
-			/// </summary>
-			HighIntensity = 0x0008,
-		}
+      /// <summary>
+      /// color is intensified
+      /// </summary>
+      HighIntensity = 0x0008,
+    }
 
-		#endregion // Colors Enum
+    #endregion // Colors Enum
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ColoredConsoleAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// The instance of the <see cref="ColoredConsoleAppender" /> class is set up to write 
-		/// to the standard output stream.
-		/// </remarks>
-		public ColoredConsoleAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ColoredConsoleAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// The instance of the <see cref="ColoredConsoleAppender" /> class is set up to write 
+    /// to the standard output stream.
+    /// </remarks>
+    public ColoredConsoleAppender()
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ColoredConsoleAppender" /> class
-		/// with the specified layout.
-		/// </summary>
-		/// <param name="layout">the layout to use for this appender</param>
-		/// <remarks>
-		/// The instance of the <see cref="ColoredConsoleAppender" /> class is set up to write 
-		/// to the standard output stream.
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout property")]
-		public ColoredConsoleAppender(ILayout layout) : this(layout, false)
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ColoredConsoleAppender" /> class
+    /// with the specified layout.
+    /// </summary>
+    /// <param name="layout">the layout to use for this appender</param>
+    /// <remarks>
+    /// The instance of the <see cref="ColoredConsoleAppender" /> class is set up to write 
+    /// to the standard output stream.
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout property")]
+    public ColoredConsoleAppender(ILayout layout) : this(layout, false)
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ColoredConsoleAppender" /> class
-		/// with the specified layout.
-		/// </summary>
-		/// <param name="layout">the layout to use for this appender</param>
-		/// <param name="writeToErrorStream">flag set to <c>true</c> to write to the console error stream</param>
-		/// <remarks>
-		/// When <paramref name="writeToErrorStream" /> is set to <c>true</c>, output is written to
-		/// the standard error output stream.  Otherwise, output is written to the standard
-		/// output stream.
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout & Target properties")]
-		public ColoredConsoleAppender(ILayout layout, bool writeToErrorStream) 
-		{
-			Layout = layout;
-			m_writeToErrorStream = writeToErrorStream;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ColoredConsoleAppender" /> class
+    /// with the specified layout.
+    /// </summary>
+    /// <param name="layout">the layout to use for this appender</param>
+    /// <param name="writeToErrorStream">flag set to <c>true</c> to write to the console error stream</param>
+    /// <remarks>
+    /// When <paramref name="writeToErrorStream" /> is set to <c>true</c>, output is written to
+    /// the standard error output stream.  Otherwise, output is written to the standard
+    /// output stream.
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout & Target properties")]
+    public ColoredConsoleAppender(ILayout layout, bool writeToErrorStream)
+    {
+      Layout = layout;
+      m_writeToErrorStream = writeToErrorStream;
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </summary>
-		/// <value>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </para>
-		/// </remarks>
-		public virtual string Target
-		{
-			get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
-			set
-			{
-				string v = value.Trim();
-				
-				if (string.Compare(ConsoleError, v, true, CultureInfo.InvariantCulture) == 0) 
-				{
-					m_writeToErrorStream = true;
-				} 
-				else 
-				{
-					m_writeToErrorStream = false;
-				}
-			}
-		}
+    /// <summary>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </summary>
+    /// <value>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </para>
+    /// </remarks>
+    public virtual string Target
+    {
+      get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
+      set
+      {
+        string v = value.Trim();
 
-		/// <summary>
-		/// Add a mapping of level to color - done by the config file
-		/// </summary>
-		/// <param name="mapping">The mapping to add</param>
-		/// <remarks>
-		/// <para>
-		/// Add a <see cref="LevelColors"/> mapping to this appender.
-		/// Each mapping defines the foreground and background colors
-		/// for a level.
-		/// </para>
-		/// </remarks>
-		public void AddMapping(LevelColors mapping)
-		{
-			m_levelMapping.Add(mapping);
-		}
+        if (string.Compare(ConsoleError, v, true, CultureInfo.InvariantCulture) == 0)
+        {
+          m_writeToErrorStream = true;
+        }
+        else
+        {
+          m_writeToErrorStream = false;
+        }
+      }
+    }
 
-		#endregion // Public Instance Properties
+    /// <summary>
+    /// Add a mapping of level to color - done by the config file
+    /// </summary>
+    /// <param name="mapping">The mapping to add</param>
+    /// <remarks>
+    /// <para>
+    /// Add a <see cref="LevelColors"/> mapping to this appender.
+    /// Each mapping defines the foreground and background colors
+    /// for a level.
+    /// </para>
+    /// </remarks>
+    public void AddMapping(LevelColors mapping)
+    {
+      m_levelMapping.Add(mapping);
+    }
 
-		#region Override implementation of AppenderSkeleton
+    #endregion // Public Instance Properties
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the event to the console.
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
+    #region Override implementation of AppenderSkeleton
+
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the event to the console.
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
-		[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
-		protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
-		{
-			if (m_consoleOutputWriter != null)
-			{
-				IntPtr consoleHandle = IntPtr.Zero;
-				if (m_writeToErrorStream)
-				{
-					// Write to the error stream
-					consoleHandle = GetStdHandle(STD_ERROR_HANDLE);
-				}
-				else
-				{
-					// Write to the output stream
-					consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
-				}
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
+    {
+      if (m_consoleOutputWriter != null)
+      {
+        IntPtr consoleHandle = IntPtr.Zero;
+        if (m_writeToErrorStream)
+        {
+          // Write to the error stream
+          consoleHandle = GetStdHandle(STD_ERROR_HANDLE);
+        }
+        else
+        {
+          // Write to the output stream
+          consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
+        }
 
-				// Default to white on black
-				ushort colorInfo = (ushort)Colors.White;
+        // Default to white on black
+        ushort colorInfo = (ushort)Colors.White;
 
-				// see if there is a specified lookup
-				LevelColors levelColors = m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
-				if (levelColors != null)
-				{
-					colorInfo = levelColors.CombinedColor;
-				}
+        // see if there is a specified lookup
+        LevelColors levelColors = m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
+        if (levelColors != null)
+        {
+          colorInfo = levelColors.CombinedColor;
+        }
 
-				// Render the event to a string
-				string strLoggingMessage = RenderLoggingEvent(loggingEvent);
+        // Render the event to a string
+        string strLoggingMessage = RenderLoggingEvent(loggingEvent);
 
-				// get the current console color - to restore later
-				CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
-				GetConsoleScreenBufferInfo(consoleHandle, out bufferInfo);
+        // get the current console color - to restore later
+        CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
+        GetConsoleScreenBufferInfo(consoleHandle, out bufferInfo);
 
-				// set the console colors
-				SetConsoleTextAttribute(consoleHandle, colorInfo);
+        // set the console colors
+        SetConsoleTextAttribute(consoleHandle, colorInfo);
 
-				// Using WriteConsoleW seems to be unreliable.
-				// If a large buffer is written, say 15,000 chars
-				// Followed by a larger buffer, say 20,000 chars
-				// then WriteConsoleW will fail, last error 8
-				// 'Not enough storage is available to process this command.'
-				// 
-				// Although the documentation states that the buffer must
-				// be less that 64KB (i.e. 32,000 WCHARs) the longest string
-				// that I can write out a the first call to WriteConsoleW
-				// is only 30,704 chars.
-				//
-				// Unlike the WriteFile API the WriteConsoleW method does not 
-				// seem to be able to partially write out from the input buffer.
-				// It does have a lpNumberOfCharsWritten parameter, but this is
-				// either the length of the input buffer if any output was written,
-				// or 0 when an error occurs.
-				//
-				// All results above were observed on Windows XP SP1 running
-				// .NET runtime 1.1 SP1.
-				//
-				// Old call to WriteConsoleW:
-				//
-				// WriteConsoleW(
-				//     consoleHandle,
-				//     strLoggingMessage,
-				//     (UInt32)strLoggingMessage.Length,
-				//     out (UInt32)ignoreWrittenCount,
-				//     IntPtr.Zero);
-				//
-				// Instead of calling WriteConsoleW we use WriteFile which 
-				// handles large buffers correctly. Because WriteFile does not
-				// handle the codepage conversion as WriteConsoleW does we 
-				// need to use a System.IO.StreamWriter with the appropriate
-				// Encoding. The WriteFile calls are wrapped up in the
-				// System.IO.__ConsoleStream internal class obtained through
-				// the System.Console.OpenStandardOutput method.
-				//
-				// See the ActivateOptions method below for the code that
-				// retrieves and wraps the stream.
+        // Using WriteConsoleW seems to be unreliable.
+        // If a large buffer is written, say 15,000 chars
+        // Followed by a larger buffer, say 20,000 chars
+        // then WriteConsoleW will fail, last error 8
+        // 'Not enough storage is available to process this command.'
+        // 
+        // Although the documentation states that the buffer must
+        // be less that 64KB (i.e. 32,000 WCHARs) the longest string
+        // that I can write out a the first call to WriteConsoleW
+        // is only 30,704 chars.
+        //
+        // Unlike the WriteFile API the WriteConsoleW method does not 
+        // seem to be able to partially write out from the input buffer.
+        // It does have a lpNumberOfCharsWritten parameter, but this is
+        // either the length of the input buffer if any output was written,
+        // or 0 when an error occurs.
+        //
+        // All results above were observed on Windows XP SP1 running
+        // .NET runtime 1.1 SP1.
+        //
+        // Old call to WriteConsoleW:
+        //
+        // WriteConsoleW(
+        //     consoleHandle,
+        //     strLoggingMessage,
+        //     (UInt32)strLoggingMessage.Length,
+        //     out (UInt32)ignoreWrittenCount,
+        //     IntPtr.Zero);
+        //
+        // Instead of calling WriteConsoleW we use WriteFile which 
+        // handles large buffers correctly. Because WriteFile does not
+        // handle the codepage conversion as WriteConsoleW does we 
+        // need to use a System.IO.StreamWriter with the appropriate
+        // Encoding. The WriteFile calls are wrapped up in the
+        // System.IO.__ConsoleStream internal class obtained through
+        // the System.Console.OpenStandardOutput method.
+        //
+        // See the ActivateOptions method below for the code that
+        // retrieves and wraps the stream.
 
 
-				// The windows console uses ScrollConsoleScreenBuffer internally to
-				// scroll the console buffer when the display buffer of the console
-				// has been used up. ScrollConsoleScreenBuffer fills the area uncovered
-				// by moving the current content with the background color 
-				// currently specified on the console. This means that it fills the
-				// whole line in front of the cursor position with the current 
-				// background color.
-				// This causes an issue when writing out text with a non default
-				// background color. For example; We write a message with a Blue
-				// background color and the scrollable area of the console is full.
-				// When we write the newline at the end of the message the console
-				// needs to scroll the buffer to make space available for the new line.
-				// The ScrollConsoleScreenBuffer internals will fill the newly created
-				// space with the current background color: Blue.
-				// We then change the console color back to default (White text on a
-				// Black background). We write some text to the console, the text is
-				// written correctly in White with a Black background, however the
-				// remainder of the line still has a Blue background.
-				// 
-				// This causes a disjointed appearance to the output where the background
-				// colors change.
-				//
-				// This can be remedied by restoring the console colors before causing
-				// the buffer to scroll, i.e. before writing the last newline. This does
-				// assume that the rendered message will end with a newline.
-				//
-				// Therefore we identify a trailing newline in the message and don't
-				// write this to the output, then we restore the console color and write
-				// a newline. Note that we must AutoFlush before we restore the console
-				// color otherwise we will have no effect.
-				//
-				// There will still be a slight artefact for the last line of the message
-				// will have the background extended to the end of the line, however this
-				// is unlikely to cause any user issues.
-				//
-				// Note that none of the above is visible while the console buffer is scrollable
-				// within the console window viewport, the effects only arise when the actual
-				// buffer is full and needs to be scrolled.
+        // The windows console uses ScrollConsoleScreenBuffer internally to
+        // scroll the console buffer when the display buffer of the console
+        // has been used up. ScrollConsoleScreenBuffer fills the area uncovered
+        // by moving the current content with the background color 
+        // currently specified on the console. This means that it fills the
+        // whole line in front of the cursor position with the current 
+        // background color.
+        // This causes an issue when writing out text with a non default
+        // background color. For example; We write a message with a Blue
+        // background color and the scrollable area of the console is full.
+        // When we write the newline at the end of the message the console
+        // needs to scroll the buffer to make space available for the new line.
+        // The ScrollConsoleScreenBuffer internals will fill the newly created
+        // space with the current background color: Blue.
+        // We then change the console color back to default (White text on a
+        // Black background). We write some text to the console, the text is
+        // written correctly in White with a Black background, however the
+        // remainder of the line still has a Blue background.
+        // 
+        // This causes a disjointed appearance to the output where the background
+        // colors change.
+        //
+        // This can be remedied by restoring the console colors before causing
+        // the buffer to scroll, i.e. before writing the last newline. This does
+        // assume that the rendered message will end with a newline.
+        //
+        // Therefore we identify a trailing newline in the message and don't
+        // write this to the output, then we restore the console color and write
+        // a newline. Note that we must AutoFlush before we restore the console
+        // color otherwise we will have no effect.
+        //
+        // There will still be a slight artefact for the last line of the message
+        // will have the background extended to the end of the line, however this
+        // is unlikely to cause any user issues.
+        //
+        // Note that none of the above is visible while the console buffer is scrollable
+        // within the console window viewport, the effects only arise when the actual
+        // buffer is full and needs to be scrolled.
 
-				char[] messageCharArray = strLoggingMessage.ToCharArray();
-				int arrayLength = messageCharArray.Length;
-				bool appendNewline = false;
+        char[] messageCharArray = strLoggingMessage.ToCharArray();
+        int arrayLength = messageCharArray.Length;
+        bool appendNewline = false;
 
-				// Trim off last newline, if it exists
-				if (arrayLength > 1 && messageCharArray[arrayLength-2] == '\r' && messageCharArray[arrayLength-1] == '\n')
-				{
-					arrayLength -= 2;
-					appendNewline = true;
-				}
+        // Trim off last newline, if it exists
+        if (arrayLength > 1 && messageCharArray[arrayLength - 2] == '\r' && messageCharArray[arrayLength - 1] == '\n')
+        {
+          arrayLength -= 2;
+          appendNewline = true;
+        }
 
-				// Write to the output stream
-				m_consoleOutputWriter.Write(messageCharArray, 0, arrayLength);
+        // Write to the output stream
+        m_consoleOutputWriter.Write(messageCharArray, 0, arrayLength);
 
-				// Restore the console back to its previous color scheme
-				SetConsoleTextAttribute(consoleHandle, bufferInfo.wAttributes);
+        // Restore the console back to its previous color scheme
+        SetConsoleTextAttribute(consoleHandle, bufferInfo.wAttributes);
 
-				if (appendNewline)
-				{
-					// Write the newline, after changing the color scheme
-					m_consoleOutputWriter.Write(s_windowsNewline, 0, 2);
-				}
-			}
-		}
+        if (appendNewline)
+        {
+          // Write the newline, after changing the color scheme
+          m_consoleOutputWriter.Write(s_windowsNewline, 0, 2);
+        }
+      }
+    }
 
-		private static readonly char[] s_windowsNewline = {'\r', '\n'};
+    private static readonly char[] s_windowsNewline = { '\r', '\n' };
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Initialize the options for this appender
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initialize the level to color mappings set on this appender.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Initialize the options for this appender
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initialize the level to color mappings set on this appender.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
-		[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
-			m_levelMapping.ActivateOptions();
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
+      m_levelMapping.ActivateOptions();
 
-			System.IO.Stream consoleOutputStream = null;
+      System.IO.Stream consoleOutputStream = null;
 
-			// Use the Console methods to open a Stream over the console std handle
-			if (m_writeToErrorStream)
-			{
-				// Write to the error stream
-				consoleOutputStream = Console.OpenStandardError();
-			}
-			else
-			{
-				// Write to the output stream
-				consoleOutputStream = Console.OpenStandardOutput();
-			}
+      // Use the Console methods to open a Stream over the console std handle
+      if (m_writeToErrorStream)
+      {
+        // Write to the error stream
+        consoleOutputStream = Console.OpenStandardError();
+      }
+      else
+      {
+        // Write to the output stream
+        consoleOutputStream = Console.OpenStandardOutput();
+      }
 
-			// Lookup the codepage encoding for the console
-			System.Text.Encoding consoleEncoding = System.Text.Encoding.GetEncoding(GetConsoleOutputCP());
+      // Lookup the codepage encoding for the console
+      System.Text.Encoding consoleEncoding = System.Text.Encoding.GetEncoding(GetConsoleOutputCP());
 
-			// Create a writer around the console stream
-			m_consoleOutputWriter = new System.IO.StreamWriter(consoleOutputStream, consoleEncoding, 0x100);
+      // Create a writer around the console stream
+      m_consoleOutputWriter = new System.IO.StreamWriter(consoleOutputStream, consoleEncoding, 0x100);
 
-			m_consoleOutputWriter.AutoFlush = true;
+      m_consoleOutputWriter.AutoFlush = true;
 
-			// SuppressFinalize on m_consoleOutputWriter because all it will do is flush
-			// and close the file handle. Because we have set AutoFlush the additional flush
-			// is not required. The console file handle should not be closed, so we don't call
-			// Dispose, Close or the finalizer.
-			GC.SuppressFinalize(m_consoleOutputWriter);
-		}
+      // SuppressFinalize on m_consoleOutputWriter because all it will do is flush
+      // and close the file handle. Because we have set AutoFlush the additional flush
+      // is not required. The console file handle should not be closed, so we don't call
+      // Dispose, Close or the finalizer.
+      GC.SuppressFinalize(m_consoleOutputWriter);
+    }
 
-		#endregion // Override implementation of AppenderSkeleton
+    #endregion // Override implementation of AppenderSkeleton
 
-		#region Public Static Fields
+    #region Public Static Fields
 
-		/// <summary>
-		/// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleOut = "Console.Out";
+    /// <summary>
+    /// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleOut = "Console.Out";
 
-		/// <summary>
-		/// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleError = "Console.Error";
+    /// <summary>
+    /// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleError = "Console.Error";
 
-		#endregion // Public Static Fields
+    #endregion // Public Static Fields
 
-		#region Private Instances Fields
+    #region Private Instances Fields
 
-		/// <summary>
-		/// Flag to write output to the error stream rather than the standard output stream
-		/// </summary>
-		private bool m_writeToErrorStream = false;
+    /// <summary>
+    /// Flag to write output to the error stream rather than the standard output stream
+    /// </summary>
+    private bool m_writeToErrorStream = false;
 
-		/// <summary>
-		/// Mapping from level object to color value
-		/// </summary>
-		private LevelMapping m_levelMapping = new LevelMapping();
+    /// <summary>
+    /// Mapping from level object to color value
+    /// </summary>
+    private LevelMapping m_levelMapping = new LevelMapping();
 
-		/// <summary>
-		/// The console output stream writer to write to
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This writer is not thread safe.
-		/// </para>
-		/// </remarks>
-		private System.IO.StreamWriter m_consoleOutputWriter = null;
+    /// <summary>
+    /// The console output stream writer to write to
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This writer is not thread safe.
+    /// </para>
+    /// </remarks>
+    private System.IO.StreamWriter m_consoleOutputWriter = null;
 
-		#endregion // Private Instances Fields
+    #endregion // Private Instances Fields
 
-		#region Win32 Methods
+    #region Win32 Methods
 
-		[DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
-		private static extern int GetConsoleOutputCP();
+    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+    private static extern int GetConsoleOutputCP();
 
-		[DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
-		private static extern bool SetConsoleTextAttribute(
-			IntPtr consoleHandle,
-			ushort attributes);
+    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+    private static extern bool SetConsoleTextAttribute(
+      IntPtr consoleHandle,
+      ushort attributes);
 
-		[DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
-		private static extern bool GetConsoleScreenBufferInfo(
-			IntPtr consoleHandle,
-			out CONSOLE_SCREEN_BUFFER_INFO bufferInfo);
+    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+    private static extern bool GetConsoleScreenBufferInfo(
+      IntPtr consoleHandle,
+      out CONSOLE_SCREEN_BUFFER_INFO bufferInfo);
 
-//		[DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
-//		private static extern bool WriteConsoleW(
-//			IntPtr hConsoleHandle,
-//			[MarshalAs(UnmanagedType.LPWStr)] string strBuffer,
-//			UInt32 bufferLen,
-//			out UInt32 written,
-//			IntPtr reserved);
+    //    [DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
+    //    private static extern bool WriteConsoleW(
+    //      IntPtr hConsoleHandle,
+    //      [MarshalAs(UnmanagedType.LPWStr)] string strBuffer,
+    //      UInt32 bufferLen,
+    //      out UInt32 written,
+    //      IntPtr reserved);
 
-		//private const UInt32 STD_INPUT_HANDLE = unchecked((UInt32)(-10));
-		private const UInt32 STD_OUTPUT_HANDLE = unchecked((UInt32)(-11));
-		private const UInt32 STD_ERROR_HANDLE = unchecked((UInt32)(-12));
+    //private const UInt32 STD_INPUT_HANDLE = unchecked((UInt32)(-10));
+    private const UInt32 STD_OUTPUT_HANDLE = unchecked((UInt32)(-11));
+    private const UInt32 STD_ERROR_HANDLE = unchecked((UInt32)(-12));
 
-		[DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
-		private static extern IntPtr GetStdHandle(
-			UInt32 type);
+    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
+    private static extern IntPtr GetStdHandle(
+      UInt32 type);
 
-		[StructLayout(LayoutKind.Sequential)]
-		private struct COORD 
-		{
-			public UInt16 x; 
-			public UInt16 y; 
-		}
+    [StructLayout(LayoutKind.Sequential)]
+    private struct COORD
+    {
+      public UInt16 x;
+      public UInt16 y;
+    }
 
-		[StructLayout(LayoutKind.Sequential)]
-		private struct SMALL_RECT 
-		{
-			public UInt16 Left; 
-			public UInt16 Top; 
-			public UInt16 Right; 
-			public UInt16 Bottom; 
-		}
+    [StructLayout(LayoutKind.Sequential)]
+    private struct SMALL_RECT
+    {
+      public UInt16 Left;
+      public UInt16 Top;
+      public UInt16 Right;
+      public UInt16 Bottom;
+    }
 
-		[StructLayout(LayoutKind.Sequential)]
-		private struct CONSOLE_SCREEN_BUFFER_INFO 
-		{ 
-			public COORD      dwSize; 
-			public COORD      dwCursorPosition; 
-			public ushort     wAttributes; 
-			public SMALL_RECT srWindow; 
-			public COORD      dwMaximumWindowSize; 
-		}
+    [StructLayout(LayoutKind.Sequential)]
+    private struct CONSOLE_SCREEN_BUFFER_INFO
+    {
+      public COORD dwSize;
+      public COORD dwCursorPosition;
+      public ushort wAttributes;
+      public SMALL_RECT srWindow;
+      public COORD dwMaximumWindowSize;
+    }
 
-		#endregion // Win32 Methods
+    #endregion // Win32 Methods
 
-		#region LevelColors LevelMapping Entry
+    #region LevelColors LevelMapping Entry
 
-		/// <summary>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the color it should be displayed as.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Defines the mapping between a level and the color it should be displayed in.
-		/// </para>
-		/// </remarks>
-		public class LevelColors : LevelMappingEntry
-		{
-			private Colors m_foreColor;
-			private Colors m_backColor;
-			private ushort m_combinedColor = 0;
+    /// <summary>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the color it should be displayed as.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defines the mapping between a level and the color it should be displayed in.
+    /// </para>
+    /// </remarks>
+    public class LevelColors : LevelMappingEntry
+    {
+      private Colors m_foreColor;
+      private Colors m_backColor;
+      private ushort m_combinedColor = 0;
 
-			/// <summary>
-			/// The mapped foreground color for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped foreground color for the specified level.
-			/// </para>
-			/// </remarks>
-			public Colors ForeColor
-			{
-				get { return m_foreColor; }
-				set { m_foreColor = value; }
-			}
+      /// <summary>
+      /// The mapped foreground color for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped foreground color for the specified level.
+      /// </para>
+      /// </remarks>
+      public Colors ForeColor
+      {
+        get { return m_foreColor; }
+        set { m_foreColor = value; }
+      }
 
-			/// <summary>
-			/// The mapped background color for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped background color for the specified level.
-			/// </para>
-			/// </remarks>
-			public Colors BackColor
-			{
-				get { return m_backColor; }
-				set { m_backColor = value; }
-			}
+      /// <summary>
+      /// The mapped background color for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped background color for the specified level.
+      /// </para>
+      /// </remarks>
+      public Colors BackColor
+      {
+        get { return m_backColor; }
+        set { m_backColor = value; }
+      }
 
-			/// <summary>
-			/// Initialize the options for the object
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Combine the <see cref="ForeColor"/> and <see cref="BackColor"/> together.
-			/// </para>
-			/// </remarks>
-			public override void ActivateOptions()
-			{
-				base.ActivateOptions();
-				m_combinedColor = (ushort)( (int)m_foreColor + (((int)m_backColor) << 4) );
-			}
+      /// <summary>
+      /// Initialize the options for the object
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Combine the <see cref="ForeColor"/> and <see cref="BackColor"/> together.
+      /// </para>
+      /// </remarks>
+      public override void ActivateOptions()
+      {
+        base.ActivateOptions();
+        m_combinedColor = (ushort)((int)m_foreColor + (((int)m_backColor) << 4));
+      }
 
-			/// <summary>
-			/// The combined <see cref="ForeColor"/> and <see cref="BackColor"/> suitable for 
-			/// setting the console color.
-			/// </summary>
-			internal ushort CombinedColor
-			{
-				get { return m_combinedColor; }
-			}
-		}
+      /// <summary>
+      /// The combined <see cref="ForeColor"/> and <see cref="BackColor"/> suitable for 
+      /// setting the console color.
+      /// </summary>
+      internal ushort CombinedColor
+      {
+        get { return m_combinedColor; }
+      }
+    }
 
-		#endregion // LevelColors LevelMapping Entry
-	}
+    #endregion // LevelColors LevelMapping Entry
+  }
 }
 
 #endif // !CLI_1_0
diff --git a/src/log4net/Appender/ConsoleAppender.cs b/src/log4net/Appender/ConsoleAppender.cs
index 760aace..a7299ee 100644
--- a/src/log4net/Appender/ConsoleAppender.cs
+++ b/src/log4net/Appender/ConsoleAppender.cs
@@ -26,196 +26,196 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends logging events to the console.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// ConsoleAppender appends log events to the standard output stream
-	/// or the error output stream using a layout specified by the 
-	/// user.
-	/// </para>
-	/// <para>
-	/// By default, all output is written to the console's standard output stream.
-	/// The <see cref="Target"/> property can be set to direct the output to the
-	/// error stream.
-	/// </para>
-	/// <para>
-	/// NOTE: This appender writes each message to the <c>System.Console.Out</c> or 
-	/// <c>System.Console.Error</c> that is set at the time the event is appended.
-	/// Therefore it is possible to programmatically redirect the output of this appender 
-	/// (for example NUnit does this to capture program output). While this is the desired
-	/// behavior of this appender it may have security implications in your application. 
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class ConsoleAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Appends logging events to the console.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// ConsoleAppender appends log events to the standard output stream
+  /// or the error output stream using a layout specified by the 
+  /// user.
+  /// </para>
+  /// <para>
+  /// By default, all output is written to the console's standard output stream.
+  /// The <see cref="Target"/> property can be set to direct the output to the
+  /// error stream.
+  /// </para>
+  /// <para>
+  /// NOTE: This appender writes each message to the <c>System.Console.Out</c> or 
+  /// <c>System.Console.Error</c> that is set at the time the event is appended.
+  /// Therefore it is possible to programmatically redirect the output of this appender 
+  /// (for example NUnit does this to capture program output). While this is the desired
+  /// behavior of this appender it may have security implications in your application. 
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class ConsoleAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ConsoleAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// The instance of the <see cref="ConsoleAppender" /> class is set up to write 
-		/// to the standard output stream.
-		/// </remarks>
-		public ConsoleAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ConsoleAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// The instance of the <see cref="ConsoleAppender" /> class is set up to write 
+    /// to the standard output stream.
+    /// </remarks>
+    public ConsoleAppender()
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ConsoleAppender" /> class
-		/// with the specified layout.
-		/// </summary>
-		/// <param name="layout">the layout to use for this appender</param>
-		/// <remarks>
-		/// The instance of the <see cref="ConsoleAppender" /> class is set up to write 
-		/// to the standard output stream.
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout property")]
-		public ConsoleAppender(ILayout layout) : this(layout, false)
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ConsoleAppender" /> class
+    /// with the specified layout.
+    /// </summary>
+    /// <param name="layout">the layout to use for this appender</param>
+    /// <remarks>
+    /// The instance of the <see cref="ConsoleAppender" /> class is set up to write 
+    /// to the standard output stream.
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout property")]
+    public ConsoleAppender(ILayout layout) : this(layout, false)
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ConsoleAppender" /> class
-		/// with the specified layout.
-		/// </summary>
-		/// <param name="layout">the layout to use for this appender</param>
-		/// <param name="writeToErrorStream">flag set to <c>true</c> to write to the console error stream</param>
-		/// <remarks>
-		/// When <paramref name="writeToErrorStream" /> is set to <c>true</c>, output is written to
-		/// the standard error output stream.  Otherwise, output is written to the standard
-		/// output stream.
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout & Target properties")]
-		public ConsoleAppender(ILayout layout, bool writeToErrorStream) 
-		{
-			Layout = layout;
-			m_writeToErrorStream = writeToErrorStream;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ConsoleAppender" /> class
+    /// with the specified layout.
+    /// </summary>
+    /// <param name="layout">the layout to use for this appender</param>
+    /// <param name="writeToErrorStream">flag set to <c>true</c> to write to the console error stream</param>
+    /// <remarks>
+    /// When <paramref name="writeToErrorStream" /> is set to <c>true</c>, output is written to
+    /// the standard error output stream.  Otherwise, output is written to the standard
+    /// output stream.
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout & Target properties")]
+    public ConsoleAppender(ILayout layout, bool writeToErrorStream)
+    {
+      Layout = layout;
+      m_writeToErrorStream = writeToErrorStream;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </summary>
-		/// <value>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </para>
-		/// </remarks>
-		public virtual string Target
-		{
-			get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
-			set
-			{
-				string v = value.Trim();
+    /// <summary>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </summary>
+    /// <value>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </para>
+    /// </remarks>
+    public virtual string Target
+    {
+      get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
+      set
+      {
+        string v = value.Trim();
 
-				if (SystemInfo.EqualsIgnoringCase(ConsoleError, v))
-				{
-					m_writeToErrorStream = true;
-				} 
-				else 
-				{
-					m_writeToErrorStream = false;
-				}
-			}
-		}
+        if (SystemInfo.EqualsIgnoringCase(ConsoleError, v))
+        {
+          m_writeToErrorStream = true;
+        }
+        else
+        {
+          m_writeToErrorStream = false;
+        }
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the event to the console.
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the event to the console.
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
 #if NETCF_1_0
-			// Write to the output stream
-			Console.Write(RenderLoggingEvent(loggingEvent));
+      // Write to the output stream
+      Console.Write(RenderLoggingEvent(loggingEvent));
 #else
-			if (m_writeToErrorStream)
-			{
-				// Write to the error stream
-				Console.Error.Write(RenderLoggingEvent(loggingEvent));
-			}
-			else
-			{
-				// Write to the output stream
-				Console.Write(RenderLoggingEvent(loggingEvent));
-			}
+      if (m_writeToErrorStream)
+      {
+        // Write to the error stream
+        Console.Error.Write(RenderLoggingEvent(loggingEvent));
+      }
+      else
+      {
+        // Write to the output stream
+        Console.Write(RenderLoggingEvent(loggingEvent));
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Public Static Fields
+    #region Public Static Fields
 
-		/// <summary>
-		/// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleOut = "Console.Out";
+    /// <summary>
+    /// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleOut = "Console.Out";
 
-		/// <summary>
-		/// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleError = "Console.Error";
+    /// <summary>
+    /// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleError = "Console.Error";
 
-		#endregion Public Static Fields
+    #endregion Public Static Fields
 
-		#region Private Instances Fields
+    #region Private Instances Fields
 
-		private bool m_writeToErrorStream = false;
+    private bool m_writeToErrorStream = false;
 
-		#endregion Private Instances Fields
-	}
+    #endregion Private Instances Fields
+  }
 }
diff --git a/src/log4net/Appender/DebugAppender.cs b/src/log4net/Appender/DebugAppender.cs
index c1eda99..9aa9e97 100644
--- a/src/log4net/Appender/DebugAppender.cs
+++ b/src/log4net/Appender/DebugAppender.cs
@@ -24,220 +24,220 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends log events to the <see cref="System.Diagnostics.Debug"/> system.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The application configuration file can be used to control what listeners 
-	/// are actually used. See the MSDN documentation for the 
-	/// <see cref="System.Diagnostics.Debug"/> class for details on configuring the
-	/// debug system.
-	/// </para>
-	/// <para>
-	/// Events are written using the <see cref="M:System.Diagnostics.Debug.Write(string,string)"/>
-	/// method. The event's logger name is passed as the value for the category name to the Write method.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class DebugAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Appends log events to the <see cref="System.Diagnostics.Debug"/> system.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The application configuration file can be used to control what listeners 
+  /// are actually used. See the MSDN documentation for the 
+  /// <see cref="System.Diagnostics.Debug"/> class for details on configuring the
+  /// debug system.
+  /// </para>
+  /// <para>
+  /// Events are written using the <see cref="M:System.Diagnostics.Debug.Write(string,string)"/>
+  /// method. The event's logger name is passed as the value for the category name to the Write method.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class DebugAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="DebugAppender" />.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public DebugAppender()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DebugAppender" />.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public DebugAppender()
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="DebugAppender" /> 
-		/// with a specified layout.
-		/// </summary>
-		/// <param name="layout">The layout to use with this appender.</param>
-		/// <remarks>
-		/// <para>
-		/// Obsolete constructor.
-		/// </para>
-		/// </remarks>
-		[System.Obsolete("Instead use the default constructor and set the Layout property")]
-		public DebugAppender(ILayout layout)
-		{
-			Layout = layout;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DebugAppender" /> 
+    /// with a specified layout.
+    /// </summary>
+    /// <param name="layout">The layout to use with this appender.</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [System.Obsolete("Instead use the default constructor and set the Layout property")]
+    public DebugAppender(ILayout layout)
+    {
+      Layout = layout;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
-		
+    #region Public Instance Properties
+
 #if !NETSTANDARD1_3 // System.Diagnostics.Debug has no Flush() in netstandard1.3
-		/// <summary>
-		/// Gets or sets a value that indicates whether the appender will 
-		/// flush at the end of each write.
-		/// </summary>
-		/// <remarks>
-		/// <para>The default behavior is to flush at the end of each 
-		/// write. If the option is set to<c>false</c>, then the underlying 
-		/// stream can defer writing to physical medium to a later time. 
-		/// </para>
-		/// <para>
-		/// Avoiding the flush operation at the end of each append results 
-		/// in a performance gain of 10 to 20 percent. However, there is safety
-		/// trade-off involved in skipping flushing. Indeed, when flushing is
-		/// skipped, then it is likely that the last few log events will not
-		/// be recorded on disk when the application exits. This is a high
-		/// price to pay even for a 20% performance gain.
-		/// </para>
-		/// </remarks>
-		public bool ImmediateFlush
-		{
-			get { return m_immediateFlush; }
-			set { m_immediateFlush = value; }
-		}
+    /// <summary>
+    /// Gets or sets a value that indicates whether the appender will 
+    /// flush at the end of each write.
+    /// </summary>
+    /// <remarks>
+    /// <para>The default behavior is to flush at the end of each 
+    /// write. If the option is set to<c>false</c>, then the underlying 
+    /// stream can defer writing to physical medium to a later time. 
+    /// </para>
+    /// <para>
+    /// Avoiding the flush operation at the end of each append results 
+    /// in a performance gain of 10 to 20 percent. However, there is safety
+    /// trade-off involved in skipping flushing. Indeed, when flushing is
+    /// skipped, then it is likely that the last few log events will not
+    /// be recorded on disk when the application exits. This is a high
+    /// price to pay even for a 20% performance gain.
+    /// </para>
+    /// </remarks>
+    public bool ImmediateFlush
+    {
+      get { return m_immediateFlush; }
+      set { m_immediateFlush = value; }
+    }
 #endif // !NETSTANDARD1_3
 
-        /// <summary>
-        /// Formats the category parameter sent to the Debug method.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Defaults to a <see cref="Layout.PatternLayout"/> with %logger as the pattern which will use the logger name of the current 
-        /// <see cref="LoggingEvent"/> as the category parameter.
-        /// </para>
-        /// <para>
-        /// </para> 
-        /// </remarks>
-        public PatternLayout Category
-        {
-            get { return m_category; }
-            set { m_category = value; }
-        }
- 
-		#endregion Public Instance Properties
+    /// <summary>
+    /// Formats the category parameter sent to the Debug method.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defaults to a <see cref="Layout.PatternLayout"/> with %logger as the pattern which will use the logger name of the current 
+    /// <see cref="LoggingEvent"/> as the category parameter.
+    /// </para>
+    /// <para>
+    /// </para> 
+    /// </remarks>
+    public PatternLayout Category
+    {
+      get { return m_category; }
+      set { m_category = value; }
+    }
+
+    #endregion Public Instance Properties
 
 #if !NETSTANDARD1_3
-            /// <summary>
-            /// Flushes any buffered log data.
-            /// </summary>
-            /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
-            /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-            public override bool Flush(int millisecondsTimeout)
-            {
-                // Nothing to do if ImmediateFlush is true
-                if (m_immediateFlush) return true;
+    /// <summary>
+    /// Flushes any buffered log data.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public override bool Flush(int millisecondsTimeout)
+    {
+      // Nothing to do if ImmediateFlush is true
+      if (m_immediateFlush) return true;
 
-                // System.Diagnostics.Debug is thread-safe, so no need for lock(this).
-                System.Diagnostics.Debug.Flush();
+      // System.Diagnostics.Debug is thread-safe, so no need for lock(this).
+      System.Diagnostics.Debug.Flush();
 
-                return true;
-            }
+      return true;
+    }
 #endif
 
-		#region Override implementation of AppenderSkeleton
-		
+    #region Override implementation of AppenderSkeleton
+
 #if NETSTANDARD1_3
-		/// <summary>
-		/// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
+    /// </para>
+    /// </remarks>
 #else
-		/// <summary>
-		/// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
-		/// If <see cref="ImmediateFlush"/> is <c>true</c> then the <see cref="System.Diagnostics.Debug.Flush"/>
-		/// is called.
-		/// </para>
-		/// </remarks> 
+    /// <summary>
+    /// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the logging event to the <see cref="System.Diagnostics.Debug"/> system.
+    /// If <see cref="ImmediateFlush"/> is <c>true</c> then the <see cref="System.Diagnostics.Debug.Flush"/>
+    /// is called.
+    /// </para>
+    /// </remarks> 
 #endif
-		protected override void Append(LoggingEvent loggingEvent)
-		{
-			//
-			// Write the string to the Debug system
-			//
-            if(m_category == null)
-            {
-                System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent));
-            }
-            else
-            {
-                string category = m_category.Format(loggingEvent);
-                if (string.IsNullOrEmpty(category))
-                {
-                    System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent));
-                }
-                else
-                {
-                    System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), category);
-                }
-            }
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      //
+      // Write the string to the Debug system
+      //
+      if (m_category == null)
+      {
+        System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent));
+      }
+      else
+      {
+        string category = m_category.Format(loggingEvent);
+        if (string.IsNullOrEmpty(category))
+        {
+          System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent));
+        }
+        else
+        {
+          System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), category);
+        }
+      }
 #if !NETSTANDARD1_3
-			//
-			// Flush the Debug system if needed
-			//
-			if (m_immediateFlush) 
-			{
-				System.Diagnostics.Debug.Flush();
-			} 
+      //
+      // Flush the Debug system if needed
+      //
+      if (m_immediateFlush)
+      {
+        System.Diagnostics.Debug.Flush();
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Private Instance Fields
-		
-#if !NETSTANDARD1_3		
-		/// <summary>
-		/// Immediate flush means that the underlying writer or output stream
-		/// will be flushed at the end of each append operation.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Immediate flush is slower but ensures that each append request is 
-		/// actually written. If <see cref="ImmediateFlush"/> is set to
-		/// <c>false</c>, then there is a good chance that the last few
-		/// logs events are not actually written to persistent media if and
-		/// when the application crashes.
-		/// </para>
-		/// <para>
-		/// The default value is <c>true</c>.</para>
-		/// </remarks>
-		private bool m_immediateFlush = true;
+    #region Private Instance Fields
+
+#if !NETSTANDARD1_3
+    /// <summary>
+    /// Immediate flush means that the underlying writer or output stream
+    /// will be flushed at the end of each append operation.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Immediate flush is slower but ensures that each append request is 
+    /// actually written. If <see cref="ImmediateFlush"/> is set to
+    /// <c>false</c>, then there is a good chance that the last few
+    /// logs events are not actually written to persistent media if and
+    /// when the application crashes.
+    /// </para>
+    /// <para>
+    /// The default value is <c>true</c>.</para>
+    /// </remarks>
+    private bool m_immediateFlush = true;
 #endif
 
-        /// <summary>
-        /// Defaults to a <see cref="Layout.PatternLayout"/> with %logger as the pattern.
-        /// </summary>
-        private PatternLayout m_category = new PatternLayout("%logger");
+    /// <summary>
+    /// Defaults to a <see cref="Layout.PatternLayout"/> with %logger as the pattern.
+    /// </summary>
+    private PatternLayout m_category = new PatternLayout("%logger");
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Appender/EventLogAppender.cs b/src/log4net/Appender/EventLogAppender.cs
index 0d1f3c8..f87a7bc 100644
--- a/src/log4net/Appender/EventLogAppender.cs
+++ b/src/log4net/Appender/EventLogAppender.cs
@@ -36,656 +36,658 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Writes events to the system event log.
-	/// </summary>
-	/// <remarks>
+  /// <summary>
+  /// Writes events to the system event log.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges.
+  /// See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog
+  /// </para>
+  /// <para>
+  /// The <c>EventID</c> of the event log entry can be
+  /// set using the <c>EventID</c> property (<see cref="LoggingEvent.Properties"/>)
+  /// on the <see cref="LoggingEvent"/>.
+  /// </para>
+  /// <para>
+  /// The <c>Category</c> of the event log entry can be
+  /// set using the <c>Category</c> property (<see cref="LoggingEvent.Properties"/>)
+  /// on the <see cref="LoggingEvent"/>.
+  /// </para>
+  /// <para>
+  /// There is a limit of 32K characters for an event log message
+  /// </para>
+  /// <para>
+  /// When configuring the EventLogAppender a mapping can be
+  /// specified to map a logging level to an event log entry type. For example:
+  /// </para>
+  /// <code lang="XML">
+  /// &lt;mapping&gt;
+  ///   &lt;level value="ERROR" /&gt;
+  ///   &lt;eventLogEntryType value="Error" /&gt;
+  /// &lt;/mapping&gt;
+  /// &lt;mapping&gt;
+  ///   &lt;level value="DEBUG" /&gt;
+  ///   &lt;eventLogEntryType value="Information" /&gt;
+  /// &lt;/mapping&gt;
+  /// </code>
+  /// <para>
+  /// The Level is the standard log4net logging level and eventLogEntryType can be any value
+  /// from the <see cref="EventLogEntryType"/> enum, i.e.:
+  /// <list type="bullet">
+  /// <item><term>Error</term><description>an error event</description></item>
+  /// <item><term>Warning</term><description>a warning event</description></item>
+  /// <item><term>Information</term><description>an informational event</description></item>
+  /// </list>
+  /// </para>
+  /// </remarks>
+  /// <author>Aspi Havewala</author>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Thomas Voss</author>
+  public class EventLogAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="EventLogAppender" /> class.
+    /// </summary>
+    /// <remarks>
     /// <para>
-    /// The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges.
-    /// See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog
+    /// Default constructor.
     /// </para>
-	/// <para>
-	/// The <c>EventID</c> of the event log entry can be
-	/// set using the <c>EventID</c> property (<see cref="LoggingEvent.Properties"/>)
-	/// on the <see cref="LoggingEvent"/>.
-	/// </para>
+    /// </remarks>
+    public EventLogAppender()
+    {
+      m_applicationName = System.Threading.Thread.GetDomain().FriendlyName;
+      m_logName = "Application";  // Defaults to application log
+      m_machineName = ".";  // Only log on the local machine
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="EventLogAppender" /> class
+    /// with the specified <see cref="ILayout" />.
+    /// </summary>
+    /// <param name="layout">The <see cref="ILayout" /> to use with this appender.</param>
+    /// <remarks>
     /// <para>
-    /// The <c>Category</c> of the event log entry can be
-	/// set using the <c>Category</c> property (<see cref="LoggingEvent.Properties"/>)
-	/// on the <see cref="LoggingEvent"/>.
-	/// </para>
-	/// <para>
-	/// There is a limit of 32K characters for an event log message
-	/// </para>
-	/// <para>
-	/// When configuring the EventLogAppender a mapping can be
-	/// specified to map a logging level to an event log entry type. For example:
-	/// </para>
-	/// <code lang="XML">
-	/// &lt;mapping&gt;
-	/// 	&lt;level value="ERROR" /&gt;
-	/// 	&lt;eventLogEntryType value="Error" /&gt;
-	/// &lt;/mapping&gt;
-	/// &lt;mapping&gt;
-	/// 	&lt;level value="DEBUG" /&gt;
-	/// 	&lt;eventLogEntryType value="Information" /&gt;
-	/// &lt;/mapping&gt;
-	/// </code>
-	/// <para>
-	/// The Level is the standard log4net logging level and eventLogEntryType can be any value
-	/// from the <see cref="EventLogEntryType"/> enum, i.e.:
-	/// <list type="bullet">
-	/// <item><term>Error</term><description>an error event</description></item>
-	/// <item><term>Warning</term><description>a warning event</description></item>
-	/// <item><term>Information</term><description>an informational event</description></item>
-	/// </list>
-	/// </para>
-	/// </remarks>
-	/// <author>Aspi Havewala</author>
-	/// <author>Douglas de la Torre</author>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Thomas Voss</author>
-	public class EventLogAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout property")]
+    public EventLogAppender(ILayout layout) : this()
+    {
+      Layout = layout;
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="EventLogAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public EventLogAppender()
-		{
-			m_applicationName	= System.Threading.Thread.GetDomain().FriendlyName;
-			m_logName			= "Application";	// Defaults to application log
-			m_machineName		= ".";	// Only log on the local machine
-		}
+    #endregion // Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="EventLogAppender" /> class
-		/// with the specified <see cref="ILayout" />.
-		/// </summary>
-		/// <param name="layout">The <see cref="ILayout" /> to use with this appender.</param>
-		/// <remarks>
-		/// <para>
-		/// Obsolete constructor.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout property")]
-		public EventLogAppender(ILayout layout) : this()
-		{
-			Layout = layout;
-		}
+    #region Public Instance Properties
 
-		#endregion // Public Instance Constructors
+    /// <summary>
+    /// The name of the log where messages will be stored.
+    /// </summary>
+    /// <value>
+    /// The string name of the log where messages will be stored.
+    /// </value>
+    /// <remarks>
+    /// <para>This is the name of the log as it appears in the Event Viewer
+    /// tree. The default value is to log into the <c>Application</c>
+    /// log, this is where most applications write their events. However
+    /// if you need a separate log for your application (or applications)
+    /// then you should set the <see cref="LogName"/> appropriately.</para>
+    /// <para>This should not be used to distinguish your event log messages
+    /// from those of other applications, the <see cref="ApplicationName"/>
+    /// property should be used to distinguish events. This property should be 
+    /// used to group together events into a single log.
+    /// </para>
+    /// </remarks>
+    public string LogName
+    {
+      get { return m_logName; }
+      set { m_logName = value; }
+    }
 
-		#region Public Instance Properties
+    /// <summary>
+    /// Property used to set the Application name.  This appears in the
+    /// event logs when logging.
+    /// </summary>
+    /// <value>
+    /// The string used to distinguish events from different sources.
+    /// </value>
+    /// <remarks>
+    /// Sets the event log source property.
+    /// </remarks>
+    public string ApplicationName
+    {
+      get { return m_applicationName; }
+      set { m_applicationName = value; }
+    }
 
-		/// <summary>
-		/// The name of the log where messages will be stored.
-		/// </summary>
-		/// <value>
-		/// The string name of the log where messages will be stored.
-		/// </value>
-		/// <remarks>
-		/// <para>This is the name of the log as it appears in the Event Viewer
-		/// tree. The default value is to log into the <c>Application</c>
-		/// log, this is where most applications write their events. However
-		/// if you need a separate log for your application (or applications)
-		/// then you should set the <see cref="LogName"/> appropriately.</para>
-		/// <para>This should not be used to distinguish your event log messages
-		/// from those of other applications, the <see cref="ApplicationName"/>
-		/// property should be used to distinguish events. This property should be 
-		/// used to group together events into a single log.
-		/// </para>
-		/// </remarks>
-		public string LogName
-		{
-			get { return m_logName; }
-			set { m_logName = value; }
-		}
+    /// <summary>
+    /// This property is used to return the name of the computer to use
+    /// when accessing the event logs.  Currently, this is the current
+    /// computer, denoted by a dot "."
+    /// </summary>
+    /// <value>
+    /// The string name of the machine holding the event log that 
+    /// will be logged into.
+    /// </value>
+    /// <remarks>
+    /// This property cannot be changed. It is currently set to '.'
+    /// i.e. the local machine. This may be changed in future.
+    /// </remarks>
+    public string MachineName
+    {
+      get { return m_machineName; }
+      set { /* Currently we do not allow the machine name to be changed */; }
+    }
 
-		/// <summary>
-		/// Property used to set the Application name.  This appears in the
-		/// event logs when logging.
-		/// </summary>
-		/// <value>
-		/// The string used to distinguish events from different sources.
-		/// </value>
-		/// <remarks>
-		/// Sets the event log source property.
-		/// </remarks>
-		public string ApplicationName
-		{
-			get { return m_applicationName; }
-			set { m_applicationName = value; }
-		}
+    /// <summary>
+    /// Add a mapping of level to <see cref="EventLogEntryType"/> - done by the config file
+    /// </summary>
+    /// <param name="mapping">The mapping to add</param>
+    /// <remarks>
+    /// <para>
+    /// Add a <see cref="Level2EventLogEntryType"/> mapping to this appender.
+    /// Each mapping defines the event log entry type for a level.
+    /// </para>
+    /// </remarks>
+    public void AddMapping(Level2EventLogEntryType mapping)
+    {
+      m_levelMapping.Add(mapping);
+    }
 
-		/// <summary>
-		/// This property is used to return the name of the computer to use
-		/// when accessing the event logs.  Currently, this is the current
-		/// computer, denoted by a dot "."
-		/// </summary>
-		/// <value>
-		/// The string name of the machine holding the event log that 
-		/// will be logged into.
-		/// </value>
-		/// <remarks>
-		/// This property cannot be changed. It is currently set to '.'
-		/// i.e. the local machine. This may be changed in future.
-		/// </remarks>
-		public string MachineName
-		{
-			get { return m_machineName; }
-			set { /* Currently we do not allow the machine name to be changed */; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="SecurityContext"/> used to write to the EventLog.
+    /// </summary>
+    /// <value>
+    /// The <see cref="SecurityContext"/> used to write to the EventLog.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The system security context used to write to the EventLog.
+    /// </para>
+    /// <para>
+    /// Unless a <see cref="SecurityContext"/> specified here for this appender
+    /// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
+    /// security context to use. The default behavior is to use the security context
+    /// of the current thread.
+    /// </para>
+    /// </remarks>
+    public SecurityContext SecurityContext
+    {
+      get { return m_securityContext; }
+      set { m_securityContext = value; }
+    }
 
-		/// <summary>
-		/// Add a mapping of level to <see cref="EventLogEntryType"/> - done by the config file
-		/// </summary>
-		/// <param name="mapping">The mapping to add</param>
-		/// <remarks>
-		/// <para>
-		/// Add a <see cref="Level2EventLogEntryType"/> mapping to this appender.
-		/// Each mapping defines the event log entry type for a level.
-		/// </para>
-		/// </remarks>
-		public void AddMapping(Level2EventLogEntryType mapping)
-		{
-			m_levelMapping.Add(mapping);
-		}
-
-		/// <summary>
-		/// Gets or sets the <see cref="SecurityContext"/> used to write to the EventLog.
-		/// </summary>
-		/// <value>
-		/// The <see cref="SecurityContext"/> used to write to the EventLog.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The system security context used to write to the EventLog.
-		/// </para>
-		/// <para>
-		/// Unless a <see cref="SecurityContext"/> specified here for this appender
-		/// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
-		/// security context to use. The default behavior is to use the security context
-		/// of the current thread.
-		/// </para>
-		/// </remarks>
-		public SecurityContext SecurityContext 
-		{
-			get { return m_securityContext; }
-			set { m_securityContext = value; }
-		}
-
-        /// <summary>
-        /// Gets or sets the <c>EventId</c> to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The <c>EventID</c> of the event log entry will normally be
-	    /// set using the <c>EventID</c> property (<see cref="LoggingEvent.Properties"/>)
-	    /// on the <see cref="LoggingEvent"/>.
-        /// This property provides the fallback value which defaults to 0.
-        /// </para>
-        /// </remarks>
-        public int EventId {
-            get { return m_eventId; }
-            set { m_eventId = value; }
-        }
+    /// <summary>
+    /// Gets or sets the <c>EventId</c> to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <c>EventID</c> of the event log entry will normally be
+    /// set using the <c>EventID</c> property (<see cref="LoggingEvent.Properties"/>)
+    /// on the <see cref="LoggingEvent"/>.
+    /// This property provides the fallback value which defaults to 0.
+    /// </para>
+    /// </remarks>
+    public int EventId
+    {
+      get { return m_eventId; }
+      set { m_eventId = value; }
+    }
 
 
-        /// <summary>
-        /// Gets or sets the <c>Category</c> to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The <c>Category</c> of the event log entry will normally be
-	    /// set using the <c>Category</c> property (<see cref="LoggingEvent.Properties"/>)
-	    /// on the <see cref="LoggingEvent"/>.
-        /// This property provides the fallback value which defaults to 0.
-        /// </para>
-        /// </remarks>
-        public short Category
+    /// <summary>
+    /// Gets or sets the <c>Category</c> to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <c>Category</c> of the event log entry will normally be
+    /// set using the <c>Category</c> property (<see cref="LoggingEvent.Properties"/>)
+    /// on the <see cref="LoggingEvent"/>.
+    /// This property provides the fallback value which defaults to 0.
+    /// </para>
+    /// </remarks>
+    public short Category
+    {
+      get { return m_category; }
+      set { m_category = value; }
+    }
+    #endregion // Public Instance Properties
+
+    #region Implementation of IOptionHandler
+
+    /// <summary>
+    /// Initialize the appender based on the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      try
+      {
+        base.ActivateOptions();
+
+        if (m_securityContext == null)
         {
-            get { return m_category; }
-            set { m_category = value; }
+          m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
         }
-        #endregion // Public Instance Properties
 
-		#region Implementation of IOptionHandler
+        bool sourceAlreadyExists = false;
+        string currentLogName = null;
 
-		/// <summary>
-		/// Initialize the appender based on the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-            try
-            {
-                base.ActivateOptions();
+        using (SecurityContext.Impersonate(this))
+        {
+          sourceAlreadyExists = EventLog.SourceExists(m_applicationName);
+          if (sourceAlreadyExists)
+          {
+            currentLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
+          }
+        }
 
-                if (m_securityContext == null)
-                {
-                    m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-                }
+        if (sourceAlreadyExists && currentLogName != m_logName)
+        {
+          LogLog.Debug(declaringType, "Changing event source [" + m_applicationName + "] from log [" + currentLogName + "] to log [" + m_logName + "]");
+        }
+        else if (!sourceAlreadyExists)
+        {
+          LogLog.Debug(declaringType, "Creating event source Source [" + m_applicationName + "] in log " + m_logName + "]");
+        }
 
-                bool sourceAlreadyExists = false;
-                string currentLogName = null;
+        string registeredLogName = null;
 
-                using (SecurityContext.Impersonate(this))
-                {
-                    sourceAlreadyExists = EventLog.SourceExists(m_applicationName);
-                    if (sourceAlreadyExists) {
-                        currentLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
-                    }
-                }
+        using (SecurityContext.Impersonate(this))
+        {
+          if (sourceAlreadyExists && currentLogName != m_logName)
+          {
+            //
+            // Re-register this to the current application if the user has changed
+            // the application / logfile association
+            //
+            EventLog.DeleteEventSource(m_applicationName, m_machineName);
+            CreateEventSource(m_applicationName, m_logName, m_machineName);
 
-                if (sourceAlreadyExists && currentLogName != m_logName)
-                {
-                    LogLog.Debug(declaringType, "Changing event source [" + m_applicationName + "] from log [" + currentLogName + "] to log [" + m_logName + "]");
-                }
-                else if (!sourceAlreadyExists)
-                {
-                    LogLog.Debug(declaringType, "Creating event source Source [" + m_applicationName + "] in log " + m_logName + "]");
-                }
+            registeredLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
+          }
+          else if (!sourceAlreadyExists)
+          {
+            CreateEventSource(m_applicationName, m_logName, m_machineName);
 
-                string registeredLogName = null;
+            registeredLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
+          }
+        }
 
-                using (SecurityContext.Impersonate(this))
-                {
-                    if (sourceAlreadyExists && currentLogName != m_logName)
-                    {
-                        //
-                        // Re-register this to the current application if the user has changed
-                        // the application / logfile association
-                        //
-                        EventLog.DeleteEventSource(m_applicationName, m_machineName);
-                        CreateEventSource(m_applicationName, m_logName, m_machineName);
+        m_levelMapping.ActivateOptions();
 
-                        registeredLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
-                    }
-                    else if (!sourceAlreadyExists)
-                    {
-                        CreateEventSource(m_applicationName, m_logName, m_machineName);
+        LogLog.Debug(declaringType, "Source [" + m_applicationName + "] is registered to log [" + registeredLogName + "]");
+      }
+      catch (System.Security.SecurityException ex)
+      {
+        ErrorHandler.Error("Caught a SecurityException trying to access the EventLog.  Most likely the event source "
+            + m_applicationName
+            + " doesn't exist and must be created by a local administrator.  Will disable EventLogAppender."
+            + "  See http://logging.apache.org/log4net/release/faq.html#trouble-EventLog",
+            ex);
+        Threshold = Level.Off;
+      }
+    }
 
-                        registeredLogName = EventLog.LogNameFromSourceName(m_applicationName, m_machineName);
-                    }
-                }
+    #endregion // Implementation of IOptionHandler
 
-                m_levelMapping.ActivateOptions();
-
-                LogLog.Debug(declaringType, "Source [" + m_applicationName + "] is registered to log [" + registeredLogName + "]");
-            }
-            catch (System.Security.SecurityException ex)
-            {
-                ErrorHandler.Error("Caught a SecurityException trying to access the EventLog.  Most likely the event source "
-                    + m_applicationName
-                    + " doesn't exist and must be created by a local administrator.  Will disable EventLogAppender."
-                    + "  See http://logging.apache.org/log4net/release/faq.html#trouble-EventLog",
-                    ex);
-                Threshold = Level.Off;
-            }
-		}
-
-		#endregion // Implementation of IOptionHandler
-
-		/// <summary>
-		/// Create an event log source
-		/// </summary>
-		/// <remarks>
-		/// Uses different API calls under NET_2_0
-		/// </remarks>
-		private static void CreateEventSource(string source, string logName, string machineName)
-		{
+    /// <summary>
+    /// Create an event log source
+    /// </summary>
+    /// <remarks>
+    /// Uses different API calls under NET_2_0
+    /// </remarks>
+    private static void CreateEventSource(string source, string logName, string machineName)
+    {
 #if NET_2_0
-			EventSourceCreationData eventSourceCreationData = new EventSourceCreationData(source, logName);
-			eventSourceCreationData.MachineName = machineName;
-			EventLog.CreateEventSource(eventSourceCreationData);
+      EventSourceCreationData eventSourceCreationData = new EventSourceCreationData(source, logName);
+      eventSourceCreationData.MachineName = machineName;
+      EventLog.CreateEventSource(eventSourceCreationData);
 #else
-			EventLog.CreateEventSource(source, logName, machineName);
+      EventLog.CreateEventSource(source, logName, machineName);
 #endif
-		}
- 
-		#region Override implementation of AppenderSkeleton
+    }
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/>
-		/// method. 
-		/// </summary>
-		/// <param name="loggingEvent">the event to log</param>
-		/// <remarks>
-		/// <para>Writes the event to the system event log using the 
-		/// <see cref="ApplicationName"/>.</para>
-		/// 
-		/// <para>If the event has an <c>EventID</c> property (see <see cref="LoggingEvent.Properties"/>)
-		/// set then this integer will be used as the event log event id.</para>
-		/// 
-		/// <para>
-		/// There is a limit of 32K characters for an event log message
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			//
-			// Write the resulting string to the event log system
-			//
-			int eventID = m_eventId;
+    #region Override implementation of AppenderSkeleton
 
-			// Look for the EventID property
-			object eventIDPropertyObj = loggingEvent.LookupProperty("EventID");
-			if (eventIDPropertyObj != null)
-			{
-				if (eventIDPropertyObj is int)
-				{
-					eventID = (int)eventIDPropertyObj;
-				}
-				else
-				{
-					string eventIDPropertyString = eventIDPropertyObj as string;
-                    if (eventIDPropertyString == null)
-                    {
-                        eventIDPropertyString = eventIDPropertyObj.ToString();
-                    }
-					if (eventIDPropertyString != null && eventIDPropertyString.Length > 0)
-					{
-						// Read the string property into a number
-						int intVal;
-						if (SystemInfo.TryParse(eventIDPropertyString, out intVal))
-						{
-							eventID = intVal;
-						}
-						else
-						{
-							ErrorHandler.Error("Unable to parse event ID property [" + eventIDPropertyString + "].");
-						}
-					}
-				}
-			}
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/>
+    /// method. 
+    /// </summary>
+    /// <param name="loggingEvent">the event to log</param>
+    /// <remarks>
+    /// <para>Writes the event to the system event log using the 
+    /// <see cref="ApplicationName"/>.</para>
+    /// 
+    /// <para>If the event has an <c>EventID</c> property (see <see cref="LoggingEvent.Properties"/>)
+    /// set then this integer will be used as the event log event id.</para>
+    /// 
+    /// <para>
+    /// There is a limit of 32K characters for an event log message
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      //
+      // Write the resulting string to the event log system
+      //
+      int eventID = m_eventId;
 
-            short category = m_category;
-            // Look for the Category property
-            object categoryPropertyObj = loggingEvent.LookupProperty("Category");
-            if (categoryPropertyObj != null)
+      // Look for the EventID property
+      object eventIDPropertyObj = loggingEvent.LookupProperty("EventID");
+      if (eventIDPropertyObj != null)
+      {
+        if (eventIDPropertyObj is int)
+        {
+          eventID = (int)eventIDPropertyObj;
+        }
+        else
+        {
+          string eventIDPropertyString = eventIDPropertyObj as string;
+          if (eventIDPropertyString == null)
+          {
+            eventIDPropertyString = eventIDPropertyObj.ToString();
+          }
+          if (eventIDPropertyString != null && eventIDPropertyString.Length > 0)
+          {
+            // Read the string property into a number
+            int intVal;
+            if (SystemInfo.TryParse(eventIDPropertyString, out intVal))
             {
-                if (categoryPropertyObj is short)
-                {
-                    category = (short) categoryPropertyObj;
-                }
-                else
-                {
-                    string categoryPropertyString = categoryPropertyObj as string;
-                    if (categoryPropertyString == null)
-                    {
-                        categoryPropertyString = categoryPropertyObj.ToString();
-                    }
-                    if (categoryPropertyString != null && categoryPropertyString.Length > 0)
-                    {
-                        // Read the string property into a number
-                        short shortVal;
-                        if (SystemInfo.TryParse(categoryPropertyString, out shortVal))
-                        {
-                            category = shortVal;
-                        }
-                        else
-                        {
-                            ErrorHandler.Error("Unable to parse event category property [" + categoryPropertyString + "].");
-                        }
-                    }
-                }
+              eventID = intVal;
             }
+            else
+            {
+              ErrorHandler.Error("Unable to parse event ID property [" + eventIDPropertyString + "].");
+            }
+          }
+        }
+      }
 
-			// Write to the event log
-			try
-			{
-				string eventTxt = RenderLoggingEvent(loggingEvent);
+      short category = m_category;
+      // Look for the Category property
+      object categoryPropertyObj = loggingEvent.LookupProperty("Category");
+      if (categoryPropertyObj != null)
+      {
+        if (categoryPropertyObj is short)
+        {
+          category = (short)categoryPropertyObj;
+        }
+        else
+        {
+          string categoryPropertyString = categoryPropertyObj as string;
+          if (categoryPropertyString == null)
+          {
+            categoryPropertyString = categoryPropertyObj.ToString();
+          }
+          if (categoryPropertyString != null && categoryPropertyString.Length > 0)
+          {
+            // Read the string property into a number
+            short shortVal;
+            if (SystemInfo.TryParse(categoryPropertyString, out shortVal))
+            {
+              category = shortVal;
+            }
+            else
+            {
+              ErrorHandler.Error("Unable to parse event category property [" + categoryPropertyString + "].");
+            }
+          }
+        }
+      }
 
-				// There is a limit of about 32K characters for an event log message
-				if (eventTxt.Length > MAX_EVENTLOG_MESSAGE_SIZE)
-				{
-					eventTxt = eventTxt.Substring(0, MAX_EVENTLOG_MESSAGE_SIZE);
-				}
+      // Write to the event log
+      try
+      {
+        string eventTxt = RenderLoggingEvent(loggingEvent);
 
-				EventLogEntryType entryType = GetEntryType(loggingEvent.Level);
+        // There is a limit of about 32K characters for an event log message
+        if (eventTxt.Length > MAX_EVENTLOG_MESSAGE_SIZE)
+        {
+          eventTxt = eventTxt.Substring(0, MAX_EVENTLOG_MESSAGE_SIZE);
+        }
 
-				using(SecurityContext.Impersonate(this))
-				{
-					EventLog.WriteEntry(m_applicationName, eventTxt, entryType, eventID, category);
-				}
-			}
-			catch(Exception ex)
-			{
-				ErrorHandler.Error("Unable to write to event log [" + m_logName + "] using source [" + m_applicationName + "]", ex);
-			}
-		} 
+        EventLogEntryType entryType = GetEntryType(loggingEvent.Level);
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+        using (SecurityContext.Impersonate(this))
+        {
+          EventLog.WriteEntry(m_applicationName, eventTxt, entryType, eventID, category);
+        }
+      }
+      catch (Exception ex)
+      {
+        ErrorHandler.Error("Unable to write to event log [" + m_logName + "] using source [" + m_applicationName + "]", ex);
+      }
+    }
 
-		#endregion // Override implementation of AppenderSkeleton
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#region Protected Instance Methods
+    #endregion // Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Get the equivalent <see cref="EventLogEntryType"/> for a <see cref="Level"/> <paramref name="level"/>
-		/// </summary>
-		/// <param name="level">the Level to convert to an EventLogEntryType</param>
-		/// <returns>The equivalent <see cref="EventLogEntryType"/> for a <see cref="Level"/> <paramref name="level"/></returns>
-		/// <remarks>
-		/// Because there are fewer applicable <see cref="EventLogEntryType"/>
-		/// values to use in logging levels than there are in the 
-		/// <see cref="Level"/> this is a one way mapping. There is
-		/// a loss of information during the conversion.
-		/// </remarks>
-		protected virtual EventLogEntryType GetEntryType(Level level)
-		{
-			// see if there is a specified lookup.
-			Level2EventLogEntryType entryType = m_levelMapping.Lookup(level) as Level2EventLogEntryType;
-			if (entryType != null)
-			{
-				return entryType.EventLogEntryType;
-			}
+    #region Protected Instance Methods
 
-			// Use default behavior
+    /// <summary>
+    /// Get the equivalent <see cref="EventLogEntryType"/> for a <see cref="Level"/> <paramref name="level"/>
+    /// </summary>
+    /// <param name="level">the Level to convert to an EventLogEntryType</param>
+    /// <returns>The equivalent <see cref="EventLogEntryType"/> for a <see cref="Level"/> <paramref name="level"/></returns>
+    /// <remarks>
+    /// Because there are fewer applicable <see cref="EventLogEntryType"/>
+    /// values to use in logging levels than there are in the 
+    /// <see cref="Level"/> this is a one way mapping. There is
+    /// a loss of information during the conversion.
+    /// </remarks>
+    protected virtual EventLogEntryType GetEntryType(Level level)
+    {
+      // see if there is a specified lookup.
+      Level2EventLogEntryType entryType = m_levelMapping.Lookup(level) as Level2EventLogEntryType;
+      if (entryType != null)
+      {
+        return entryType.EventLogEntryType;
+      }
 
-			if (level >= Level.Error) 
-			{
-				return EventLogEntryType.Error;
-			}
-			else if (level == Level.Warn) 
-			{
-				return EventLogEntryType.Warning;
-			} 
+      // Use default behavior
 
-			// Default setting
-			return EventLogEntryType.Information;
-		}
+      if (level >= Level.Error)
+      {
+        return EventLogEntryType.Error;
+      }
+      else if (level == Level.Warn)
+      {
+        return EventLogEntryType.Warning;
+      }
 
-		#endregion // Protected Instance Methods
+      // Default setting
+      return EventLogEntryType.Information;
+    }
 
-		#region Private Instance Fields
+    #endregion // Protected Instance Methods
 
-		/// <summary>
-		/// The log name is the section in the event logs where the messages
-		/// are stored.
-		/// </summary>
-		private string m_logName;
+    #region Private Instance Fields
 
-		/// <summary>
-		/// Name of the application to use when logging.  This appears in the
-		/// application column of the event log named by <see cref="m_logName"/>.
-		/// </summary>
-		private string m_applicationName;
+    /// <summary>
+    /// The log name is the section in the event logs where the messages
+    /// are stored.
+    /// </summary>
+    private string m_logName;
 
-		/// <summary>
-		/// The name of the machine which holds the event log. This is
-		/// currently only allowed to be '.' i.e. the current machine.
-		/// </summary>
-		private string m_machineName;
+    /// <summary>
+    /// Name of the application to use when logging.  This appears in the
+    /// application column of the event log named by <see cref="m_logName"/>.
+    /// </summary>
+    private string m_applicationName;
 
-		/// <summary>
-		/// Mapping from level object to EventLogEntryType
-		/// </summary>
-		private LevelMapping m_levelMapping = new LevelMapping();
+    /// <summary>
+    /// The name of the machine which holds the event log. This is
+    /// currently only allowed to be '.' i.e. the current machine.
+    /// </summary>
+    private string m_machineName;
 
-		/// <summary>
-		/// The security context to use for privileged calls
-		/// </summary>
-		private SecurityContext m_securityContext;
+    /// <summary>
+    /// Mapping from level object to EventLogEntryType
+    /// </summary>
+    private LevelMapping m_levelMapping = new LevelMapping();
 
-        /// <summary>
-        /// The event ID to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
-        /// </summary>
-        private int m_eventId = 0;
+    /// <summary>
+    /// The security context to use for privileged calls
+    /// </summary>
+    private SecurityContext m_securityContext;
 
-        /// <summary>
-        /// The event category to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
-        /// </summary>
-        private short m_category = 0;
+    /// <summary>
+    /// The event ID to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
+    /// </summary>
+    private int m_eventId = 0;
 
-        #endregion // Private Instance Fields
+    /// <summary>
+    /// The event category to use unless one is explicitly specified via the <c>LoggingEvent</c>'s properties.
+    /// </summary>
+    private short m_category = 0;
 
-		#region Level2EventLogEntryType LevelMapping Entry
+    #endregion // Private Instance Fields
 
-		/// <summary>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the color it should be displayed as.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Defines the mapping between a level and its event log entry type.
-		/// </para>
-		/// </remarks>
-		public class Level2EventLogEntryType : LevelMappingEntry
-		{
-			private EventLogEntryType m_entryType;
+    #region Level2EventLogEntryType LevelMapping Entry
 
-			/// <summary>
-			/// The <see cref="EventLogEntryType"/> for this entry
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The <see cref="EventLogEntryType"/> for this entry
-			/// </para>
-			/// </remarks>
-			public EventLogEntryType EventLogEntryType
-			{
-				get { return m_entryType; }
-				set { m_entryType = value; }
-			}
-		}
+    /// <summary>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the color it should be displayed as.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defines the mapping between a level and its event log entry type.
+    /// </para>
+    /// </remarks>
+    public class Level2EventLogEntryType : LevelMappingEntry
+    {
+      private EventLogEntryType m_entryType;
 
-		#endregion // LevelColors LevelMapping Entry
+      /// <summary>
+      /// The <see cref="EventLogEntryType"/> for this entry
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The <see cref="EventLogEntryType"/> for this entry
+      /// </para>
+      /// </remarks>
+      public EventLogEntryType EventLogEntryType
+      {
+        get { return m_entryType; }
+        set { m_entryType = value; }
+      }
+    }
 
-	    #region Private Static Fields
+    #endregion // LevelColors LevelMapping Entry
 
-	    /// <summary>
-	    /// The fully qualified type of the EventLogAppender class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(EventLogAppender);
+    #region Private Static Fields
 
-		/// <summary>
-		/// The maximum size supported by default.
-		/// </summary>
-		/// <remarks>
-		/// http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx
-		/// The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 
-		/// may leave space for a two byte null terminator of #0#0). The 32766 max 
-		/// length is what the .NET 4.0 source code checks for, but this is WRONG! 
-		/// Strings with a length > 31839 on Windows Vista or higher can CORRUPT 
-		/// the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() 
-		/// for the use of the 32766 max size.
-		/// </remarks>
-		private static readonly int MAX_EVENTLOG_MESSAGE_SIZE_DEFAULT = 32766;
+    /// <summary>
+    /// The fully qualified type of the EventLogAppender class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(EventLogAppender);
 
-		/// <summary>
-		/// The maximum size supported by a windows operating system that is vista
-		/// or newer.
-		/// </summary>
-		/// <remarks>
-		/// See ReportEvent API:
-		///		http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx
-		/// ReportEvent's lpStrings parameter:
-		/// "A pointer to a buffer containing an array of 
-		/// null-terminated strings that are merged into the message before Event Viewer 
-		/// displays the string to the user. This parameter must be a valid pointer 
-		/// (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters."
-		/// 
-		/// Going beyond the size of 31839 will (at some point) corrupt the event log on Windows
-		/// Vista or higher! It may succeed for a while...but you will eventually run into the
-		/// error: "System.ComponentModel.Win32Exception : A device attached to the system is
-		/// not functioning", and the event log will then be corrupt (I was able to corrupt 
-		/// an event log using a length of 31877 on Windows 7).
-		/// 
-		/// The max size for Windows Vista or higher is documented here:
-		///		http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx.
-		/// Going over this size may succeed a few times but the buffer will overrun and 
-		/// eventually corrupt the log (based on testing).
-		/// 
-		/// The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API.
-		/// The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a
-		/// terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the
-		/// buffer, given enough time).
-		/// </remarks>
-		private static readonly int MAX_EVENTLOG_MESSAGE_SIZE_VISTA_OR_NEWER = 31839 - 2;
+    /// <summary>
+    /// The maximum size supported by default.
+    /// </summary>
+    /// <remarks>
+    /// http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx
+    /// The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 
+    /// may leave space for a two byte null terminator of #0#0). The 32766 max 
+    /// length is what the .NET 4.0 source code checks for, but this is WRONG! 
+    /// Strings with a length > 31839 on Windows Vista or higher can CORRUPT 
+    /// the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() 
+    /// for the use of the 32766 max size.
+    /// </remarks>
+    private static readonly int MAX_EVENTLOG_MESSAGE_SIZE_DEFAULT = 32766;
 
-		/// <summary>
-		/// The maximum size that the operating system supports for
-		/// a event log message.
-		/// </summary>
-		/// <remarks>
-		/// Used to determine the maximum string length that can be written
-		/// to the operating system event log and eventually truncate a string
-		/// that exceeds the limits.
-		/// </remarks>
-		private static readonly int MAX_EVENTLOG_MESSAGE_SIZE = GetMaxEventLogMessageSize();
+    /// <summary>
+    /// The maximum size supported by a windows operating system that is vista
+    /// or newer.
+    /// </summary>
+    /// <remarks>
+    /// See ReportEvent API:
+    ///    http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx
+    /// ReportEvent's lpStrings parameter:
+    /// "A pointer to a buffer containing an array of 
+    /// null-terminated strings that are merged into the message before Event Viewer 
+    /// displays the string to the user. This parameter must be a valid pointer 
+    /// (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters."
+    /// 
+    /// Going beyond the size of 31839 will (at some point) corrupt the event log on Windows
+    /// Vista or higher! It may succeed for a while...but you will eventually run into the
+    /// error: "System.ComponentModel.Win32Exception : A device attached to the system is
+    /// not functioning", and the event log will then be corrupt (I was able to corrupt 
+    /// an event log using a length of 31877 on Windows 7).
+    /// 
+    /// The max size for Windows Vista or higher is documented here:
+    ///    http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx.
+    /// Going over this size may succeed a few times but the buffer will overrun and 
+    /// eventually corrupt the log (based on testing).
+    /// 
+    /// The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API.
+    /// The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a
+    /// terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the
+    /// buffer, given enough time).
+    /// </remarks>
+    private static readonly int MAX_EVENTLOG_MESSAGE_SIZE_VISTA_OR_NEWER = 31839 - 2;
 
-		/// <summary>
-		/// This method determines the maximum event log message size allowed for
-		/// the current environment.
-		/// </summary>
-		/// <returns></returns>
-		private static int GetMaxEventLogMessageSize()
-		{
-			if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major >= 6)
-				return MAX_EVENTLOG_MESSAGE_SIZE_VISTA_OR_NEWER;
-			return MAX_EVENTLOG_MESSAGE_SIZE_DEFAULT;
-		}
+    /// <summary>
+    /// The maximum size that the operating system supports for
+    /// a event log message.
+    /// </summary>
+    /// <remarks>
+    /// Used to determine the maximum string length that can be written
+    /// to the operating system event log and eventually truncate a string
+    /// that exceeds the limits.
+    /// </remarks>
+    private static readonly int MAX_EVENTLOG_MESSAGE_SIZE = GetMaxEventLogMessageSize();
 
-	    #endregion Private Static Fields
-	}
+    /// <summary>
+    /// This method determines the maximum event log message size allowed for
+    /// the current environment.
+    /// </summary>
+    /// <returns></returns>
+    private static int GetMaxEventLogMessageSize()
+    {
+      if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major >= 6)
+        return MAX_EVENTLOG_MESSAGE_SIZE_VISTA_OR_NEWER;
+      return MAX_EVENTLOG_MESSAGE_SIZE_DEFAULT;
+    }
+
+    #endregion Private Static Fields
+  }
 }
 
 #endif // !SSCLI
diff --git a/src/log4net/Appender/FileAppender.cs b/src/log4net/Appender/FileAppender.cs
index af0b387..4179190 100644
--- a/src/log4net/Appender/FileAppender.cs
+++ b/src/log4net/Appender/FileAppender.cs
@@ -36,1642 +36,1642 @@
 namespace log4net.Appender
 {
 #if !NETCF
-    /// <summary>
-    /// Appends logging events to a file.
-    /// </summary>
-    /// <remarks>
-    /// <para>
-    /// Logging events are sent to the file specified by
-    /// the <see cref="File"/> property.
-    /// </para>
-    /// <para>
-    /// The file can be opened in either append or overwrite mode 
-    /// by specifying the <see cref="AppendToFile"/> property.
-    /// If the file path is relative it is taken as relative from 
-    /// the application base directory. The file encoding can be
-    /// specified by setting the <see cref="Encoding"/> property.
-    /// </para>
-    /// <para>
-    /// The layout's <see cref="ILayout.Header"/> and <see cref="ILayout.Footer"/>
-    /// values will be written each time the file is opened and closed
-    /// respectively. If the <see cref="AppendToFile"/> property is <see langword="true"/>
-    /// then the file may contain multiple copies of the header and footer.
-    /// </para>
-    /// <para>
-    /// This appender will first try to open the file for writing when <see cref="ActivateOptions"/>
-    /// is called. This will typically be during configuration.
-    /// If the file cannot be opened for writing the appender will attempt
-    /// to open the file again each time a message is logged to the appender.
-    /// If the file cannot be opened for writing when a message is logged then
-    /// the message will be discarded by this appender.
-    /// </para>
-    /// <para>
-    /// The <see cref="FileAppender"/> supports pluggable file locking models via
-    /// the <see cref="LockingModel"/> property.
-    /// The default behavior, implemented by <see cref="FileAppender.ExclusiveLock"/> 
-    /// is to obtain an exclusive write lock on the file until this appender is closed.
-    /// The alternative models only hold a
-    /// write lock while the appender is writing a logging event (<see cref="FileAppender.MinimalLock"/>)
-    /// or synchronize by using a named system wide Mutex (<see cref="FileAppender.InterProcessLock"/>).
-    /// </para>
-    /// <para>
-    /// All locking strategies have issues and you should seriously consider using a different strategy that
-    /// avoids having multiple processes logging to the same file.
-    /// </para>
-    /// </remarks>
-    /// <author>Nicko Cadell</author>
-    /// <author>Gert Driesen</author>
-    /// <author>Rodrigo B. de Oliveira</author>
-    /// <author>Douglas de la Torre</author>
-    /// <author>Niall Daley</author>
+  /// <summary>
+  /// Appends logging events to a file.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Logging events are sent to the file specified by
+  /// the <see cref="File"/> property.
+  /// </para>
+  /// <para>
+  /// The file can be opened in either append or overwrite mode 
+  /// by specifying the <see cref="AppendToFile"/> property.
+  /// If the file path is relative it is taken as relative from 
+  /// the application base directory. The file encoding can be
+  /// specified by setting the <see cref="Encoding"/> property.
+  /// </para>
+  /// <para>
+  /// The layout's <see cref="ILayout.Header"/> and <see cref="ILayout.Footer"/>
+  /// values will be written each time the file is opened and closed
+  /// respectively. If the <see cref="AppendToFile"/> property is <see langword="true"/>
+  /// then the file may contain multiple copies of the header and footer.
+  /// </para>
+  /// <para>
+  /// This appender will first try to open the file for writing when <see cref="ActivateOptions"/>
+  /// is called. This will typically be during configuration.
+  /// If the file cannot be opened for writing the appender will attempt
+  /// to open the file again each time a message is logged to the appender.
+  /// If the file cannot be opened for writing when a message is logged then
+  /// the message will be discarded by this appender.
+  /// </para>
+  /// <para>
+  /// The <see cref="FileAppender"/> supports pluggable file locking models via
+  /// the <see cref="LockingModel"/> property.
+  /// The default behavior, implemented by <see cref="FileAppender.ExclusiveLock"/> 
+  /// is to obtain an exclusive write lock on the file until this appender is closed.
+  /// The alternative models only hold a
+  /// write lock while the appender is writing a logging event (<see cref="FileAppender.MinimalLock"/>)
+  /// or synchronize by using a named system wide Mutex (<see cref="FileAppender.InterProcessLock"/>).
+  /// </para>
+  /// <para>
+  /// All locking strategies have issues and you should seriously consider using a different strategy that
+  /// avoids having multiple processes logging to the same file.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Rodrigo B. de Oliveira</author>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Niall Daley</author>
 #else
-	/// <summary>
-	/// Appends logging events to a file.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Logging events are sent to the file specified by
-	/// the <see cref="File"/> property.
-	/// </para>
-	/// <para>
-	/// The file can be opened in either append or overwrite mode 
-	/// by specifying the <see cref="AppendToFile"/> property.
-	/// If the file path is relative it is taken as relative from 
-	/// the application base directory. The file encoding can be
-	/// specified by setting the <see cref="Encoding"/> property.
-	/// </para>
-	/// <para>
-	/// The layout's <see cref="ILayout.Header"/> and <see cref="ILayout.Footer"/>
-	/// values will be written each time the file is opened and closed
-	/// respectively. If the <see cref="AppendToFile"/> property is <see langword="true"/>
-	/// then the file may contain multiple copies of the header and footer.
-	/// </para>
-	/// <para>
-	/// This appender will first try to open the file for writing when <see cref="ActivateOptions"/>
-	/// is called. This will typically be during configuration.
-	/// If the file cannot be opened for writing the appender will attempt
-	/// to open the file again each time a message is logged to the appender.
-	/// If the file cannot be opened for writing when a message is logged then
-	/// the message will be discarded by this appender.
-	/// </para>
-	/// <para>
-	/// The <see cref="FileAppender"/> supports pluggable file locking models via
-	/// the <see cref="LockingModel"/> property.
-	/// The default behavior, implemented by <see cref="FileAppender.ExclusiveLock"/> 
-	/// is to obtain an exclusive write lock on the file until this appender is closed.
-	/// The alternative model only holds a
-	/// write lock while the appender is writing a logging event (<see cref="FileAppender.MinimalLock"/>).
-	/// </para>
-	/// <para>
-	/// All locking strategies have issues and you should seriously consider using a different strategy that
-	/// avoids having multiple processes logging to the same file.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Rodrigo B. de Oliveira</author>
-	/// <author>Douglas de la Torre</author>
-	/// <author>Niall Daley</author>
+  /// <summary>
+  /// Appends logging events to a file.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Logging events are sent to the file specified by
+  /// the <see cref="File"/> property.
+  /// </para>
+  /// <para>
+  /// The file can be opened in either append or overwrite mode 
+  /// by specifying the <see cref="AppendToFile"/> property.
+  /// If the file path is relative it is taken as relative from 
+  /// the application base directory. The file encoding can be
+  /// specified by setting the <see cref="Encoding"/> property.
+  /// </para>
+  /// <para>
+  /// The layout's <see cref="ILayout.Header"/> and <see cref="ILayout.Footer"/>
+  /// values will be written each time the file is opened and closed
+  /// respectively. If the <see cref="AppendToFile"/> property is <see langword="true"/>
+  /// then the file may contain multiple copies of the header and footer.
+  /// </para>
+  /// <para>
+  /// This appender will first try to open the file for writing when <see cref="ActivateOptions"/>
+  /// is called. This will typically be during configuration.
+  /// If the file cannot be opened for writing the appender will attempt
+  /// to open the file again each time a message is logged to the appender.
+  /// If the file cannot be opened for writing when a message is logged then
+  /// the message will be discarded by this appender.
+  /// </para>
+  /// <para>
+  /// The <see cref="FileAppender"/> supports pluggable file locking models via
+  /// the <see cref="LockingModel"/> property.
+  /// The default behavior, implemented by <see cref="FileAppender.ExclusiveLock"/> 
+  /// is to obtain an exclusive write lock on the file until this appender is closed.
+  /// The alternative model only holds a
+  /// write lock while the appender is writing a logging event (<see cref="FileAppender.MinimalLock"/>).
+  /// </para>
+  /// <para>
+  /// All locking strategies have issues and you should seriously consider using a different strategy that
+  /// avoids having multiple processes logging to the same file.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Rodrigo B. de Oliveira</author>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Niall Daley</author>
 #endif
-    public class FileAppender : TextWriterAppender
+  public class FileAppender : TextWriterAppender
+  {
+    #region LockingStream Inner Class
+
+    /// <summary>
+    /// Write only <see cref="Stream"/> that uses the <see cref="LockingModelBase"/> 
+    /// to manage access to an underlying resource.
+    /// </summary>
+    private sealed class LockingStream : Stream, IDisposable
     {
-        #region LockingStream Inner Class
-
-        /// <summary>
-        /// Write only <see cref="Stream"/> that uses the <see cref="LockingModelBase"/> 
-        /// to manage access to an underlying resource.
-        /// </summary>
-        private sealed class LockingStream : Stream, IDisposable
-        {
 #if !NETCR
-            [Serializable]
+      [Serializable]
 #endif
-            public sealed class LockStateException : LogException
-            {
-                public LockStateException(string message)
-                    : base(message)
-                {
-                }
+      public sealed class LockStateException : LogException
+      {
+        public LockStateException(string message)
+            : base(message)
+        {
+        }
 
-                public LockStateException()
-                {
-                }
+        public LockStateException()
+        {
+        }
 
-                public LockStateException(string message, Exception innerException) : base(message, innerException)
-                {
-                }
+        public LockStateException(string message, Exception innerException) : base(message, innerException)
+        {
+        }
 
 #if !NETCR && !NETSTANDARD1_3
-                private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context)
-                {
-                }
+        private LockStateException(SerializationInfo info, StreamingContext context) : base(info, context)
+        {
+        }
 #endif
-            }
+      }
 
-            private Stream m_realStream = null;
-            private LockingModelBase m_lockingModel = null;
-            private int m_lockLevel = 0;
+      private Stream m_realStream = null;
+      private LockingModelBase m_lockingModel = null;
+      private int m_lockLevel = 0;
 
-            public LockingStream(LockingModelBase locking)
-                : base()
-            {
-                if (locking == null)
-                {
-                    throw new ArgumentException("Locking model may not be null", "locking");
-                }
+      public LockingStream(LockingModelBase locking)
+          : base()
+      {
+        if (locking == null)
+        {
+          throw new ArgumentException("Locking model may not be null", "locking");
+        }
 
-                m_lockingModel = locking;
-            }
+        m_lockingModel = locking;
+      }
 
-            #region Override Implementation of Stream
+      #region Override Implementation of Stream
 
 #if NETSTANDARD
-			protected override void Dispose(bool disposing)
-			{
-				m_lockingModel.CloseFile();
-				base.Dispose(disposing);
-			}
+      protected override void Dispose(bool disposing)
+      {
+        m_lockingModel.CloseFile();
+        base.Dispose(disposing);
+      }
 #else
 
-            private int m_readTotal = -1;
+      private int m_readTotal = -1;
 
-            // Methods
-            public override IAsyncResult BeginRead(byte[] buffer,
-                int offset,
-                int count,
-                AsyncCallback callback,
-                object state)
-            {
-                AssertLocked();
-                IAsyncResult ret = m_realStream.BeginRead(buffer, offset, count, callback, state);
-                m_readTotal = EndRead(ret);
-                return ret;
-            }
+      // Methods
+      public override IAsyncResult BeginRead(byte[] buffer,
+          int offset,
+          int count,
+          AsyncCallback callback,
+          object state)
+      {
+        AssertLocked();
+        IAsyncResult ret = m_realStream.BeginRead(buffer, offset, count, callback, state);
+        m_readTotal = EndRead(ret);
+        return ret;
+      }
 
-            /// <summary>
-            /// True asynchronous writes are not supported, the implementation forces a synchronous write.
-            /// </summary>
-            public override IAsyncResult BeginWrite(byte[] buffer,
-                int offset,
-                int count,
-                AsyncCallback callback,
-                object state)
-            {
-                AssertLocked();
-                IAsyncResult ret = m_realStream.BeginWrite(buffer, offset, count, callback, state);
-                EndWrite(ret);
-                return ret;
-            }
+      /// <summary>
+      /// True asynchronous writes are not supported, the implementation forces a synchronous write.
+      /// </summary>
+      public override IAsyncResult BeginWrite(byte[] buffer,
+          int offset,
+          int count,
+          AsyncCallback callback,
+          object state)
+      {
+        AssertLocked();
+        IAsyncResult ret = m_realStream.BeginWrite(buffer, offset, count, callback, state);
+        EndWrite(ret);
+        return ret;
+      }
 
-            public override void Close()
-            {
-                m_lockingModel.CloseFile();
-            }
+      public override void Close()
+      {
+        m_lockingModel.CloseFile();
+      }
 
-            public override int EndRead(IAsyncResult asyncResult)
-            {
-                AssertLocked();
-                return m_readTotal;
-            }
+      public override int EndRead(IAsyncResult asyncResult)
+      {
+        AssertLocked();
+        return m_readTotal;
+      }
 
-            public override void EndWrite(IAsyncResult asyncResult)
-            {
-                //No-op, it has already been handled
-            }
+      public override void EndWrite(IAsyncResult asyncResult)
+      {
+        //No-op, it has already been handled
+      }
 #endif
 
 #if NET_4_5 || NETSTANDARD
-			public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
-			{
-				AssertLocked();
-				return m_realStream.ReadAsync(buffer, offset, count, cancellationToken);
-			}
+      public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+      {
+        AssertLocked();
+        return m_realStream.ReadAsync(buffer, offset, count, cancellationToken);
+      }
 
-			public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
-			{
-				AssertLocked(); 
-				return base.WriteAsync(buffer, offset, count, cancellationToken);
-			}
+      public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+      {
+        AssertLocked(); 
+        return base.WriteAsync(buffer, offset, count, cancellationToken);
+      }
 #endif
 
-            public override void Flush()
-            {
-                AssertLocked();
-                m_realStream.Flush();
-            }
+      public override void Flush()
+      {
+        AssertLocked();
+        m_realStream.Flush();
+      }
 
-            public override int Read(byte[] buffer, int offset, int count)
-            {
-                return m_realStream.Read(buffer, offset, count);
-            }
+      public override int Read(byte[] buffer, int offset, int count)
+      {
+        return m_realStream.Read(buffer, offset, count);
+      }
 
-            public override int ReadByte()
-            {
-                return m_realStream.ReadByte();
-            }
+      public override int ReadByte()
+      {
+        return m_realStream.ReadByte();
+      }
 
-            public override long Seek(long offset, SeekOrigin origin)
-            {
-                AssertLocked();
-                return m_realStream.Seek(offset, origin);
-            }
+      public override long Seek(long offset, SeekOrigin origin)
+      {
+        AssertLocked();
+        return m_realStream.Seek(offset, origin);
+      }
 
-            public override void SetLength(long value)
-            {
-                AssertLocked();
-                m_realStream.SetLength(value);
-            }
+      public override void SetLength(long value)
+      {
+        AssertLocked();
+        m_realStream.SetLength(value);
+      }
 
-            void IDisposable.Dispose()
-            {
+      void IDisposable.Dispose()
+      {
 #if NETSTANDARD
-				Dispose(true);
+        Dispose(true);
 #else
-                Close();
+        Close();
 #endif
-            }
+      }
 
-            public override void Write(byte[] buffer, int offset, int count)
-            {
-                AssertLocked();
-                m_realStream.Write(buffer, offset, count);
-            }
+      public override void Write(byte[] buffer, int offset, int count)
+      {
+        AssertLocked();
+        m_realStream.Write(buffer, offset, count);
+      }
 
-            public override void WriteByte(byte value)
-            {
-                AssertLocked();
-                m_realStream.WriteByte(value);
-            }
+      public override void WriteByte(byte value)
+      {
+        AssertLocked();
+        m_realStream.WriteByte(value);
+      }
 
-            // Properties
-            public override bool CanRead
-            {
-                get { return false; }
-            }
+      // Properties
+      public override bool CanRead
+      {
+        get { return false; }
+      }
 
-            public override bool CanSeek
-            {
-                get
-                {
-                    AssertLocked();
-                    return m_realStream.CanSeek;
-                }
-            }
-
-            public override bool CanWrite
-            {
-                get
-                {
-                    AssertLocked();
-                    return m_realStream.CanWrite;
-                }
-            }
-
-            public override long Length
-            {
-                get
-                {
-                    AssertLocked();
-                    return m_realStream.Length;
-                }
-            }
-
-            public override long Position
-            {
-                get
-                {
-                    AssertLocked();
-                    return m_realStream.Position;
-                }
-                set
-                {
-                    AssertLocked();
-                    m_realStream.Position = value;
-                }
-            }
-
-            #endregion Override Implementation of Stream
-
-            #region Locking Methods
-
-            private void AssertLocked()
-            {
-                if (m_realStream == null)
-                {
-                    throw new LockStateException("The file is not currently locked");
-                }
-            }
-
-            public bool AcquireLock()
-            {
-                bool ret = false;
-                lock (this)
-                {
-                    if (m_lockLevel == 0)
-                    {
-                        // If lock is already acquired, nop
-                        m_realStream = m_lockingModel.AcquireLock();
-                    }
-
-                    if (m_realStream != null)
-                    {
-                        m_lockLevel++;
-                        ret = true;
-                    }
-                }
-
-                return ret;
-            }
-
-            public void ReleaseLock()
-            {
-                lock (this)
-                {
-                    m_lockLevel--;
-                    if (m_lockLevel == 0)
-                    {
-                        // If already unlocked, nop
-                        m_lockingModel.ReleaseLock();
-                        m_realStream = null;
-                    }
-                }
-            }
-
-            #endregion Locking Methods
-        }
-
-        #endregion LockingStream Inner Class
-
-        #region Locking Models
-
-        /// <summary>
-        /// Locking model base class
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Base class for the locking models available to the <see cref="FileAppender"/> derived loggers.
-        /// </para>
-        /// </remarks>
-        public abstract class LockingModelBase
+      public override bool CanSeek
+      {
+        get
         {
-            private FileAppender m_appender = null;
-
-            /// <summary>
-            /// Open the output file
-            /// </summary>
-            /// <param name="filename">The filename to use</param>
-            /// <param name="append">Whether to append to the file, or overwrite</param>
-            /// <param name="encoding">The encoding to use</param>
-            /// <remarks>
-            /// <para>
-            /// Open the file specified and prepare for logging. 
-            /// No writes will be made until <see cref="AcquireLock"/> is called.
-            /// Must be called before any calls to <see cref="AcquireLock"/>,
-            /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
-            /// </para>
-            /// </remarks>
-            public abstract void OpenFile(string filename, bool append, Encoding encoding);
-
-            /// <summary>
-            /// Close the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Close the file. No further writes will be made.
-            /// </para>
-            /// </remarks>
-            public abstract void CloseFile();
-
-            /// <summary>
-            /// Initializes all resources used by this locking model.
-            /// </summary>
-            public abstract void ActivateOptions();
-
-            /// <summary>
-            /// Disposes all resources that were initialized by this locking model.
-            /// </summary>
-            public abstract void OnClose();
-
-            /// <summary>
-            /// Acquire the lock on the file
-            /// </summary>
-            /// <returns>A stream that is ready to be written to.</returns>
-            /// <remarks>
-            /// <para>
-            /// Acquire the lock on the file in preparation for writing to it. 
-            /// Return a stream pointing to the file. <see cref="ReleaseLock"/>
-            /// must be called to release the lock on the output file.
-            /// </para>
-            /// </remarks>
-            public abstract Stream AcquireLock();
-
-            /// <summary>
-            /// Release the lock on the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Release the lock on the file. No further writes will be made to the 
-            /// stream until <see cref="AcquireLock"/> is called again.
-            /// </para>
-            /// </remarks>
-            public abstract void ReleaseLock();
-
-            /// <summary>
-            /// Gets or sets the <see cref="FileAppender"/> for this LockingModel
-            /// </summary>
-            /// <value>
-            /// The <see cref="FileAppender"/> for this LockingModel
-            /// </value>
-            /// <remarks>
-            /// <para>
-            /// The file appender this locking model is attached to and working on
-            /// behalf of.
-            /// </para>
-            /// <para>
-            /// The file appender is used to locate the security context and the error handler to use.
-            /// </para>
-            /// <para>
-            /// The value of this property will be set before <see cref="OpenFile"/> is
-            /// called.
-            /// </para>
-            /// </remarks>
-            public FileAppender CurrentAppender
-            {
-                get { return m_appender; }
-                set { m_appender = value; }
-            }
-
-            /// <summary>
-            /// Helper method that creates a FileStream under CurrentAppender's SecurityContext.
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Typically called during OpenFile or AcquireLock. 
-            /// </para>
-            /// <para>
-            /// If the directory portion of the <paramref name="filename"/> does not exist, it is created
-            /// via Directory.CreateDirecctory.
-            /// </para>
-            /// </remarks>
-            /// <param name="filename"></param>
-            /// <param name="append"></param>
-            /// <param name="fileShare"></param>
-            /// <returns></returns>
-            protected Stream CreateStream(string filename, bool append, FileShare fileShare)
-            {
-                filename = Environment.ExpandEnvironmentVariables(filename);
-                using (CurrentAppender.SecurityContext.Impersonate(this))
-                {
-                    // Ensure that the directory structure exists
-                    string directoryFullName = Path.GetDirectoryName(filename);
-
-                    // Only create the directory if it does not exist
-                    // doing this check here resolves some permissions failures
-                    if (!Directory.Exists(directoryFullName))
-                    {
-                        Directory.CreateDirectory(directoryFullName);
-                    }
-
-                    FileMode fileOpenMode = append
-                        ? FileMode.Append
-                        : FileMode.Create;
-                    return new FileStream(filename, fileOpenMode, FileAccess.Write, fileShare);
-                }
-            }
-
-            /// <summary>
-            /// Helper method to close <paramref name="stream"/> under CurrentAppender's SecurityContext.
-            /// </summary>
-            /// <remarks>
-            /// Does not set <paramref name="stream"/> to null.
-            /// </remarks>
-            /// <param name="stream"></param>
-            protected void CloseStream(Stream stream)
-            {
-                using (CurrentAppender.SecurityContext.Impersonate(this))
-                {
-                    stream.Dispose();
-                }
-            }
+          AssertLocked();
+          return m_realStream.CanSeek;
         }
+      }
 
-        /// <summary>
-        /// Hold an exclusive lock on the output file
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Open the file once for writing and hold it open until <see cref="CloseFile"/> is called. 
-        /// Maintains an exclusive lock on the file during this time.
-        /// </para>
-        /// </remarks>
-        public class ExclusiveLock : LockingModelBase
+      public override bool CanWrite
+      {
+        get
         {
-            private Stream m_stream = null;
-
-            /// <summary>
-            /// Open the file specified and prepare for logging.
-            /// </summary>
-            /// <param name="filename">The filename to use</param>
-            /// <param name="append">Whether to append to the file, or overwrite</param>
-            /// <param name="encoding">The encoding to use</param>
-            /// <remarks>
-            /// <para>
-            /// Open the file specified and prepare for logging. 
-            /// No writes will be made until <see cref="AcquireLock"/> is called.
-            /// Must be called before any calls to <see cref="AcquireLock"/>,
-            /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
-            /// </para>
-            /// </remarks>
-            public override void OpenFile(string filename, bool append, Encoding encoding)
-            {
-                try
-                {
-                    m_stream = CreateStream(filename, append, FileShare.Read);
-                }
-                catch (Exception e1)
-                {
-                    CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " +
-                        e1.Message);
-                }
-            }
-
-            /// <summary>
-            /// Close the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Close the file. No further writes will be made.
-            /// </para>
-            /// </remarks>
-            public override void CloseFile()
-            {
-                CloseStream(m_stream);
-                m_stream = null;
-            }
-
-            /// <summary>
-            /// Acquire the lock on the file
-            /// </summary>
-            /// <returns>A stream that is ready to be written to.</returns>
-            /// <remarks>
-            /// <para>
-            /// Does nothing. The lock is already taken
-            /// </para>
-            /// </remarks>
-            public override Stream AcquireLock()
-            {
-                return m_stream;
-            }
-
-            /// <summary>
-            /// Release the lock on the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Does nothing. The lock will be released when the file is closed.
-            /// </para>
-            /// </remarks>
-            public override void ReleaseLock()
-            {
-                //NOP
-            }
-
-            /// <summary>
-            /// Initializes all resources used by this locking model.
-            /// </summary>
-            public override void ActivateOptions()
-            {
-                //NOP
-            }
-
-            /// <summary>
-            /// Disposes all resources that were initialized by this locking model.
-            /// </summary>
-            public override void OnClose()
-            {
-                //NOP
-            }
+          AssertLocked();
+          return m_realStream.CanWrite;
         }
+      }
 
-        /// <summary>
-        /// Acquires the file lock for each write
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Opens the file once for each <see cref="AcquireLock"/>/<see cref="ReleaseLock"/> cycle, 
-        /// thus holding the lock for the minimal amount of time. This method of locking
-        /// is considerably slower than <see cref="FileAppender.ExclusiveLock"/> but allows 
-        /// other processes to move/delete the log file whilst logging continues.
-        /// </para>
-        /// </remarks>
-        public class MinimalLock : LockingModelBase
+      public override long Length
+      {
+        get
         {
-            private string m_filename;
-            private bool m_append;
-            private Stream m_stream = null;
-
-            /// <summary>
-            /// Prepares to open the file when the first message is logged.
-            /// </summary>
-            /// <param name="filename">The filename to use</param>
-            /// <param name="append">Whether to append to the file, or overwrite</param>
-            /// <param name="encoding">The encoding to use</param>
-            /// <remarks>
-            /// <para>
-            /// Open the file specified and prepare for logging. 
-            /// No writes will be made until <see cref="AcquireLock"/> is called.
-            /// Must be called before any calls to <see cref="AcquireLock"/>,
-            /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
-            /// </para>
-            /// </remarks>
-            public override void OpenFile(string filename, bool append, Encoding encoding)
-            {
-                m_filename = filename;
-                m_append = append;
-            }
-
-            /// <summary>
-            /// Close the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Close the file. No further writes will be made.
-            /// </para>
-            /// </remarks>
-            public override void CloseFile()
-            {
-                // NOP
-            }
-
-            /// <summary>
-            /// Acquire the lock on the file
-            /// </summary>
-            /// <returns>A stream that is ready to be written to.</returns>
-            /// <remarks>
-            /// <para>
-            /// Acquire the lock on the file in preparation for writing to it. 
-            /// Return a stream pointing to the file. <see cref="ReleaseLock"/>
-            /// must be called to release the lock on the output file.
-            /// </para>
-            /// </remarks>
-            public override Stream AcquireLock()
-            {
-                if (m_stream == null)
-                {
-                    try
-                    {
-                        m_stream = CreateStream(m_filename, m_append, FileShare.Read);
-                        m_append = true;
-                    }
-                    catch (Exception e1)
-                    {
-                        CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + m_filename + ". " +
-                            e1.Message);
-                    }
-                }
-
-                return m_stream;
-            }
-
-            /// <summary>
-            /// Release the lock on the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Release the lock on the file. No further writes will be made to the 
-            /// stream until <see cref="AcquireLock"/> is called again.
-            /// </para>
-            /// </remarks>
-            public override void ReleaseLock()
-            {
-                CloseStream(m_stream);
-                m_stream = null;
-            }
-
-            /// <summary>
-            /// Initializes all resources used by this locking model.
-            /// </summary>
-            public override void ActivateOptions()
-            {
-                //NOP
-            }
-
-            /// <summary>
-            /// Disposes all resources that were initialized by this locking model.
-            /// </summary>
-            public override void OnClose()
-            {
-                //NOP
-            }
+          AssertLocked();
+          return m_realStream.Length;
         }
+      }
+
+      public override long Position
+      {
+        get
+        {
+          AssertLocked();
+          return m_realStream.Position;
+        }
+        set
+        {
+          AssertLocked();
+          m_realStream.Position = value;
+        }
+      }
+
+      #endregion Override Implementation of Stream
+
+      #region Locking Methods
+
+      private void AssertLocked()
+      {
+        if (m_realStream == null)
+        {
+          throw new LockStateException("The file is not currently locked");
+        }
+      }
+
+      public bool AcquireLock()
+      {
+        bool ret = false;
+        lock (this)
+        {
+          if (m_lockLevel == 0)
+          {
+            // If lock is already acquired, nop
+            m_realStream = m_lockingModel.AcquireLock();
+          }
+
+          if (m_realStream != null)
+          {
+            m_lockLevel++;
+            ret = true;
+          }
+        }
+
+        return ret;
+      }
+
+      public void ReleaseLock()
+      {
+        lock (this)
+        {
+          m_lockLevel--;
+          if (m_lockLevel == 0)
+          {
+            // If already unlocked, nop
+            m_lockingModel.ReleaseLock();
+            m_realStream = null;
+          }
+        }
+      }
+
+      #endregion Locking Methods
+    }
+
+    #endregion LockingStream Inner Class
+
+    #region Locking Models
+
+    /// <summary>
+    /// Locking model base class
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Base class for the locking models available to the <see cref="FileAppender"/> derived loggers.
+    /// </para>
+    /// </remarks>
+    public abstract class LockingModelBase
+    {
+      private FileAppender m_appender = null;
+
+      /// <summary>
+      /// Open the output file
+      /// </summary>
+      /// <param name="filename">The filename to use</param>
+      /// <param name="append">Whether to append to the file, or overwrite</param>
+      /// <param name="encoding">The encoding to use</param>
+      /// <remarks>
+      /// <para>
+      /// Open the file specified and prepare for logging. 
+      /// No writes will be made until <see cref="AcquireLock"/> is called.
+      /// Must be called before any calls to <see cref="AcquireLock"/>,
+      /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
+      /// </para>
+      /// </remarks>
+      public abstract void OpenFile(string filename, bool append, Encoding encoding);
+
+      /// <summary>
+      /// Close the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Close the file. No further writes will be made.
+      /// </para>
+      /// </remarks>
+      public abstract void CloseFile();
+
+      /// <summary>
+      /// Initializes all resources used by this locking model.
+      /// </summary>
+      public abstract void ActivateOptions();
+
+      /// <summary>
+      /// Disposes all resources that were initialized by this locking model.
+      /// </summary>
+      public abstract void OnClose();
+
+      /// <summary>
+      /// Acquire the lock on the file
+      /// </summary>
+      /// <returns>A stream that is ready to be written to.</returns>
+      /// <remarks>
+      /// <para>
+      /// Acquire the lock on the file in preparation for writing to it. 
+      /// Return a stream pointing to the file. <see cref="ReleaseLock"/>
+      /// must be called to release the lock on the output file.
+      /// </para>
+      /// </remarks>
+      public abstract Stream AcquireLock();
+
+      /// <summary>
+      /// Release the lock on the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Release the lock on the file. No further writes will be made to the 
+      /// stream until <see cref="AcquireLock"/> is called again.
+      /// </para>
+      /// </remarks>
+      public abstract void ReleaseLock();
+
+      /// <summary>
+      /// Gets or sets the <see cref="FileAppender"/> for this LockingModel
+      /// </summary>
+      /// <value>
+      /// The <see cref="FileAppender"/> for this LockingModel
+      /// </value>
+      /// <remarks>
+      /// <para>
+      /// The file appender this locking model is attached to and working on
+      /// behalf of.
+      /// </para>
+      /// <para>
+      /// The file appender is used to locate the security context and the error handler to use.
+      /// </para>
+      /// <para>
+      /// The value of this property will be set before <see cref="OpenFile"/> is
+      /// called.
+      /// </para>
+      /// </remarks>
+      public FileAppender CurrentAppender
+      {
+        get { return m_appender; }
+        set { m_appender = value; }
+      }
+
+      /// <summary>
+      /// Helper method that creates a FileStream under CurrentAppender's SecurityContext.
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Typically called during OpenFile or AcquireLock. 
+      /// </para>
+      /// <para>
+      /// If the directory portion of the <paramref name="filename"/> does not exist, it is created
+      /// via Directory.CreateDirecctory.
+      /// </para>
+      /// </remarks>
+      /// <param name="filename"></param>
+      /// <param name="append"></param>
+      /// <param name="fileShare"></param>
+      /// <returns></returns>
+      protected Stream CreateStream(string filename, bool append, FileShare fileShare)
+      {
+        filename = Environment.ExpandEnvironmentVariables(filename);
+        using (CurrentAppender.SecurityContext.Impersonate(this))
+        {
+          // Ensure that the directory structure exists
+          string directoryFullName = Path.GetDirectoryName(filename);
+
+          // Only create the directory if it does not exist
+          // doing this check here resolves some permissions failures
+          if (!Directory.Exists(directoryFullName))
+          {
+            Directory.CreateDirectory(directoryFullName);
+          }
+
+          FileMode fileOpenMode = append
+              ? FileMode.Append
+              : FileMode.Create;
+          return new FileStream(filename, fileOpenMode, FileAccess.Write, fileShare);
+        }
+      }
+
+      /// <summary>
+      /// Helper method to close <paramref name="stream"/> under CurrentAppender's SecurityContext.
+      /// </summary>
+      /// <remarks>
+      /// Does not set <paramref name="stream"/> to null.
+      /// </remarks>
+      /// <param name="stream"></param>
+      protected void CloseStream(Stream stream)
+      {
+        using (CurrentAppender.SecurityContext.Impersonate(this))
+        {
+          stream.Dispose();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Hold an exclusive lock on the output file
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Open the file once for writing and hold it open until <see cref="CloseFile"/> is called. 
+    /// Maintains an exclusive lock on the file during this time.
+    /// </para>
+    /// </remarks>
+    public class ExclusiveLock : LockingModelBase
+    {
+      private Stream m_stream = null;
+
+      /// <summary>
+      /// Open the file specified and prepare for logging.
+      /// </summary>
+      /// <param name="filename">The filename to use</param>
+      /// <param name="append">Whether to append to the file, or overwrite</param>
+      /// <param name="encoding">The encoding to use</param>
+      /// <remarks>
+      /// <para>
+      /// Open the file specified and prepare for logging. 
+      /// No writes will be made until <see cref="AcquireLock"/> is called.
+      /// Must be called before any calls to <see cref="AcquireLock"/>,
+      /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
+      /// </para>
+      /// </remarks>
+      public override void OpenFile(string filename, bool append, Encoding encoding)
+      {
+        try
+        {
+          m_stream = CreateStream(filename, append, FileShare.Read);
+        }
+        catch (Exception e1)
+        {
+          CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " +
+              e1.Message);
+        }
+      }
+
+      /// <summary>
+      /// Close the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Close the file. No further writes will be made.
+      /// </para>
+      /// </remarks>
+      public override void CloseFile()
+      {
+        CloseStream(m_stream);
+        m_stream = null;
+      }
+
+      /// <summary>
+      /// Acquire the lock on the file
+      /// </summary>
+      /// <returns>A stream that is ready to be written to.</returns>
+      /// <remarks>
+      /// <para>
+      /// Does nothing. The lock is already taken
+      /// </para>
+      /// </remarks>
+      public override Stream AcquireLock()
+      {
+        return m_stream;
+      }
+
+      /// <summary>
+      /// Release the lock on the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Does nothing. The lock will be released when the file is closed.
+      /// </para>
+      /// </remarks>
+      public override void ReleaseLock()
+      {
+        //NOP
+      }
+
+      /// <summary>
+      /// Initializes all resources used by this locking model.
+      /// </summary>
+      public override void ActivateOptions()
+      {
+        //NOP
+      }
+
+      /// <summary>
+      /// Disposes all resources that were initialized by this locking model.
+      /// </summary>
+      public override void OnClose()
+      {
+        //NOP
+      }
+    }
+
+    /// <summary>
+    /// Acquires the file lock for each write
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Opens the file once for each <see cref="AcquireLock"/>/<see cref="ReleaseLock"/> cycle, 
+    /// thus holding the lock for the minimal amount of time. This method of locking
+    /// is considerably slower than <see cref="FileAppender.ExclusiveLock"/> but allows 
+    /// other processes to move/delete the log file whilst logging continues.
+    /// </para>
+    /// </remarks>
+    public class MinimalLock : LockingModelBase
+    {
+      private string m_filename;
+      private bool m_append;
+      private Stream m_stream = null;
+
+      /// <summary>
+      /// Prepares to open the file when the first message is logged.
+      /// </summary>
+      /// <param name="filename">The filename to use</param>
+      /// <param name="append">Whether to append to the file, or overwrite</param>
+      /// <param name="encoding">The encoding to use</param>
+      /// <remarks>
+      /// <para>
+      /// Open the file specified and prepare for logging. 
+      /// No writes will be made until <see cref="AcquireLock"/> is called.
+      /// Must be called before any calls to <see cref="AcquireLock"/>,
+      /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
+      /// </para>
+      /// </remarks>
+      public override void OpenFile(string filename, bool append, Encoding encoding)
+      {
+        m_filename = filename;
+        m_append = append;
+      }
+
+      /// <summary>
+      /// Close the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Close the file. No further writes will be made.
+      /// </para>
+      /// </remarks>
+      public override void CloseFile()
+      {
+        // NOP
+      }
+
+      /// <summary>
+      /// Acquire the lock on the file
+      /// </summary>
+      /// <returns>A stream that is ready to be written to.</returns>
+      /// <remarks>
+      /// <para>
+      /// Acquire the lock on the file in preparation for writing to it. 
+      /// Return a stream pointing to the file. <see cref="ReleaseLock"/>
+      /// must be called to release the lock on the output file.
+      /// </para>
+      /// </remarks>
+      public override Stream AcquireLock()
+      {
+        if (m_stream == null)
+        {
+          try
+          {
+            m_stream = CreateStream(m_filename, m_append, FileShare.Read);
+            m_append = true;
+          }
+          catch (Exception e1)
+          {
+            CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + m_filename + ". " +
+                e1.Message);
+          }
+        }
+
+        return m_stream;
+      }
+
+      /// <summary>
+      /// Release the lock on the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Release the lock on the file. No further writes will be made to the 
+      /// stream until <see cref="AcquireLock"/> is called again.
+      /// </para>
+      /// </remarks>
+      public override void ReleaseLock()
+      {
+        CloseStream(m_stream);
+        m_stream = null;
+      }
+
+      /// <summary>
+      /// Initializes all resources used by this locking model.
+      /// </summary>
+      public override void ActivateOptions()
+      {
+        //NOP
+      }
+
+      /// <summary>
+      /// Disposes all resources that were initialized by this locking model.
+      /// </summary>
+      public override void OnClose()
+      {
+        //NOP
+      }
+    }
 
 #if !NETCF
-        /// <summary>
-        /// Provides cross-process file locking.
-        /// </summary>
-        /// <author>Ron Grabowski</author>
-        /// <author>Steve Wranovsky</author>
-        public class InterProcessLock : LockingModelBase
-        {
-            private Mutex m_mutex = null;
-            private Stream m_stream = null;
-            private int m_recursiveWatch = 0;
+    /// <summary>
+    /// Provides cross-process file locking.
+    /// </summary>
+    /// <author>Ron Grabowski</author>
+    /// <author>Steve Wranovsky</author>
+    public class InterProcessLock : LockingModelBase
+    {
+      private Mutex m_mutex = null;
+      private Stream m_stream = null;
+      private int m_recursiveWatch = 0;
 
-            /// <summary>
-            /// Open the file specified and prepare for logging.
-            /// </summary>
-            /// <param name="filename">The filename to use</param>
-            /// <param name="append">Whether to append to the file, or overwrite</param>
-            /// <param name="encoding">The encoding to use</param>
-            /// <remarks>
-            /// <para>
-            /// Open the file specified and prepare for logging. 
-            /// No writes will be made until <see cref="AcquireLock"/> is called.
-            /// Must be called before any calls to <see cref="AcquireLock"/>,
-            /// -<see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
-            /// </para>
-            /// </remarks>
+      /// <summary>
+      /// Open the file specified and prepare for logging.
+      /// </summary>
+      /// <param name="filename">The filename to use</param>
+      /// <param name="append">Whether to append to the file, or overwrite</param>
+      /// <param name="encoding">The encoding to use</param>
+      /// <remarks>
+      /// <para>
+      /// Open the file specified and prepare for logging. 
+      /// No writes will be made until <see cref="AcquireLock"/> is called.
+      /// Must be called before any calls to <see cref="AcquireLock"/>,
+      /// -<see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
+      /// </para>
+      /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-			[System.Security.SecuritySafeCritical]
+      [System.Security.SecuritySafeCritical]
 #endif
-            public override void OpenFile(string filename, bool append, Encoding encoding)
+      public override void OpenFile(string filename, bool append, Encoding encoding)
+      {
+        try
+        {
+          m_stream = CreateStream(filename, append, FileShare.ReadWrite);
+        }
+        catch (Exception e1)
+        {
+          CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " +
+              e1.Message);
+        }
+      }
+
+      /// <summary>
+      /// Close the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Close the file. No further writes will be made.
+      /// </para>
+      /// </remarks>
+      public override void CloseFile()
+      {
+        try
+        {
+          CloseStream(m_stream);
+          m_stream = null;
+        }
+        finally
+        {
+          ReleaseLock();
+        }
+      }
+
+      /// <summary>
+      /// Acquire the lock on the file
+      /// </summary>
+      /// <returns>A stream that is ready to be written to.</returns>
+      /// <remarks>
+      /// <para>
+      /// Does nothing. The lock is already taken
+      /// </para>
+      /// </remarks>
+      public override Stream AcquireLock()
+      {
+        if (m_mutex != null)
+        {
+          // TODO: add timeout?
+          m_mutex.WaitOne();
+
+          // increment recursive watch
+          m_recursiveWatch++;
+
+          // should always be true (and fast) for FileStream
+          if (m_stream != null)
+          {
+            if (m_stream.CanSeek)
             {
-                try
-                {
-                    m_stream = CreateStream(filename, append, FileShare.ReadWrite);
-                }
-                catch (Exception e1)
-                {
-                    CurrentAppender.ErrorHandler.Error("Unable to acquire lock on file " + filename + ". " +
-                        e1.Message);
-                }
+              m_stream.Seek(0, SeekOrigin.End);
             }
+          }
+          else
+          {
+            // this can happen when the file appender cannot open a file for writing
+          }
+        }
+        else
+        {
+          CurrentAppender.ErrorHandler.Error(
+              "Programming error, no mutex available to acquire lock! From here on things will be dangerous!");
+        }
 
-            /// <summary>
-            /// Close the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Close the file. No further writes will be made.
-            /// </para>
-            /// </remarks>
-            public override void CloseFile()
-            {
-                try
-                {
-                    CloseStream(m_stream);
-                    m_stream = null;
-                }
-                finally
-                {
-                    ReleaseLock();
-                }
-            }
+        return m_stream;
+      }
 
-            /// <summary>
-            /// Acquire the lock on the file
-            /// </summary>
-            /// <returns>A stream that is ready to be written to.</returns>
-            /// <remarks>
-            /// <para>
-            /// Does nothing. The lock is already taken
-            /// </para>
-            /// </remarks>
-            public override Stream AcquireLock()
-            {
-                if (m_mutex != null)
-                {
-                    // TODO: add timeout?
-                    m_mutex.WaitOne();
+      /// <summary>
+      /// Releases the lock and allows others to acquire a lock.
+      /// </summary>
+      public override void ReleaseLock()
+      {
+        if (m_mutex != null)
+        {
+          if (m_recursiveWatch > 0)
+          {
+            m_recursiveWatch--;
+            m_mutex.ReleaseMutex();
+          }
+        }
+        else
+        {
+          CurrentAppender.ErrorHandler.Error("Programming error, no mutex available to release the lock!");
+        }
+      }
 
-                    // increment recursive watch
-                    m_recursiveWatch++;
+      /// <summary>
+      /// Initializes all resources used by this locking model.
+      /// </summary>
+      public override void ActivateOptions()
+      {
+        if (m_mutex == null)
+        {
+          string mutexFriendlyFilename = CurrentAppender.File
+              .Replace("\\", "_")
+              .Replace(":", "_")
+              .Replace("/", "_");
 
-                    // should always be true (and fast) for FileStream
-                    if (m_stream != null)
-                    {
-                        if (m_stream.CanSeek)
-                        {
-                            m_stream.Seek(0, SeekOrigin.End);
-                        }
-                    }
-                    else
-                    {
-                        // this can happen when the file appender cannot open a file for writing
-                    }
-                }
-                else
-                {
-                    CurrentAppender.ErrorHandler.Error(
-                        "Programming error, no mutex available to acquire lock! From here on things will be dangerous!");
-                }
+          m_mutex = new Mutex(false, mutexFriendlyFilename);
+        }
+        else
+        {
+          CurrentAppender.ErrorHandler.Error("Programming error, mutex already initialized!");
+        }
+      }
 
-                return m_stream;
-            }
-
-            /// <summary>
-            /// Releases the lock and allows others to acquire a lock.
-            /// </summary>
-            public override void ReleaseLock()
-            {
-                if (m_mutex != null)
-                {
-                    if (m_recursiveWatch > 0)
-                    {
-                        m_recursiveWatch--;
-                        m_mutex.ReleaseMutex();
-                    }
-                }
-                else
-                {
-                    CurrentAppender.ErrorHandler.Error("Programming error, no mutex available to release the lock!");
-                }
-            }
-
-            /// <summary>
-            /// Initializes all resources used by this locking model.
-            /// </summary>
-            public override void ActivateOptions()
-            {
-                if (m_mutex == null)
-                {
-                    string mutexFriendlyFilename = CurrentAppender.File
-                        .Replace("\\", "_")
-                        .Replace(":", "_")
-                        .Replace("/", "_");
-
-                    m_mutex = new Mutex(false, mutexFriendlyFilename);
-                }
-                else
-                {
-                    CurrentAppender.ErrorHandler.Error("Programming error, mutex already initialized!");
-                }
-            }
-
-            /// <summary>
-            /// Disposes all resources that were initialized by this locking model.
-            /// </summary>
-            public override void OnClose()
-            {
-                if (m_mutex != null)
-                {
+      /// <summary>
+      /// Disposes all resources that were initialized by this locking model.
+      /// </summary>
+      public override void OnClose()
+      {
+        if (m_mutex != null)
+        {
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-					m_mutex.Dispose();
+          m_mutex.Dispose();
 #else
-                    m_mutex.Close();
+          m_mutex.Close();
 #endif
-                    m_mutex = null;
-                }
-                else
-                {
-                    CurrentAppender.ErrorHandler.Error("Programming error, mutex not initialized!");
-                }
-            }
+          m_mutex = null;
         }
+        else
+        {
+          CurrentAppender.ErrorHandler.Error("Programming error, mutex not initialized!");
+        }
+      }
+    }
 #endif
 
-        /// <summary>
-        /// Hold no lock on the output file
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Open the file once and hold it open until <see cref="CloseFile"/> is called. 
-        /// Maintains no lock on the file during this time.
-        /// </para>
-        /// </remarks>
-        public class NoLock : LockingModelBase
+    /// <summary>
+    /// Hold no lock on the output file
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Open the file once and hold it open until <see cref="CloseFile"/> is called. 
+    /// Maintains no lock on the file during this time.
+    /// </para>
+    /// </remarks>
+    public class NoLock : LockingModelBase
+    {
+      private Stream m_stream = null;
+
+      /// <summary>
+      /// Open the file specified and prepare for logging.
+      /// </summary>
+      /// <param name="filename">The filename to use</param>
+      /// <param name="append">Whether to append to the file, or overwrite</param>
+      /// <param name="encoding">The encoding to use</param>
+      /// <remarks>
+      /// <para>
+      /// Open the file specified and prepare for logging. 
+      /// No writes will be made until <see cref="AcquireLock"/> is called.
+      /// Must be called before any calls to <see cref="AcquireLock"/>,
+      /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
+      /// </para>
+      /// </remarks>
+      public override void OpenFile(string filename, bool append, Encoding encoding)
+      {
+        try
         {
-            private Stream m_stream = null;
-
-            /// <summary>
-            /// Open the file specified and prepare for logging.
-            /// </summary>
-            /// <param name="filename">The filename to use</param>
-            /// <param name="append">Whether to append to the file, or overwrite</param>
-            /// <param name="encoding">The encoding to use</param>
-            /// <remarks>
-            /// <para>
-            /// Open the file specified and prepare for logging. 
-            /// No writes will be made until <see cref="AcquireLock"/> is called.
-            /// Must be called before any calls to <see cref="AcquireLock"/>,
-            /// <see cref="ReleaseLock"/> and <see cref="CloseFile"/>.
-            /// </para>
-            /// </remarks>
-            public override void OpenFile(string filename, bool append, Encoding encoding)
-            {
-                try
-                {
-                    // no lock
-                    m_stream = CreateStream(filename, append, FileShare.ReadWrite);
-                }
-                catch (Exception e1)
-                {
-                    CurrentAppender.ErrorHandler.Error(
-                        $"Unable to acquire lock on file {filename}. {e1.Message}"
-                    );
-                }
-            }
-
-            /// <summary>
-            /// Close the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Close the file. No further writes will be made.
-            /// </para>
-            /// </remarks>
-            public override void CloseFile()
-            {
-                CloseStream(m_stream);
-                m_stream = null;
-            }
-
-            /// <summary>
-            /// Acquire the lock on the file
-            /// </summary>
-            /// <returns>A stream that is ready to be written to.</returns>
-            /// <remarks>
-            /// <para>
-            /// Does nothing. The lock is already taken
-            /// </para>
-            /// </remarks>
-            public override Stream AcquireLock()
-            {
-                return m_stream;
-            }
-
-            /// <summary>
-            /// Release the lock on the file
-            /// </summary>
-            /// <remarks>
-            /// <para>
-            /// Does nothing. The lock will be released when the file is closed.
-            /// </para>
-            /// </remarks>
-            public override void ReleaseLock()
-            {
-                // NOP
-            }
-
-            /// <summary>
-            /// Initializes all resources used by this locking model.
-            /// </summary>
-            public override void ActivateOptions()
-            {
-                // NOP
-            }
-
-            /// <summary>
-            /// Disposes all resources that were initialized by this locking model.
-            /// </summary>
-            public override void OnClose()
-            {
-                // NOP
-            }
+          // no lock
+          m_stream = CreateStream(filename, append, FileShare.ReadWrite);
         }
-
-        /// <summary>
-        /// Default locking model (when no locking model was configured)
-        /// </summary>
-        private static Type defaultLockingModelType = typeof(ExclusiveLock);
-
-        /// <summary>
-        /// Specify default locking model
-        /// </summary>
-        /// <typeparam name="TLockingModel">Type of LockingModel</typeparam>
-        public static void SetDefaultLockingModelType<TLockingModel>() where TLockingModel : LockingModelBase
+        catch (Exception e1)
         {
-            defaultLockingModelType = typeof(TLockingModel);
+          CurrentAppender.ErrorHandler.Error(
+              $"Unable to acquire lock on file {filename}. {e1.Message}"
+          );
         }
+      }
 
-        #endregion Locking Models
+      /// <summary>
+      /// Close the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Close the file. No further writes will be made.
+      /// </para>
+      /// </remarks>
+      public override void CloseFile()
+      {
+        CloseStream(m_stream);
+        m_stream = null;
+      }
 
-        #region Public Instance Constructors
+      /// <summary>
+      /// Acquire the lock on the file
+      /// </summary>
+      /// <returns>A stream that is ready to be written to.</returns>
+      /// <remarks>
+      /// <para>
+      /// Does nothing. The lock is already taken
+      /// </para>
+      /// </remarks>
+      public override Stream AcquireLock()
+      {
+        return m_stream;
+      }
 
-        /// <summary>
-        /// Default constructor
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Default constructor
-        /// </para>
-        /// </remarks>
-        public FileAppender()
-        {
-        }
+      /// <summary>
+      /// Release the lock on the file
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Does nothing. The lock will be released when the file is closed.
+      /// </para>
+      /// </remarks>
+      public override void ReleaseLock()
+      {
+        // NOP
+      }
 
-        /// <summary>
-        /// Construct a new appender using the layout, file and append mode.
-        /// </summary>
-        /// <param name="layout">the layout to use with this appender</param>
-        /// <param name="filename">the full path to the file to write to</param>
-        /// <param name="append">flag to indicate if the file should be appended to</param>
-        /// <remarks>
-        /// <para>
-        /// Obsolete constructor.
-        /// </para>
-        /// </remarks>
-        [Obsolete("Instead use the default constructor and set the Layout, File & AppendToFile properties")]
-        public FileAppender(ILayout layout, string filename, bool append)
-        {
-            Layout = layout;
-            File = filename;
-            AppendToFile = append;
-            ActivateOptions();
-        }
+      /// <summary>
+      /// Initializes all resources used by this locking model.
+      /// </summary>
+      public override void ActivateOptions()
+      {
+        // NOP
+      }
 
-        /// <summary>
-        /// Construct a new appender using the layout and file specified.
-        /// The file will be appended to.
-        /// </summary>
-        /// <param name="layout">the layout to use with this appender</param>
-        /// <param name="filename">the full path to the file to write to</param>
-        /// <remarks>
-        /// <para>
-        /// Obsolete constructor.
-        /// </para>
-        /// </remarks>
-        [Obsolete("Instead use the default constructor and set the Layout & File properties")]
-        public FileAppender(ILayout layout, string filename)
-            : this(layout, filename, true)
-        {
-        }
+      /// <summary>
+      /// Disposes all resources that were initialized by this locking model.
+      /// </summary>
+      public override void OnClose()
+      {
+        // NOP
+      }
+    }
 
-        #endregion Public Instance Constructors
+    /// <summary>
+    /// Default locking model (when no locking model was configured)
+    /// </summary>
+    private static Type defaultLockingModelType = typeof(ExclusiveLock);
 
-        #region Public Instance Properties
+    /// <summary>
+    /// Specify default locking model
+    /// </summary>
+    /// <typeparam name="TLockingModel">Type of LockingModel</typeparam>
+    public static void SetDefaultLockingModelType<TLockingModel>() where TLockingModel : LockingModelBase
+    {
+      defaultLockingModelType = typeof(TLockingModel);
+    }
 
-        /// <summary>
-        /// Gets or sets the path to the file that logging will be written to.
-        /// </summary>
-        /// <value>
-        /// The path to the file that logging will be written to.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// If the path is relative it is taken as relative from 
-        /// the application base directory.
-        /// </para>
-        /// </remarks>
-        public virtual string File
-        {
-            get { return m_fileName; }
-            set { m_fileName = value; }
-        }
+    #endregion Locking Models
 
-        /// <summary>
-        /// Gets or sets a flag that indicates whether the file should be
-        /// appended to or overwritten.
-        /// </summary>
-        /// <value>
-        /// Indicates whether the file should be appended to or overwritten.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// If the value is set to false then the file will be overwritten, if 
-        /// it is set to true then the file will be appended to.
-        /// </para>
-        /// The default value is true.
-        /// </remarks>
-        public bool AppendToFile
-        {
-            get { return m_appendToFile; }
-            set { m_appendToFile = value; }
-        }
+    #region Public Instance Constructors
 
-        /// <summary>
-        /// Gets or sets <see cref="Encoding"/> used to write to the file.
-        /// </summary>
-        /// <value>
-        /// The <see cref="Encoding"/> used to write to the file.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// The default encoding set is <see cref="System.Text.Encoding.Default"/>
-        /// which is the encoding for the system's current ANSI code page.
-        /// </para>
-        /// </remarks>
-        public Encoding Encoding
-        {
-            get { return m_encoding; }
-            set { m_encoding = value; }
-        }
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public FileAppender()
+    {
+    }
 
-        /// <summary>
-        /// Gets or sets the <see cref="SecurityContext"/> used to write to the file.
-        /// </summary>
-        /// <value>
-        /// The <see cref="SecurityContext"/> used to write to the file.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Unless a <see cref="SecurityContext"/> specified here for this appender
-        /// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
-        /// security context to use. The default behavior is to use the security context
-        /// of the current thread.
-        /// </para>
-        /// </remarks>
-        public SecurityContext SecurityContext
-        {
-            get { return m_securityContext; }
-            set { m_securityContext = value; }
-        }
+    /// <summary>
+    /// Construct a new appender using the layout, file and append mode.
+    /// </summary>
+    /// <param name="layout">the layout to use with this appender</param>
+    /// <param name="filename">the full path to the file to write to</param>
+    /// <param name="append">flag to indicate if the file should be appended to</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout, File & AppendToFile properties")]
+    public FileAppender(ILayout layout, string filename, bool append)
+    {
+      Layout = layout;
+      File = filename;
+      AppendToFile = append;
+      ActivateOptions();
+    }
+
+    /// <summary>
+    /// Construct a new appender using the layout and file specified.
+    /// The file will be appended to.
+    /// </summary>
+    /// <param name="layout">the layout to use with this appender</param>
+    /// <param name="filename">the full path to the file to write to</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout & File properties")]
+    public FileAppender(ILayout layout, string filename)
+        : this(layout, filename, true)
+    {
+    }
+
+    #endregion Public Instance Constructors
+
+    #region Public Instance Properties
+
+    /// <summary>
+    /// Gets or sets the path to the file that logging will be written to.
+    /// </summary>
+    /// <value>
+    /// The path to the file that logging will be written to.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If the path is relative it is taken as relative from 
+    /// the application base directory.
+    /// </para>
+    /// </remarks>
+    public virtual string File
+    {
+      get { return m_fileName; }
+      set { m_fileName = value; }
+    }
+
+    /// <summary>
+    /// Gets or sets a flag that indicates whether the file should be
+    /// appended to or overwritten.
+    /// </summary>
+    /// <value>
+    /// Indicates whether the file should be appended to or overwritten.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If the value is set to false then the file will be overwritten, if 
+    /// it is set to true then the file will be appended to.
+    /// </para>
+    /// The default value is true.
+    /// </remarks>
+    public bool AppendToFile
+    {
+      get { return m_appendToFile; }
+      set { m_appendToFile = value; }
+    }
+
+    /// <summary>
+    /// Gets or sets <see cref="Encoding"/> used to write to the file.
+    /// </summary>
+    /// <value>
+    /// The <see cref="Encoding"/> used to write to the file.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The default encoding set is <see cref="System.Text.Encoding.Default"/>
+    /// which is the encoding for the system's current ANSI code page.
+    /// </para>
+    /// </remarks>
+    public Encoding Encoding
+    {
+      get { return m_encoding; }
+      set { m_encoding = value; }
+    }
+
+    /// <summary>
+    /// Gets or sets the <see cref="SecurityContext"/> used to write to the file.
+    /// </summary>
+    /// <value>
+    /// The <see cref="SecurityContext"/> used to write to the file.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Unless a <see cref="SecurityContext"/> specified here for this appender
+    /// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
+    /// security context to use. The default behavior is to use the security context
+    /// of the current thread.
+    /// </para>
+    /// </remarks>
+    public SecurityContext SecurityContext
+    {
+      get { return m_securityContext; }
+      set { m_securityContext = value; }
+    }
 
 #if NETCF
-		/// <summary>
-		/// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
-		/// </summary>
-		/// <value>
-		/// The <see cref="FileAppender.LockingModel"/> used to lock the file.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
-		/// </para>
-		/// <para>
-		/// There are two built in locking models, <see cref="FileAppender.ExclusiveLock"/> and <see cref="FileAppender.MinimalLock"/>.
-		/// The first locks the file from the start of logging to the end, the 
-		/// second locks only for the minimal amount of time when logging each message
-		/// and the last synchronizes processes using a named system wide Mutex.
-		/// </para>
-		/// <para>
-		/// The default locking model is the <see cref="FileAppender.ExclusiveLock"/>.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
+    /// </summary>
+    /// <value>
+    /// The <see cref="FileAppender.LockingModel"/> used to lock the file.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
+    /// </para>
+    /// <para>
+    /// There are two built in locking models, <see cref="FileAppender.ExclusiveLock"/> and <see cref="FileAppender.MinimalLock"/>.
+    /// The first locks the file from the start of logging to the end, the 
+    /// second locks only for the minimal amount of time when logging each message
+    /// and the last synchronizes processes using a named system wide Mutex.
+    /// </para>
+    /// <para>
+    /// The default locking model is the <see cref="FileAppender.ExclusiveLock"/>.
+    /// </para>
+    /// </remarks>
 #else
-        /// <summary>
-        /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
-        /// </summary>
-        /// <value>
-        /// The <see cref="FileAppender.LockingModel"/> used to lock the file.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
-        /// </para>
-        /// <para>
-        /// There are three built in locking models, <see cref="FileAppender.ExclusiveLock"/>, <see cref="FileAppender.MinimalLock"/> and <see cref="FileAppender.InterProcessLock"/> .
-        /// The first locks the file from the start of logging to the end, the 
-        /// second locks only for the minimal amount of time when logging each message
-        /// and the last synchronizes processes using a named system wide Mutex.
-        /// </para>
-        /// <para>
-        /// The default locking model is the <see cref="FileAppender.ExclusiveLock"/>.
-        /// </para>
-        /// </remarks>
+    /// <summary>
+    /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
+    /// </summary>
+    /// <value>
+    /// The <see cref="FileAppender.LockingModel"/> used to lock the file.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the <see cref="FileAppender.LockingModel"/> used to handle locking of the file.
+    /// </para>
+    /// <para>
+    /// There are three built in locking models, <see cref="FileAppender.ExclusiveLock"/>, <see cref="FileAppender.MinimalLock"/> and <see cref="FileAppender.InterProcessLock"/> .
+    /// The first locks the file from the start of logging to the end, the 
+    /// second locks only for the minimal amount of time when logging each message
+    /// and the last synchronizes processes using a named system wide Mutex.
+    /// </para>
+    /// <para>
+    /// The default locking model is the <see cref="FileAppender.ExclusiveLock"/>.
+    /// </para>
+    /// </remarks>
 #endif
-        public FileAppender.LockingModelBase LockingModel
-        {
-            get { return m_lockingModel; }
-            set { m_lockingModel = value; }
-        }
-
-        #endregion Public Instance Properties
-
-        #region Override implementation of AppenderSkeleton
-
-        /// <summary>
-        /// Activate the options on the file appender. 
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// This is part of the <see cref="IOptionHandler"/> delayed object
-        /// activation scheme. The <see cref="ActivateOptions"/> method must 
-        /// be called on this object after the configuration properties have
-        /// been set. Until <see cref="ActivateOptions"/> is called this
-        /// object is in an undefined state and must not be used. 
-        /// </para>
-        /// <para>
-        /// If any of the configuration properties are modified then 
-        /// <see cref="ActivateOptions"/> must be called again.
-        /// </para>
-        /// <para>
-        /// This will cause the file to be opened.
-        /// </para>
-        /// </remarks>
-        public override void ActivateOptions()
-        {
-            base.ActivateOptions();
-
-            if (m_securityContext == null)
-            {
-                m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-            }
-
-            if (m_lockingModel == null)
-            {
-                m_lockingModel = (LockingModelBase) Activator.CreateInstance(defaultLockingModelType);
-            }
-
-            m_lockingModel.CurrentAppender = this;
-            m_lockingModel.ActivateOptions();
-
-            if (m_fileName != null)
-            {
-                using (SecurityContext.Impersonate(this))
-                {
-                    m_fileName = ConvertToFullPath(m_fileName.Trim());
-                }
-
-                SafeOpenFile(m_fileName, m_appendToFile);
-            }
-            else
-            {
-                LogLog.Warn(declaringType, "FileAppender: File option not set for appender [" + Name + "].");
-                LogLog.Warn(declaringType, "FileAppender: Are you using FileAppender instead of ConsoleAppender?");
-            }
-        }
-
-        #endregion Override implementation of AppenderSkeleton
-
-        #region Override implementation of TextWriterAppender
-
-        /// <summary>
-        /// Closes any previously opened file and calls the parent's <see cref="TextWriterAppender.Reset"/>.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Resets the filename and the file stream.
-        /// </para>
-        /// </remarks>
-        protected override void Reset()
-        {
-            base.Reset();
-            m_fileName = null;
-        }
-
-        /// <summary>
-        /// Close this appender instance. The underlying stream or writer is also closed.
-        /// </summary>
-        protected override void OnClose()
-        {
-            base.OnClose();
-            m_lockingModel.OnClose();
-        }
-
-        /// <summary>
-        /// Called to initialize the file writer
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Will be called for each logged message until the file is
-        /// successfully opened.
-        /// </para>
-        /// </remarks>
-        protected override void PrepareWriter()
-        {
-            SafeOpenFile(m_fileName, m_appendToFile);
-        }
-
-        /// <summary>
-        /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/>
-        /// method. 
-        /// </summary>
-        /// <param name="loggingEvent">The event to log.</param>
-        /// <remarks>
-        /// <para>
-        /// Writes a log statement to the output stream if the output stream exists 
-        /// and is writable.  
-        /// </para>
-        /// <para>
-        /// The format of the output will depend on the appender's layout.
-        /// </para>
-        /// </remarks>
-        protected override void Append(LoggingEvent loggingEvent)
-        {
-            if (m_stream.AcquireLock())
-            {
-                try
-                {
-                    base.Append(loggingEvent);
-                }
-                finally
-                {
-                    m_stream.ReleaseLock();
-                }
-            }
-        }
-
-        /// <summary>
-        /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent[])"/>
-        /// method. 
-        /// </summary>
-        /// <param name="loggingEvents">The array of events to log.</param>
-        /// <remarks>
-        /// <para>
-        /// Acquires the output file locks once before writing all the events to
-        /// the stream.
-        /// </para>
-        /// </remarks>
-        protected override void Append(LoggingEvent[] loggingEvents)
-        {
-            if (m_stream.AcquireLock())
-            {
-                try
-                {
-                    base.Append(loggingEvents);
-                }
-                finally
-                {
-                    m_stream.ReleaseLock();
-                }
-            }
-        }
-
-        /// <summary>
-        /// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
-        /// </para>
-        /// </remarks>
-        protected override void WriteFooter()
-        {
-            if (m_stream != null)
-            {
-                //WriteFooter can be called even before a file is opened
-                m_stream.AcquireLock();
-                try
-                {
-                    base.WriteFooter();
-                }
-                finally
-                {
-                    m_stream.ReleaseLock();
-                }
-            }
-        }
-
-        /// <summary>
-        /// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
-        /// </para>
-        /// </remarks>
-        protected override void WriteHeader()
-        {
-            if (m_stream != null)
-            {
-                if (m_stream.AcquireLock())
-                {
-                    try
-                    {
-                        base.WriteHeader();
-                    }
-                    finally
-                    {
-                        m_stream.ReleaseLock();
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// Closes the underlying <see cref="TextWriter"/>.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Closes the underlying <see cref="TextWriter"/>.
-        /// </para>
-        /// </remarks>
-        protected override void CloseWriter()
-        {
-            if (m_stream != null)
-            {
-                m_stream.AcquireLock();
-                try
-                {
-                    base.CloseWriter();
-                }
-                finally
-                {
-                    m_stream.ReleaseLock();
-                }
-            }
-        }
-
-        #endregion Override implementation of TextWriterAppender
-
-        #region Public Instance Methods
-
-        /// <summary>
-        /// Closes the previously opened file.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Writes the <see cref="ILayout.Footer"/> to the file and then
-        /// closes the file.
-        /// </para>
-        /// </remarks>
-        protected void CloseFile()
-        {
-            WriteFooterAndCloseWriter();
-        }
-
-        #endregion Public Instance Methods
-
-        #region Protected Instance Methods
-
-        /// <summary>
-        /// Sets and <i>opens</i> the file where the log output will go. The specified file must be writable.
-        /// </summary>
-        /// <param name="fileName">The path to the log file. Must be a fully qualified path.</param>
-        /// <param name="append">If true will append to fileName. Otherwise will truncate fileName</param>
-        /// <remarks>
-        /// <para>
-        /// Calls <see cref="OpenFile"/> but guarantees not to throw an exception.
-        /// Errors are passed to the <see cref="TextWriterAppender.ErrorHandler"/>.
-        /// </para>
-        /// </remarks>
-        protected virtual void SafeOpenFile(string fileName, bool append)
-        {
-            try
-            {
-                OpenFile(fileName, append);
-            }
-            catch (Exception e)
-            {
-                ErrorHandler.Error("OpenFile(" + fileName + "," + append + ") call failed.", e,
-                    ErrorCode.FileOpenFailure);
-            }
-        }
-
-        /// <summary>
-        /// Sets and <i>opens</i> the file where the log output will go. The specified file must be writable.
-        /// </summary>
-        /// <param name="fileName">The path to the log file. Must be a fully qualified path.</param>
-        /// <param name="append">If true will append to fileName. Otherwise will truncate fileName</param>
-        /// <remarks>
-        /// <para>
-        /// If there was already an opened file, then the previous file
-        /// is closed first.
-        /// </para>
-        /// <para>
-        /// This method will ensure that the directory structure
-        /// for the <paramref name="fileName"/> specified exists.
-        /// </para>
-        /// </remarks>
-        protected virtual void OpenFile(string fileName, bool append)
-        {
-            if (LogLog.IsErrorEnabled)
-            {
-                // Internal check that the fileName passed in is a rooted path
-                bool isPathRooted = false;
-                using (SecurityContext.Impersonate(this))
-                {
-                    isPathRooted = Path.IsPathRooted(fileName);
-                }
-
-                if (!isPathRooted)
-                {
-                    LogLog.Error(declaringType,
-                        "INTERNAL ERROR. OpenFile(" + fileName + "): File name is not fully qualified.");
-                }
-            }
-
-            lock (this)
-            {
-                Reset();
-
-                LogLog.Debug(declaringType, "Opening file for writing [" + fileName + "] append [" + append + "]");
-
-                // Save these for later, allowing retries if file open fails
-                m_fileName = fileName;
-                m_appendToFile = append;
-
-                LockingModel.CurrentAppender = this;
-                LockingModel.OpenFile(fileName, append, m_encoding);
-                m_stream = new LockingStream(LockingModel);
-
-                if (m_stream != null)
-                {
-                    m_stream.AcquireLock();
-                    try
-                    {
-                        SetQWForFiles(m_stream);
-                    }
-                    finally
-                    {
-                        m_stream.ReleaseLock();
-                    }
-                }
-
-                WriteHeader();
-            }
-        }
-
-        /// <summary>
-        /// Sets the quiet writer used for file output
-        /// </summary>
-        /// <param name="fileStream">the file stream that has been opened for writing</param>
-        /// <remarks>
-        /// <para>
-        /// This implementation of <see cref="M:SetQWForFiles(Stream)"/> creates a <see cref="StreamWriter"/>
-        /// over the <paramref name="fileStream"/> and passes it to the 
-        /// <see cref="M:SetQWForFiles(TextWriter)"/> method.
-        /// </para>
-        /// <para>
-        /// This method can be overridden by sub classes that want to wrap the
-        /// <see cref="Stream"/> in some way, for example to encrypt the output
-        /// data using a <c>System.Security.Cryptography.CryptoStream</c>.
-        /// </para>
-        /// </remarks>
-        protected virtual void SetQWForFiles(Stream fileStream)
-        {
-#pragma warning disable CA2000 // Dispose objects before losing scope
-            StreamWriter writer = new StreamWriter(fileStream, m_encoding);
-#pragma warning restore CA2000 // Dispose objects before losing scope
-            SetQWForFiles(writer);
-        }
-
-        /// <summary>
-        /// Sets the quiet writer being used.
-        /// </summary>
-        /// <param name="writer">the writer over the file stream that has been opened for writing</param>
-        /// <remarks>
-        /// <para>
-        /// This method can be overridden by sub classes that want to
-        /// wrap the <see cref="TextWriter"/> in some way.
-        /// </para>
-        /// </remarks>
-        protected virtual void SetQWForFiles(TextWriter writer)
-        {
-            QuietWriter = new QuietTextWriter(writer, ErrorHandler);
-        }
-
-        #endregion Protected Instance Methods
-
-        #region Protected Static Methods
-
-        /// <summary>
-        /// Convert a path into a fully qualified path.
-        /// </summary>
-        /// <param name="path">The path to convert.</param>
-        /// <returns>The fully qualified path.</returns>
-        /// <remarks>
-        /// <para>
-        /// Converts the path specified to a fully
-        /// qualified path. If the path is relative it is
-        /// taken as relative from the application base 
-        /// directory.
-        /// </para>
-        /// </remarks>
-        protected static string ConvertToFullPath(string path)
-        {
-            return SystemInfo.ConvertToFullPath(path);
-        }
-
-        #endregion Protected Static Methods
-
-        #region Private Instance Fields
-
-        /// <summary>
-        /// Flag to indicate if we should append to the file
-        /// or overwrite the file. The default is to append.
-        /// </summary>
-        private bool m_appendToFile = true;
-
-        /// <summary>
-        /// The name of the log file.
-        /// </summary>
-        private string m_fileName = null;
-
-        /// <summary>
-        /// The encoding to use for the file stream.
-        /// </summary>
-        private Encoding m_encoding = Encoding.GetEncoding(0);
-
-        /// <summary>
-        /// The security context to use for privileged calls
-        /// </summary>
-        private SecurityContext m_securityContext;
-
-        /// <summary>
-        /// The stream to log to. Has added locking semantics
-        /// </summary>
-        private FileAppender.LockingStream m_stream = null;
-
-        /// <summary>
-        /// The locking model to use
-        /// </summary>
-        private FileAppender.LockingModelBase m_lockingModel;
-
-        #endregion Private Instance Fields
-
-        #region Private Static Fields
-
-        /// <summary>
-        /// The fully qualified type of the FileAppender class.
-        /// </summary>
-        /// <remarks>
-        /// Used by the internal logger to record the Type of the
-        /// log message.
-        /// </remarks>
-        private static readonly Type declaringType = typeof(FileAppender);
-
-        #endregion Private Static Fields
+    public FileAppender.LockingModelBase LockingModel
+    {
+      get { return m_lockingModel; }
+      set { m_lockingModel = value; }
     }
+
+    #endregion Public Instance Properties
+
+    #region Override implementation of AppenderSkeleton
+
+    /// <summary>
+    /// Activate the options on the file appender. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// This will cause the file to be opened.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
+
+      if (m_securityContext == null)
+      {
+        m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
+      }
+
+      if (m_lockingModel == null)
+      {
+        m_lockingModel = (LockingModelBase)Activator.CreateInstance(defaultLockingModelType);
+      }
+
+      m_lockingModel.CurrentAppender = this;
+      m_lockingModel.ActivateOptions();
+
+      if (m_fileName != null)
+      {
+        using (SecurityContext.Impersonate(this))
+        {
+          m_fileName = ConvertToFullPath(m_fileName.Trim());
+        }
+
+        SafeOpenFile(m_fileName, m_appendToFile);
+      }
+      else
+      {
+        LogLog.Warn(declaringType, "FileAppender: File option not set for appender [" + Name + "].");
+        LogLog.Warn(declaringType, "FileAppender: Are you using FileAppender instead of ConsoleAppender?");
+      }
+    }
+
+    #endregion Override implementation of AppenderSkeleton
+
+    #region Override implementation of TextWriterAppender
+
+    /// <summary>
+    /// Closes any previously opened file and calls the parent's <see cref="TextWriterAppender.Reset"/>.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Resets the filename and the file stream.
+    /// </para>
+    /// </remarks>
+    protected override void Reset()
+    {
+      base.Reset();
+      m_fileName = null;
+    }
+
+    /// <summary>
+    /// Close this appender instance. The underlying stream or writer is also closed.
+    /// </summary>
+    protected override void OnClose()
+    {
+      base.OnClose();
+      m_lockingModel.OnClose();
+    }
+
+    /// <summary>
+    /// Called to initialize the file writer
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Will be called for each logged message until the file is
+    /// successfully opened.
+    /// </para>
+    /// </remarks>
+    protected override void PrepareWriter()
+    {
+      SafeOpenFile(m_fileName, m_appendToFile);
+    }
+
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/>
+    /// method. 
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a log statement to the output stream if the output stream exists 
+    /// and is writable.  
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      if (m_stream.AcquireLock())
+      {
+        try
+        {
+          base.Append(loggingEvent);
+        }
+        finally
+        {
+          m_stream.ReleaseLock();
+        }
+      }
+    }
+
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent[])"/>
+    /// method. 
+    /// </summary>
+    /// <param name="loggingEvents">The array of events to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Acquires the output file locks once before writing all the events to
+    /// the stream.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent[] loggingEvents)
+    {
+      if (m_stream.AcquireLock())
+      {
+        try
+        {
+          base.Append(loggingEvents);
+        }
+        finally
+        {
+          m_stream.ReleaseLock();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
+    /// </para>
+    /// </remarks>
+    protected override void WriteFooter()
+    {
+      if (m_stream != null)
+      {
+        //WriteFooter can be called even before a file is opened
+        m_stream.AcquireLock();
+        try
+        {
+          base.WriteFooter();
+        }
+        finally
+        {
+          m_stream.ReleaseLock();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
+    /// </para>
+    /// </remarks>
+    protected override void WriteHeader()
+    {
+      if (m_stream != null)
+      {
+        if (m_stream.AcquireLock())
+        {
+          try
+          {
+            base.WriteHeader();
+          }
+          finally
+          {
+            m_stream.ReleaseLock();
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Closes the underlying <see cref="TextWriter"/>.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Closes the underlying <see cref="TextWriter"/>.
+    /// </para>
+    /// </remarks>
+    protected override void CloseWriter()
+    {
+      if (m_stream != null)
+      {
+        m_stream.AcquireLock();
+        try
+        {
+          base.CloseWriter();
+        }
+        finally
+        {
+          m_stream.ReleaseLock();
+        }
+      }
+    }
+
+    #endregion Override implementation of TextWriterAppender
+
+    #region Public Instance Methods
+
+    /// <summary>
+    /// Closes the previously opened file.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="ILayout.Footer"/> to the file and then
+    /// closes the file.
+    /// </para>
+    /// </remarks>
+    protected void CloseFile()
+    {
+      WriteFooterAndCloseWriter();
+    }
+
+    #endregion Public Instance Methods
+
+    #region Protected Instance Methods
+
+    /// <summary>
+    /// Sets and <i>opens</i> the file where the log output will go. The specified file must be writable.
+    /// </summary>
+    /// <param name="fileName">The path to the log file. Must be a fully qualified path.</param>
+    /// <param name="append">If true will append to fileName. Otherwise will truncate fileName</param>
+    /// <remarks>
+    /// <para>
+    /// Calls <see cref="OpenFile"/> but guarantees not to throw an exception.
+    /// Errors are passed to the <see cref="TextWriterAppender.ErrorHandler"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual void SafeOpenFile(string fileName, bool append)
+    {
+      try
+      {
+        OpenFile(fileName, append);
+      }
+      catch (Exception e)
+      {
+        ErrorHandler.Error("OpenFile(" + fileName + "," + append + ") call failed.", e,
+            ErrorCode.FileOpenFailure);
+      }
+    }
+
+    /// <summary>
+    /// Sets and <i>opens</i> the file where the log output will go. The specified file must be writable.
+    /// </summary>
+    /// <param name="fileName">The path to the log file. Must be a fully qualified path.</param>
+    /// <param name="append">If true will append to fileName. Otherwise will truncate fileName</param>
+    /// <remarks>
+    /// <para>
+    /// If there was already an opened file, then the previous file
+    /// is closed first.
+    /// </para>
+    /// <para>
+    /// This method will ensure that the directory structure
+    /// for the <paramref name="fileName"/> specified exists.
+    /// </para>
+    /// </remarks>
+    protected virtual void OpenFile(string fileName, bool append)
+    {
+      if (LogLog.IsErrorEnabled)
+      {
+        // Internal check that the fileName passed in is a rooted path
+        bool isPathRooted = false;
+        using (SecurityContext.Impersonate(this))
+        {
+          isPathRooted = Path.IsPathRooted(fileName);
+        }
+
+        if (!isPathRooted)
+        {
+          LogLog.Error(declaringType,
+              "INTERNAL ERROR. OpenFile(" + fileName + "): File name is not fully qualified.");
+        }
+      }
+
+      lock (this)
+      {
+        Reset();
+
+        LogLog.Debug(declaringType, "Opening file for writing [" + fileName + "] append [" + append + "]");
+
+        // Save these for later, allowing retries if file open fails
+        m_fileName = fileName;
+        m_appendToFile = append;
+
+        LockingModel.CurrentAppender = this;
+        LockingModel.OpenFile(fileName, append, m_encoding);
+        m_stream = new LockingStream(LockingModel);
+
+        if (m_stream != null)
+        {
+          m_stream.AcquireLock();
+          try
+          {
+            SetQWForFiles(m_stream);
+          }
+          finally
+          {
+            m_stream.ReleaseLock();
+          }
+        }
+
+        WriteHeader();
+      }
+    }
+
+    /// <summary>
+    /// Sets the quiet writer used for file output
+    /// </summary>
+    /// <param name="fileStream">the file stream that has been opened for writing</param>
+    /// <remarks>
+    /// <para>
+    /// This implementation of <see cref="M:SetQWForFiles(Stream)"/> creates a <see cref="StreamWriter"/>
+    /// over the <paramref name="fileStream"/> and passes it to the 
+    /// <see cref="M:SetQWForFiles(TextWriter)"/> method.
+    /// </para>
+    /// <para>
+    /// This method can be overridden by sub classes that want to wrap the
+    /// <see cref="Stream"/> in some way, for example to encrypt the output
+    /// data using a <c>System.Security.Cryptography.CryptoStream</c>.
+    /// </para>
+    /// </remarks>
+    protected virtual void SetQWForFiles(Stream fileStream)
+    {
+#pragma warning disable CA2000 // Dispose objects before losing scope
+      StreamWriter writer = new StreamWriter(fileStream, m_encoding);
+#pragma warning restore CA2000 // Dispose objects before losing scope
+      SetQWForFiles(writer);
+    }
+
+    /// <summary>
+    /// Sets the quiet writer being used.
+    /// </summary>
+    /// <param name="writer">the writer over the file stream that has been opened for writing</param>
+    /// <remarks>
+    /// <para>
+    /// This method can be overridden by sub classes that want to
+    /// wrap the <see cref="TextWriter"/> in some way.
+    /// </para>
+    /// </remarks>
+    protected virtual void SetQWForFiles(TextWriter writer)
+    {
+      QuietWriter = new QuietTextWriter(writer, ErrorHandler);
+    }
+
+    #endregion Protected Instance Methods
+
+    #region Protected Static Methods
+
+    /// <summary>
+    /// Convert a path into a fully qualified path.
+    /// </summary>
+    /// <param name="path">The path to convert.</param>
+    /// <returns>The fully qualified path.</returns>
+    /// <remarks>
+    /// <para>
+    /// Converts the path specified to a fully
+    /// qualified path. If the path is relative it is
+    /// taken as relative from the application base 
+    /// directory.
+    /// </para>
+    /// </remarks>
+    protected static string ConvertToFullPath(string path)
+    {
+      return SystemInfo.ConvertToFullPath(path);
+    }
+
+    #endregion Protected Static Methods
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// Flag to indicate if we should append to the file
+    /// or overwrite the file. The default is to append.
+    /// </summary>
+    private bool m_appendToFile = true;
+
+    /// <summary>
+    /// The name of the log file.
+    /// </summary>
+    private string m_fileName = null;
+
+    /// <summary>
+    /// The encoding to use for the file stream.
+    /// </summary>
+    private Encoding m_encoding = Encoding.GetEncoding(0);
+
+    /// <summary>
+    /// The security context to use for privileged calls
+    /// </summary>
+    private SecurityContext m_securityContext;
+
+    /// <summary>
+    /// The stream to log to. Has added locking semantics
+    /// </summary>
+    private FileAppender.LockingStream m_stream = null;
+
+    /// <summary>
+    /// The locking model to use
+    /// </summary>
+    private FileAppender.LockingModelBase m_lockingModel;
+
+    #endregion Private Instance Fields
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the FileAppender class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(FileAppender);
+
+    #endregion Private Static Fields
+  }
 }
\ No newline at end of file
diff --git a/src/log4net/Appender/ForwardingAppender.cs b/src/log4net/Appender/ForwardingAppender.cs
index 20a99cc..57d2907 100644
--- a/src/log4net/Appender/ForwardingAppender.cs
+++ b/src/log4net/Appender/ForwardingAppender.cs
@@ -25,255 +25,255 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// This appender forwards logging events to attached appenders.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The forwarding appender can be used to specify different thresholds
-	/// and filters for the same appender at different locations within the hierarchy.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class ForwardingAppender : AppenderSkeleton, IAppenderAttachable
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// This appender forwards logging events to attached appenders.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The forwarding appender can be used to specify different thresholds
+  /// and filters for the same appender at different locations within the hierarchy.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class ForwardingAppender : AppenderSkeleton, IAppenderAttachable
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ForwardingAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public ForwardingAppender()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ForwardingAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public ForwardingAppender()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Closes the appender and releases resources.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Releases any resources allocated within the appender such as file handles, 
-		/// network connections, etc.
-		/// </para>
-		/// <para>
-		/// It is a programming error to append to a closed appender.
-		/// </para>
-		/// </remarks>
-		protected override void OnClose()
-		{
-			// Remove all the attached appenders
-			lock(this)
-			{
-				if (m_appenderAttachedImpl != null)
-				{
-					m_appenderAttachedImpl.RemoveAllAppenders();
-				}
-			}
-		}
+    /// <summary>
+    /// Closes the appender and releases resources.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Releases any resources allocated within the appender such as file handles, 
+    /// network connections, etc.
+    /// </para>
+    /// <para>
+    /// It is a programming error to append to a closed appender.
+    /// </para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      // Remove all the attached appenders
+      lock (this)
+      {
+        if (m_appenderAttachedImpl != null)
+        {
+          m_appenderAttachedImpl.RemoveAllAppenders();
+        }
+      }
+    }
 
-		/// <summary>
-		/// Forward the logging event to the attached appenders 
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Delivers the logging event to all the attached appenders.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			// Pass the logging event on the the attached appenders
-			if (m_appenderAttachedImpl != null)
-			{
-				m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvent);
-			}
-		} 
+    /// <summary>
+    /// Forward the logging event to the attached appenders 
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Delivers the logging event to all the attached appenders.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      // Pass the logging event on the the attached appenders
+      if (m_appenderAttachedImpl != null)
+      {
+        m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvent);
+      }
+    }
 
-		/// <summary>
-		/// Forward the logging events to the attached appenders 
-		/// </summary>
-		/// <param name="loggingEvents">The array of events to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Delivers the logging events to all the attached appenders.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent[] loggingEvents) 
-		{
-			// Pass the logging event on the the attached appenders
-			if (m_appenderAttachedImpl != null)
-			{
-				m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvents);
-			}
-		} 
+    /// <summary>
+    /// Forward the logging events to the attached appenders 
+    /// </summary>
+    /// <param name="loggingEvents">The array of events to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Delivers the logging events to all the attached appenders.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent[] loggingEvents)
+    {
+      // Pass the logging event on the the attached appenders
+      if (m_appenderAttachedImpl != null)
+      {
+        m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvents);
+      }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Implementation of IAppenderAttachable
+    #region Implementation of IAppenderAttachable
 
-		/// <summary>
-		/// Adds an <see cref="IAppender" /> to the list of appenders of this
-		/// instance.
-		/// </summary>
-		/// <param name="newAppender">The <see cref="IAppender" /> to add to this appender.</param>
-		/// <remarks>
-		/// <para>
-		/// If the specified <see cref="IAppender" /> is already in the list of
-		/// appenders, then it won't be added again.
-		/// </para>
-		/// </remarks>
-		public virtual void AddAppender(IAppender newAppender) 
-		{
-			if (newAppender == null)
-			{
-				throw new ArgumentNullException("newAppender");
-			}
-			lock(this)
-			{
-				if (m_appenderAttachedImpl == null) 
-				{
-					m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
-				}
-				m_appenderAttachedImpl.AddAppender(newAppender);
-			}
-		}
+    /// <summary>
+    /// Adds an <see cref="IAppender" /> to the list of appenders of this
+    /// instance.
+    /// </summary>
+    /// <param name="newAppender">The <see cref="IAppender" /> to add to this appender.</param>
+    /// <remarks>
+    /// <para>
+    /// If the specified <see cref="IAppender" /> is already in the list of
+    /// appenders, then it won't be added again.
+    /// </para>
+    /// </remarks>
+    public virtual void AddAppender(IAppender newAppender)
+    {
+      if (newAppender == null)
+      {
+        throw new ArgumentNullException("newAppender");
+      }
+      lock (this)
+      {
+        if (m_appenderAttachedImpl == null)
+        {
+          m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
+        }
+        m_appenderAttachedImpl.AddAppender(newAppender);
+      }
+    }
 
-		/// <summary>
-		/// Gets the appenders contained in this appender as an 
-		/// <see cref="System.Collections.ICollection"/>.
-		/// </summary>
-		/// <remarks>
-		/// If no appenders can be found, then an <see cref="EmptyCollection"/> 
-		/// is returned.
-		/// </remarks>
-		/// <returns>
-		/// A collection of the appenders in this appender.
-		/// </returns>
-		public virtual AppenderCollection Appenders 
-		{
-			get
-			{
-				lock(this)
-				{
-					if (m_appenderAttachedImpl == null)
-					{
-						return AppenderCollection.EmptyCollection;
-					}
-					else 
-					{
-						return m_appenderAttachedImpl.Appenders;
-					}
-				}
-			}
-		}
+    /// <summary>
+    /// Gets the appenders contained in this appender as an 
+    /// <see cref="System.Collections.ICollection"/>.
+    /// </summary>
+    /// <remarks>
+    /// If no appenders can be found, then an <see cref="EmptyCollection"/> 
+    /// is returned.
+    /// </remarks>
+    /// <returns>
+    /// A collection of the appenders in this appender.
+    /// </returns>
+    public virtual AppenderCollection Appenders
+    {
+      get
+      {
+        lock (this)
+        {
+          if (m_appenderAttachedImpl == null)
+          {
+            return AppenderCollection.EmptyCollection;
+          }
+          else
+          {
+            return m_appenderAttachedImpl.Appenders;
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Looks for the appender with the specified name.
-		/// </summary>
-		/// <param name="name">The name of the appender to lookup.</param>
-		/// <returns>
-		/// The appender with the specified name, or <c>null</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Get the named appender attached to this appender.
-		/// </para>
-		/// </remarks>
-		public virtual IAppender GetAppender(string name) 
-		{
-			lock(this)
-			{
-				if (m_appenderAttachedImpl == null || name == null)
-				{
-					return null;
-				}
+    /// <summary>
+    /// Looks for the appender with the specified name.
+    /// </summary>
+    /// <param name="name">The name of the appender to lookup.</param>
+    /// <returns>
+    /// The appender with the specified name, or <c>null</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Get the named appender attached to this appender.
+    /// </para>
+    /// </remarks>
+    public virtual IAppender GetAppender(string name)
+    {
+      lock (this)
+      {
+        if (m_appenderAttachedImpl == null || name == null)
+        {
+          return null;
+        }
 
-				return m_appenderAttachedImpl.GetAppender(name);
-			}
-		}
+        return m_appenderAttachedImpl.GetAppender(name);
+      }
+    }
 
-		/// <summary>
-		/// Removes all previously added appenders from this appender.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is useful when re-reading configuration information.
-		/// </para>
-		/// </remarks>
-		public virtual void RemoveAllAppenders() 
-		{
-			lock(this)
-			{
-				if (m_appenderAttachedImpl != null) 
-				{
-					m_appenderAttachedImpl.RemoveAllAppenders();
-					m_appenderAttachedImpl = null;
-				}
-			}
-		}
+    /// <summary>
+    /// Removes all previously added appenders from this appender.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is useful when re-reading configuration information.
+    /// </para>
+    /// </remarks>
+    public virtual void RemoveAllAppenders()
+    {
+      lock (this)
+      {
+        if (m_appenderAttachedImpl != null)
+        {
+          m_appenderAttachedImpl.RemoveAllAppenders();
+          m_appenderAttachedImpl = null;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Removes the specified appender from the list of appenders.
-		/// </summary>
-		/// <param name="appender">The appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </remarks>
-		public virtual IAppender RemoveAppender(IAppender appender) 
-		{
-			lock(this)
-			{
-				if (appender != null && m_appenderAttachedImpl != null) 
-				{
-					return m_appenderAttachedImpl.RemoveAppender(appender);
-				}
-			}
-			return null;
-		}
+    /// <summary>
+    /// Removes the specified appender from the list of appenders.
+    /// </summary>
+    /// <param name="appender">The appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </remarks>
+    public virtual IAppender RemoveAppender(IAppender appender)
+    {
+      lock (this)
+      {
+        if (appender != null && m_appenderAttachedImpl != null)
+        {
+          return m_appenderAttachedImpl.RemoveAppender(appender);
+        }
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Removes the appender with the specified name from the list of appenders.
-		/// </summary>
-		/// <param name="name">The name of the appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </remarks>
-		public virtual IAppender RemoveAppender(string name) 
-		{
-			lock(this)
-			{
-				if (name != null && m_appenderAttachedImpl != null)
-				{
-					return m_appenderAttachedImpl.RemoveAppender(name);
-				}
-			}
-			return null;
-		}
-  
-		#endregion Implementation of IAppenderAttachable
+    /// <summary>
+    /// Removes the appender with the specified name from the list of appenders.
+    /// </summary>
+    /// <param name="name">The name of the appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </remarks>
+    public virtual IAppender RemoveAppender(string name)
+    {
+      lock (this)
+      {
+        if (name != null && m_appenderAttachedImpl != null)
+        {
+          return m_appenderAttachedImpl.RemoveAppender(name);
+        }
+      }
+      return null;
+    }
 
-		#region Private Instance Fields
+    #endregion Implementation of IAppenderAttachable
 
-		/// <summary>
-		/// Implementation of the <see cref="IAppenderAttachable"/> interface
-		/// </summary>
-		private AppenderAttachedImpl m_appenderAttachedImpl;
+    #region Private Instance Fields
 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// Implementation of the <see cref="IAppenderAttachable"/> interface
+    /// </summary>
+    private AppenderAttachedImpl m_appenderAttachedImpl;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Appender/IAppender.cs b/src/log4net/Appender/IAppender.cs
index a644f07..3f2fb0b 100644
--- a/src/log4net/Appender/IAppender.cs
+++ b/src/log4net/Appender/IAppender.cs
@@ -23,56 +23,56 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Implement this interface for your own strategies for printing log statements.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Implementors should consider extending the <see cref="AppenderSkeleton"/>
-	/// class which provides a default implementation of this interface.
-	/// </para>
-	/// <para>
-	/// Appenders can also implement the <see cref="IOptionHandler"/> interface. Therefore
-	/// they would require that the <see cref="M:IOptionHandler.ActivateOptions()"/> method
-	/// be called after the appenders properties have been configured.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IAppender
-	{
-		/// <summary>
-		/// Closes the appender and releases resources.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Releases any resources allocated within the appender such as file handles, 
-		/// network connections, etc.
-		/// </para>
-		/// <para>
-		/// It is a programming error to append to a closed appender.
-		/// </para>
-		/// </remarks>
-		void Close();
+  /// <summary>
+  /// Implement this interface for your own strategies for printing log statements.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Implementors should consider extending the <see cref="AppenderSkeleton"/>
+  /// class which provides a default implementation of this interface.
+  /// </para>
+  /// <para>
+  /// Appenders can also implement the <see cref="IOptionHandler"/> interface. Therefore
+  /// they would require that the <see cref="M:IOptionHandler.ActivateOptions()"/> method
+  /// be called after the appenders properties have been configured.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IAppender
+  {
+    /// <summary>
+    /// Closes the appender and releases resources.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Releases any resources allocated within the appender such as file handles, 
+    /// network connections, etc.
+    /// </para>
+    /// <para>
+    /// It is a programming error to append to a closed appender.
+    /// </para>
+    /// </remarks>
+    void Close();
 
-		/// <summary>
-		/// Log the logging event in Appender specific way.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log</param>
-		/// <remarks>
-		/// <para>
-		/// This method is called to log a message into this appender.
-		/// </para>
-		/// </remarks>
-		void DoAppend(LoggingEvent loggingEvent);
+    /// <summary>
+    /// Log the logging event in Appender specific way.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log</param>
+    /// <remarks>
+    /// <para>
+    /// This method is called to log a message into this appender.
+    /// </para>
+    /// </remarks>
+    void DoAppend(LoggingEvent loggingEvent);
 
-		/// <summary>
-		/// Gets or sets the name of this appender.
-		/// </summary>
-		/// <value>The name of the appender.</value>
-		/// <remarks>
-		/// <para>The name uniquely identifies the appender.</para>
-		/// </remarks>
-		string Name { get; set; }
-	}
+    /// <summary>
+    /// Gets or sets the name of this appender.
+    /// </summary>
+    /// <value>The name of the appender.</value>
+    /// <remarks>
+    /// <para>The name uniquely identifies the appender.</para>
+    /// </remarks>
+    string Name { get; set; }
+  }
 }
diff --git a/src/log4net/Appender/IBulkAppender.cs b/src/log4net/Appender/IBulkAppender.cs
index 469eb85..9ccb1e8 100644
--- a/src/log4net/Appender/IBulkAppender.cs
+++ b/src/log4net/Appender/IBulkAppender.cs
@@ -21,28 +21,28 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Interface for appenders that support bulk logging.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This interface extends the <see cref="IAppender"/> interface to
-	/// support bulk logging of <see cref="LoggingEvent"/> objects. Appenders
-	/// should only implement this interface if they can bulk log efficiently.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public interface IBulkAppender : IAppender
-	{
-		/// <summary>
-		/// Log the array of logging events in Appender specific way.
-		/// </summary>
-		/// <param name="loggingEvents">The events to log</param>
-		/// <remarks>
-		/// <para>
-		/// This method is called to log an array of events into this appender.
-		/// </para>
-		/// </remarks>
-		void DoAppend(LoggingEvent[] loggingEvents);
-	}
+  /// <summary>
+  /// Interface for appenders that support bulk logging.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This interface extends the <see cref="IAppender"/> interface to
+  /// support bulk logging of <see cref="LoggingEvent"/> objects. Appenders
+  /// should only implement this interface if they can bulk log efficiently.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public interface IBulkAppender : IAppender
+  {
+    /// <summary>
+    /// Log the array of logging events in Appender specific way.
+    /// </summary>
+    /// <param name="loggingEvents">The events to log</param>
+    /// <remarks>
+    /// <para>
+    /// This method is called to log an array of events into this appender.
+    /// </para>
+    /// </remarks>
+    void DoAppend(LoggingEvent[] loggingEvents);
+  }
 }
diff --git a/src/log4net/Appender/IFlushable.cs b/src/log4net/Appender/IFlushable.cs
index 2cb7ae3..65c7bbf 100644
--- a/src/log4net/Appender/IFlushable.cs
+++ b/src/log4net/Appender/IFlushable.cs
@@ -21,39 +21,39 @@
 
 namespace log4net.Appender
 {
+  /// <summary>
+  /// Interface that can be implemented by Appenders that buffer logging data and expose a <see cref="Flush"/> method.
+  /// </summary>
+  public interface IFlushable
+  {
     /// <summary>
-    /// Interface that can be implemented by Appenders that buffer logging data and expose a <see cref="Flush"/> method.
+    /// Flushes any buffered log data.
     /// </summary>
-    public interface IFlushable
-    {
-        /// <summary>
-        /// Flushes any buffered log data.
-        /// </summary>
-        /// <remarks>
-        /// Appenders that implement the <see cref="Flush"/> method must do so in a thread-safe manner: it can be called concurrently with
-        /// the <see cref="log4net.Appender.IAppender.DoAppend"/> method.
-        /// <para>
-        /// Typically this is done by locking on the Appender instance, e.g.:
-        /// <code>
-        /// <![CDATA[
-        /// public bool Flush(int millisecondsTimeout)
-        /// {
-        ///     lock(this)
-        ///     {
-        ///         // Flush buffered logging data
-        ///         ...
-        ///     }
-        /// }
-        /// ]]>
-        /// </code>
-        /// </para>
-        /// <para>
-        /// The <paramref name="millisecondsTimeout"/> parameter is only relevant for appenders that process logging events asynchronously,
-        /// such as <see cref="RemotingAppender"/>.
-        /// </para>
-        /// </remarks>
-        /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
-        /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-        bool Flush(int millisecondsTimeout);
-    }
+    /// <remarks>
+    /// Appenders that implement the <see cref="Flush"/> method must do so in a thread-safe manner: it can be called concurrently with
+    /// the <see cref="log4net.Appender.IAppender.DoAppend"/> method.
+    /// <para>
+    /// Typically this is done by locking on the Appender instance, e.g.:
+    /// <code>
+    /// <![CDATA[
+    /// public bool Flush(int millisecondsTimeout)
+    /// {
+    ///     lock(this)
+    ///     {
+    ///         // Flush buffered logging data
+    ///         ...
+    ///     }
+    /// }
+    /// ]]>
+    /// </code>
+    /// </para>
+    /// <para>
+    /// The <paramref name="millisecondsTimeout"/> parameter is only relevant for appenders that process logging events asynchronously,
+    /// such as <see cref="RemotingAppender"/>.
+    /// </para>
+    /// </remarks>
+    /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    bool Flush(int millisecondsTimeout);
+  }
 }
diff --git a/src/log4net/Appender/LocalSyslogAppender.cs b/src/log4net/Appender/LocalSyslogAppender.cs
index ad31b5d..549d2ee 100644
--- a/src/log4net/Appender/LocalSyslogAppender.cs
+++ b/src/log4net/Appender/LocalSyslogAppender.cs
@@ -27,579 +27,579 @@
 using log4net.Core;
 using log4net.Util;
 
-namespace log4net.Appender 
+namespace log4net.Appender
 {
-	/// <summary>
-	/// Logs events to a local syslog service.
-	/// </summary>
-	/// <remarks>
-	/// <note>
-	/// This appender uses the POSIX libc library functions <c>openlog</c>, <c>syslog</c>, and <c>closelog</c>.
-	/// If these functions are not available on the local system then this appender will not work!
-	/// </note>
-	/// <para>
-	/// The functions <c>openlog</c>, <c>syslog</c>, and <c>closelog</c> are specified in SUSv2 and 
-	/// POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service.
-	/// </para>
-	/// <para>
-	/// This appender talks to a local syslog service. If you need to log to a remote syslog
-	/// daemon and you cannot configure your local syslog service to do this you may be
-	/// able to use the <see cref="RemoteSyslogAppender"/> to log via UDP.
-	/// </para>
-	/// <para>
-	/// Syslog messages must have a facility and and a severity. The severity
-	/// is derived from the Level of the logging event.
-	/// The facility must be chosen from the set of defined syslog 
-	/// <see cref="SyslogFacility"/> values. The facilities list is predefined
-	/// and cannot be extended.
-	/// </para>
-	/// <para>
-	/// An identifier is specified with each log message. This can be specified
-	/// by setting the <see cref="Identity"/> property. The identity (also know 
-	/// as the tag) must not contain white space. The default value for the
-	/// identity is the application name (from <see cref="SystemInfo.ApplicationFriendlyName"/>).
-	/// </para>
-	/// </remarks>
-	/// <author>Rob Lyon</author>
-	/// <author>Nicko Cadell</author>
-	public class LocalSyslogAppender : AppenderSkeleton 
-	{
-		#region Enumerations
+  /// <summary>
+  /// Logs events to a local syslog service.
+  /// </summary>
+  /// <remarks>
+  /// <note>
+  /// This appender uses the POSIX libc library functions <c>openlog</c>, <c>syslog</c>, and <c>closelog</c>.
+  /// If these functions are not available on the local system then this appender will not work!
+  /// </note>
+  /// <para>
+  /// The functions <c>openlog</c>, <c>syslog</c>, and <c>closelog</c> are specified in SUSv2 and 
+  /// POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service.
+  /// </para>
+  /// <para>
+  /// This appender talks to a local syslog service. If you need to log to a remote syslog
+  /// daemon and you cannot configure your local syslog service to do this you may be
+  /// able to use the <see cref="RemoteSyslogAppender"/> to log via UDP.
+  /// </para>
+  /// <para>
+  /// Syslog messages must have a facility and and a severity. The severity
+  /// is derived from the Level of the logging event.
+  /// The facility must be chosen from the set of defined syslog 
+  /// <see cref="SyslogFacility"/> values. The facilities list is predefined
+  /// and cannot be extended.
+  /// </para>
+  /// <para>
+  /// An identifier is specified with each log message. This can be specified
+  /// by setting the <see cref="Identity"/> property. The identity (also know 
+  /// as the tag) must not contain white space. The default value for the
+  /// identity is the application name (from <see cref="SystemInfo.ApplicationFriendlyName"/>).
+  /// </para>
+  /// </remarks>
+  /// <author>Rob Lyon</author>
+  /// <author>Nicko Cadell</author>
+  public class LocalSyslogAppender : AppenderSkeleton
+  {
+    #region Enumerations
 
-		/// <summary>
-		/// syslog severities
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The log4net Level maps to a syslog severity using the
-		/// <see cref="LocalSyslogAppender.AddMapping"/> method and the <see cref="LevelSeverity"/>
-		/// class. The severity is set on <see cref="LevelSeverity.Severity"/>.
-		/// </para>
-		/// </remarks>
-		public enum SyslogSeverity
-		{
-			/// <summary>
-			/// system is unusable
-			/// </summary>
-			Emergency = 0,
+    /// <summary>
+    /// syslog severities
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The log4net Level maps to a syslog severity using the
+    /// <see cref="LocalSyslogAppender.AddMapping"/> method and the <see cref="LevelSeverity"/>
+    /// class. The severity is set on <see cref="LevelSeverity.Severity"/>.
+    /// </para>
+    /// </remarks>
+    public enum SyslogSeverity
+    {
+      /// <summary>
+      /// system is unusable
+      /// </summary>
+      Emergency = 0,
 
-			/// <summary>
-			/// action must be taken immediately
-			/// </summary>
-			Alert = 1,
+      /// <summary>
+      /// action must be taken immediately
+      /// </summary>
+      Alert = 1,
 
-			/// <summary>
-			/// critical conditions
-			/// </summary>
-			Critical = 2,
+      /// <summary>
+      /// critical conditions
+      /// </summary>
+      Critical = 2,
 
-			/// <summary>
-			/// error conditions
-			/// </summary>
-			Error = 3,
+      /// <summary>
+      /// error conditions
+      /// </summary>
+      Error = 3,
 
-			/// <summary>
-			/// warning conditions
-			/// </summary>
-			Warning = 4,
+      /// <summary>
+      /// warning conditions
+      /// </summary>
+      Warning = 4,
 
-			/// <summary>
-			/// normal but significant condition
-			/// </summary>
-			Notice = 5,
+      /// <summary>
+      /// normal but significant condition
+      /// </summary>
+      Notice = 5,
 
-			/// <summary>
-			/// informational
-			/// </summary>
-			Informational = 6,
+      /// <summary>
+      /// informational
+      /// </summary>
+      Informational = 6,
 
-			/// <summary>
-			/// debug-level messages
-			/// </summary>
-			Debug = 7
-		};
+      /// <summary>
+      /// debug-level messages
+      /// </summary>
+      Debug = 7
+    };
 
-		/// <summary>
-		/// syslog facilities
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The syslog facility defines which subsystem the logging comes from.
-		/// This is set on the <see cref="Facility"/> property.
-		/// </para>
-		/// </remarks>
-		public enum SyslogFacility
-		{
-			/// <summary>
-			/// kernel messages
-			/// </summary>
-			Kernel = 0,
+    /// <summary>
+    /// syslog facilities
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The syslog facility defines which subsystem the logging comes from.
+    /// This is set on the <see cref="Facility"/> property.
+    /// </para>
+    /// </remarks>
+    public enum SyslogFacility
+    {
+      /// <summary>
+      /// kernel messages
+      /// </summary>
+      Kernel = 0,
 
-			/// <summary>
-			/// random user-level messages
-			/// </summary>
-			User = 1,
+      /// <summary>
+      /// random user-level messages
+      /// </summary>
+      User = 1,
 
-			/// <summary>
-			/// mail system
-			/// </summary>
-			Mail = 2,
+      /// <summary>
+      /// mail system
+      /// </summary>
+      Mail = 2,
 
-			/// <summary>
-			/// system daemons
-			/// </summary>
-			Daemons = 3,
+      /// <summary>
+      /// system daemons
+      /// </summary>
+      Daemons = 3,
 
-			/// <summary>
-			/// security/authorization messages
-			/// </summary>
-			Authorization = 4,
+      /// <summary>
+      /// security/authorization messages
+      /// </summary>
+      Authorization = 4,
 
-			/// <summary>
-			/// messages generated internally by syslogd
-			/// </summary>
-			Syslog = 5,
+      /// <summary>
+      /// messages generated internally by syslogd
+      /// </summary>
+      Syslog = 5,
 
-			/// <summary>
-			/// line printer subsystem
-			/// </summary>
-			Printer = 6,
+      /// <summary>
+      /// line printer subsystem
+      /// </summary>
+      Printer = 6,
 
-			/// <summary>
-			/// network news subsystem
-			/// </summary>
-			News = 7,
+      /// <summary>
+      /// network news subsystem
+      /// </summary>
+      News = 7,
 
-			/// <summary>
-			/// UUCP subsystem
-			/// </summary>
-			Uucp = 8,
+      /// <summary>
+      /// UUCP subsystem
+      /// </summary>
+      Uucp = 8,
 
-			/// <summary>
-			/// clock (cron/at) daemon
-			/// </summary>
-			Clock = 9,
+      /// <summary>
+      /// clock (cron/at) daemon
+      /// </summary>
+      Clock = 9,
 
-			/// <summary>
-			/// security/authorization  messages (private)
-			/// </summary>
-			Authorization2 = 10,
+      /// <summary>
+      /// security/authorization  messages (private)
+      /// </summary>
+      Authorization2 = 10,
 
-			/// <summary>
-			/// ftp daemon
-			/// </summary>
-			Ftp = 11,
+      /// <summary>
+      /// ftp daemon
+      /// </summary>
+      Ftp = 11,
 
-			/// <summary>
-			/// NTP subsystem
-			/// </summary>
-			Ntp = 12,
+      /// <summary>
+      /// NTP subsystem
+      /// </summary>
+      Ntp = 12,
 
-			/// <summary>
-			/// log audit
-			/// </summary>
-			Audit = 13,
+      /// <summary>
+      /// log audit
+      /// </summary>
+      Audit = 13,
 
-			/// <summary>
-			/// log alert
-			/// </summary>
-			Alert = 14,
+      /// <summary>
+      /// log alert
+      /// </summary>
+      Alert = 14,
 
-			/// <summary>
-			/// clock daemon
-			/// </summary>
-			Clock2 = 15,
+      /// <summary>
+      /// clock daemon
+      /// </summary>
+      Clock2 = 15,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local0 = 16,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local0 = 16,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local1 = 17,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local1 = 17,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local2 = 18,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local2 = 18,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local3 = 19,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local3 = 19,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local4 = 20,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local4 = 20,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local5 = 21,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local5 = 21,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local6 = 22,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local6 = 22,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local7 = 23
-		}
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local7 = 23
+    }
 
-		#endregion // Enumerations
+    #endregion // Enumerations
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="LocalSyslogAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// This instance of the <see cref="LocalSyslogAppender" /> class is set up to write 
-		/// to a local syslog service.
-		/// </remarks>
-		public LocalSyslogAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="LocalSyslogAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// This instance of the <see cref="LocalSyslogAppender" /> class is set up to write 
+    /// to a local syslog service.
+    /// </remarks>
+    public LocalSyslogAppender()
+    {
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Properties
-		
-		/// <summary>
-		/// Message identity
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// An identifier is specified with each log message. This can be specified
-		/// by setting the <see cref="Identity"/> property. The identity (also know 
-		/// as the tag) must not contain white space. The default value for the
-		/// identity is the application name (from <see cref="SystemInfo.ApplicationFriendlyName"/>).
-		/// </para>
-		/// </remarks>
-		public string Identity
-		{
-			get { return m_identity; }
-			set { m_identity = value; }
-		}
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Syslog facility
-		/// </summary>
-		/// <remarks>
-		/// Set to one of the <see cref="SyslogFacility"/> values. The list of
-		/// facilities is predefined and cannot be extended. The default value
-		/// is <see cref="SyslogFacility.User"/>.
-		/// </remarks>
-		public SyslogFacility Facility
-		{
-			get { return m_facility; }
-			set { m_facility = value; }
-		}
-		
-		#endregion // Public Instance Properties
+    /// <summary>
+    /// Message identity
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// An identifier is specified with each log message. This can be specified
+    /// by setting the <see cref="Identity"/> property. The identity (also know 
+    /// as the tag) must not contain white space. The default value for the
+    /// identity is the application name (from <see cref="SystemInfo.ApplicationFriendlyName"/>).
+    /// </para>
+    /// </remarks>
+    public string Identity
+    {
+      get { return m_identity; }
+      set { m_identity = value; }
+    }
 
-		/// <summary>
-		/// Add a mapping of level to severity
-		/// </summary>
-		/// <param name="mapping">The mapping to add</param>
-		/// <remarks>
-		/// <para>
-		/// Adds a <see cref="LevelSeverity"/> to this appender.
-		/// </para>
-		/// </remarks>
-		public void AddMapping(LevelSeverity mapping)
-		{
-			m_levelMapping.Add(mapping);
-		}
+    /// <summary>
+    /// Syslog facility
+    /// </summary>
+    /// <remarks>
+    /// Set to one of the <see cref="SyslogFacility"/> values. The list of
+    /// facilities is predefined and cannot be extended. The default value
+    /// is <see cref="SyslogFacility.User"/>.
+    /// </remarks>
+    public SyslogFacility Facility
+    {
+      get { return m_facility; }
+      set { m_facility = value; }
+    }
 
-		#region IOptionHandler Implementation
+    #endregion // Public Instance Properties
 
-		/// <summary>
-		/// Initialize the appender based on the options set.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Add a mapping of level to severity
+    /// </summary>
+    /// <param name="mapping">The mapping to add</param>
+    /// <remarks>
+    /// <para>
+    /// Adds a <see cref="LevelSeverity"/> to this appender.
+    /// </para>
+    /// </remarks>
+    public void AddMapping(LevelSeverity mapping)
+    {
+      m_levelMapping.Add(mapping);
+    }
+
+    #region IOptionHandler Implementation
+
+    /// <summary>
+    /// Initialize the appender based on the options set.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
-			
-			m_levelMapping.ActivateOptions();
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-			string identString = m_identity;
-			if (identString == null)
-			{
-				// Set to app name by default
-				identString = SystemInfo.ApplicationFriendlyName;
-			}
+      m_levelMapping.ActivateOptions();
 
-			// create the native heap ansi string. Note this is a copy of our string
-			// so we do not need to hold on to the string itself, holding on to the
-			// handle will keep the heap ansi string alive.
-			m_handleToIdentity = Marshal.StringToHGlobalAnsi(identString);
+      string identString = m_identity;
+      if (identString == null)
+      {
+        // Set to app name by default
+        identString = SystemInfo.ApplicationFriendlyName;
+      }
 
-			// open syslog
-			openlog(m_handleToIdentity, 1, m_facility);
-		}
+      // create the native heap ansi string. Note this is a copy of our string
+      // so we do not need to hold on to the string itself, holding on to the
+      // handle will keep the heap ansi string alive.
+      m_handleToIdentity = Marshal.StringToHGlobalAnsi(identString);
 
-		#endregion // IOptionHandler Implementation
+      // open syslog
+      openlog(m_handleToIdentity, 1, m_facility);
+    }
 
-		#region AppenderSkeleton Implementation
+    #endregion // IOptionHandler Implementation
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the event to a remote syslog daemon.
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
+    #region AppenderSkeleton Implementation
+
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the event to a remote syslog daemon.
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
 #if !NETSTANDARD1_3
-		[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
 #endif
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			int priority = GeneratePriority(m_facility, GetSeverity(loggingEvent.Level));
-			string message = RenderLoggingEvent(loggingEvent);
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      int priority = GeneratePriority(m_facility, GetSeverity(loggingEvent.Level));
+      string message = RenderLoggingEvent(loggingEvent);
 
-			// Call the local libc syslog method
-			// The second argument is a printf style format string
-			syslog(priority, "%s", message);
-		}
+      // Call the local libc syslog method
+      // The second argument is a printf style format string
+      syslog(priority, "%s", message);
+    }
 
-		/// <summary>
-		/// Close the syslog when the appender is closed
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Close the syslog when the appender is closed
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Close the syslog when the appender is closed
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Close the syslog when the appender is closed
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
-		protected override void OnClose()
-		{
-			base.OnClose();
+    protected override void OnClose()
+    {
+      base.OnClose();
 
-			try
-			{
-				// close syslog
-				closelog();
-			}
-			catch(DllNotFoundException)
-			{
-				// Ignore dll not found at this point
-			}
-		
-			if (m_handleToIdentity != IntPtr.Zero)
-			{
-				// free global ident
-				Marshal.FreeHGlobal(m_handleToIdentity);
-			}
-		}
+      try
+      {
+        // close syslog
+        closelog();
+      }
+      catch (DllNotFoundException)
+      {
+        // Ignore dll not found at this point
+      }
 
-		/// <summary>
-		/// This appender requires a <see cref="AppenderSkeleton.Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="AppenderSkeleton.Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+      if (m_handleToIdentity != IntPtr.Zero)
+      {
+        // free global ident
+        Marshal.FreeHGlobal(m_handleToIdentity);
+      }
+    }
 
-		#endregion // AppenderSkeleton Implementation
+    /// <summary>
+    /// This appender requires a <see cref="AppenderSkeleton.Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="AppenderSkeleton.Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#region Protected Members
+    #endregion // AppenderSkeleton Implementation
 
-		/// <summary>
-		/// Translates a log4net level to a syslog severity.
-		/// </summary>
-		/// <param name="level">A log4net level.</param>
-		/// <returns>A syslog severity.</returns>
-		/// <remarks>
-		/// <para>
-		/// Translates a log4net level to a syslog severity.
-		/// </para>
-		/// </remarks>
-		protected virtual SyslogSeverity GetSeverity(Level level)
-		{
-			LevelSeverity levelSeverity = m_levelMapping.Lookup(level) as LevelSeverity;
-			if (levelSeverity != null)
-			{
-				return levelSeverity.Severity;
-			}
+    #region Protected Members
 
-			//
-			// Fallback to sensible default values
-			//
+    /// <summary>
+    /// Translates a log4net level to a syslog severity.
+    /// </summary>
+    /// <param name="level">A log4net level.</param>
+    /// <returns>A syslog severity.</returns>
+    /// <remarks>
+    /// <para>
+    /// Translates a log4net level to a syslog severity.
+    /// </para>
+    /// </remarks>
+    protected virtual SyslogSeverity GetSeverity(Level level)
+    {
+      LevelSeverity levelSeverity = m_levelMapping.Lookup(level) as LevelSeverity;
+      if (levelSeverity != null)
+      {
+        return levelSeverity.Severity;
+      }
 
-			if (level >= Level.Alert) 
-			{
-				return SyslogSeverity.Alert;
-			} 
-			else if (level >= Level.Critical) 
-			{
-				return SyslogSeverity.Critical;
-			} 
-			else if (level >= Level.Error) 
-			{
-				return SyslogSeverity.Error;
-			} 
-			else if (level >= Level.Warn) 
-			{
-				return SyslogSeverity.Warning;
-			} 
-			else if (level >= Level.Notice) 
-			{
-				return SyslogSeverity.Notice;
-			} 
-			else if (level >= Level.Info) 
-			{
-				return SyslogSeverity.Informational;
-			} 
-			// Default setting
-			return SyslogSeverity.Debug;
-		}
+      //
+      // Fallback to sensible default values
+      //
 
-		#endregion // Protected Members
+      if (level >= Level.Alert)
+      {
+        return SyslogSeverity.Alert;
+      }
+      else if (level >= Level.Critical)
+      {
+        return SyslogSeverity.Critical;
+      }
+      else if (level >= Level.Error)
+      {
+        return SyslogSeverity.Error;
+      }
+      else if (level >= Level.Warn)
+      {
+        return SyslogSeverity.Warning;
+      }
+      else if (level >= Level.Notice)
+      {
+        return SyslogSeverity.Notice;
+      }
+      else if (level >= Level.Info)
+      {
+        return SyslogSeverity.Informational;
+      }
+      // Default setting
+      return SyslogSeverity.Debug;
+    }
 
-		#region Public Static Members
+    #endregion // Protected Members
 
-		/// <summary>
-		/// Generate a syslog priority.
-		/// </summary>
-		/// <param name="facility">The syslog facility.</param>
-		/// <param name="severity">The syslog severity.</param>
-		/// <returns>A syslog priority.</returns>
-		private static int GeneratePriority(SyslogFacility facility, SyslogSeverity severity)
-		{
-			return ((int)facility * 8) + (int)severity;
-		}
+    #region Public Static Members
 
-		#endregion // Public Static Members
+    /// <summary>
+    /// Generate a syslog priority.
+    /// </summary>
+    /// <param name="facility">The syslog facility.</param>
+    /// <param name="severity">The syslog severity.</param>
+    /// <returns>A syslog priority.</returns>
+    private static int GeneratePriority(SyslogFacility facility, SyslogSeverity severity)
+    {
+      return ((int)facility * 8) + (int)severity;
+    }
 
-		#region Private Instances Fields
+    #endregion // Public Static Members
 
-		/// <summary>
-		/// The facility. The default facility is <see cref="SyslogFacility.User"/>.
-		/// </summary>
-		private SyslogFacility m_facility = SyslogFacility.User;
+    #region Private Instances Fields
 
-		/// <summary>
-		/// The message identity
-		/// </summary>
-		private string m_identity;
+    /// <summary>
+    /// The facility. The default facility is <see cref="SyslogFacility.User"/>.
+    /// </summary>
+    private SyslogFacility m_facility = SyslogFacility.User;
 
-		/// <summary>
-		/// Marshaled handle to the identity string. We have to hold on to the
-		/// string as the <c>openlog</c> and <c>syslog</c> APIs just hold the
-		/// pointer to the ident and dereference it for each log message.
-		/// </summary>
-		private IntPtr m_handleToIdentity = IntPtr.Zero;
+    /// <summary>
+    /// The message identity
+    /// </summary>
+    private string m_identity;
 
-		/// <summary>
-		/// Mapping from level object to syslog severity
-		/// </summary>
-		private LevelMapping m_levelMapping = new LevelMapping();
+    /// <summary>
+    /// Marshaled handle to the identity string. We have to hold on to the
+    /// string as the <c>openlog</c> and <c>syslog</c> APIs just hold the
+    /// pointer to the ident and dereference it for each log message.
+    /// </summary>
+    private IntPtr m_handleToIdentity = IntPtr.Zero;
 
-		#endregion // Private Instances Fields
+    /// <summary>
+    /// Mapping from level object to syslog severity
+    /// </summary>
+    private LevelMapping m_levelMapping = new LevelMapping();
 
-		#region External Members
-		
-		/// <summary>
-		/// Open connection to system logger.
-		/// </summary>
-		[DllImport("libc")]
-		private static extern void openlog(IntPtr ident, int option, SyslogFacility facility);
+    #endregion // Private Instances Fields
 
-		/// <summary>
-		/// Generate a log message.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The libc syslog method takes a format string and a variable argument list similar
-		/// to the classic printf function. As this type of vararg list is not supported
-		/// by C# we need to specify the arguments explicitly. Here we have specified the
-		/// format string with a single message argument. The caller must set the format 
-		/// string to <c>"%s"</c>.
-		/// </para>
-		/// </remarks>
-		[DllImport("libc", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
-		private static extern void syslog(int priority, string format, string message);
+    #region External Members
 
-		/// <summary>
-		/// Close descriptor used to write to system logger.
-		/// </summary>
-		[DllImport("libc")]
-		private static extern void closelog();
+    /// <summary>
+    /// Open connection to system logger.
+    /// </summary>
+    [DllImport("libc")]
+    private static extern void openlog(IntPtr ident, int option, SyslogFacility facility);
 
-		#endregion // External Members
+    /// <summary>
+    /// Generate a log message.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The libc syslog method takes a format string and a variable argument list similar
+    /// to the classic printf function. As this type of vararg list is not supported
+    /// by C# we need to specify the arguments explicitly. Here we have specified the
+    /// format string with a single message argument. The caller must set the format 
+    /// string to <c>"%s"</c>.
+    /// </para>
+    /// </remarks>
+    [DllImport("libc", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
+    private static extern void syslog(int priority, string format, string message);
 
-		#region LevelSeverity LevelMapping Entry
+    /// <summary>
+    /// Close descriptor used to write to system logger.
+    /// </summary>
+    [DllImport("libc")]
+    private static extern void closelog();
 
-		/// <summary>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the syslog severity that is should be logged at.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the syslog severity that is should be logged at.
-		/// </para>
-		/// </remarks>
-		public class LevelSeverity : LevelMappingEntry
-		{
-			private SyslogSeverity m_severity;
+    #endregion // External Members
 
-			/// <summary>
-			/// The mapped syslog severity for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped syslog severity for the specified level
-			/// </para>
-			/// </remarks>
-			public SyslogSeverity Severity
-			{
-				get { return m_severity; }
-				set { m_severity = value; }
-			}
-		}
+    #region LevelSeverity LevelMapping Entry
 
-		#endregion // LevelSeverity LevelMapping Entry
-	}
+    /// <summary>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the syslog severity that is should be logged at.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the syslog severity that is should be logged at.
+    /// </para>
+    /// </remarks>
+    public class LevelSeverity : LevelMappingEntry
+    {
+      private SyslogSeverity m_severity;
+
+      /// <summary>
+      /// The mapped syslog severity for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped syslog severity for the specified level
+      /// </para>
+      /// </remarks>
+      public SyslogSeverity Severity
+      {
+        get { return m_severity; }
+        set { m_severity = value; }
+      }
+    }
+
+    #endregion // LevelSeverity LevelMapping Entry
+  }
 }
 
 #endif
diff --git a/src/log4net/Appender/ManagedColoredConsoleAppender.cs b/src/log4net/Appender/ManagedColoredConsoleAppender.cs
index 9edfce5..263ce17 100644
--- a/src/log4net/Appender/ManagedColoredConsoleAppender.cs
+++ b/src/log4net/Appender/ManagedColoredConsoleAppender.cs
@@ -18,7 +18,7 @@
 #endregion
 
 // Compatibility:
-//	http://msdn.microsoft.com/en-us/library/system.console.foregroundcolor.aspx
+//  http://msdn.microsoft.com/en-us/library/system.console.foregroundcolor.aspx
 // Disable for unsupported targets
 #if !NETCF 
 #if !SSCLI
@@ -48,294 +48,298 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends colorful logging events to the console, using the .NET 2
-	/// built-in capabilities.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// ManagedColoredConsoleAppender appends log events to the standard output stream
-	/// or the error output stream using a layout specified by the 
-	/// user. It also allows the color of a specific type of message to be set.
-	/// </para>
-	/// <para>
-	/// By default, all output is written to the console's standard output stream.
-	/// The <see cref="Target"/> property can be set to direct the output to the
-	/// error stream.
-	/// </para>
-	/// <para>
-	/// When configuring the colored console appender, mappings should be
-	/// specified to map logging levels to colors. For example:
-	/// </para>
-	/// <code lang="XML" escaped="true">
-	///	<mapping>
-	///		<level value="ERROR" />
-	///		<foreColor value="DarkRed" />
-	///		<backColor value="White" />
-	///	</mapping>
-	///	<mapping>
-	///		<level value="WARN" />
-	///		<foreColor value="Yellow" />
-	///	</mapping>
-	///	<mapping>
-	///		<level value="INFO" />
-	///		<foreColor value="White" />
-	///	</mapping>
-	///	<mapping>
-	///		<level value="DEBUG" />
-	///		<foreColor value="Blue" />
-	///	</mapping>
-	/// </code>
-	/// <para>
-	/// The Level is the standard log4net logging level while
-	/// ForeColor and BackColor are the values of <see cref="System.ConsoleColor"/>
-	/// enumeration.
-	/// </para>
-	/// <para>
-	/// Based on the ColoredConsoleAppender
-	/// </para>
-	/// </remarks>
-	/// <author>Rick Hobbs</author>
-	/// <author>Nicko Cadell</author>
-	/// <author>Pavlos Touboulidis</author>
-	public class ManagedColoredConsoleAppender: AppenderSkeleton
-	{
-		/// <summary>
-		/// Initializes a new instance of the <see cref="ManagedColoredConsoleAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// The instance of the <see cref="ManagedColoredConsoleAppender" /> class is set up to write 
-		/// to the standard output stream.
-		/// </remarks>
-		public ManagedColoredConsoleAppender() 
-		{
-		}
-		
-		#region Public Instance Properties
-		/// <summary>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </summary>
-		/// <value>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Target is the value of the console output stream.
-		/// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
-		/// </para>
-		/// </remarks>
-		public virtual string Target
-		{
-			get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
-			set
-			{
-				string v = value.Trim();
+  /// <summary>
+  /// Appends colorful logging events to the console, using the .NET 2
+  /// built-in capabilities.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// ManagedColoredConsoleAppender appends log events to the standard output stream
+  /// or the error output stream using a layout specified by the 
+  /// user. It also allows the color of a specific type of message to be set.
+  /// </para>
+  /// <para>
+  /// By default, all output is written to the console's standard output stream.
+  /// The <see cref="Target"/> property can be set to direct the output to the
+  /// error stream.
+  /// </para>
+  /// <para>
+  /// When configuring the colored console appender, mappings should be
+  /// specified to map logging levels to colors. For example:
+  /// </para>
+  /// <code lang="XML" escaped="true">
+  ///  <mapping>
+  ///    <level value="ERROR" />
+  ///    <foreColor value="DarkRed" />
+  ///    <backColor value="White" />
+  ///  </mapping>
+  ///  <mapping>
+  ///    <level value="WARN" />
+  ///    <foreColor value="Yellow" />
+  ///  </mapping>
+  ///  <mapping>
+  ///    <level value="INFO" />
+  ///    <foreColor value="White" />
+  ///  </mapping>
+  ///  <mapping>
+  ///    <level value="DEBUG" />
+  ///    <foreColor value="Blue" />
+  ///  </mapping>
+  /// </code>
+  /// <para>
+  /// The Level is the standard log4net logging level while
+  /// ForeColor and BackColor are the values of <see cref="System.ConsoleColor"/>
+  /// enumeration.
+  /// </para>
+  /// <para>
+  /// Based on the ColoredConsoleAppender
+  /// </para>
+  /// </remarks>
+  /// <author>Rick Hobbs</author>
+  /// <author>Nicko Cadell</author>
+  /// <author>Pavlos Touboulidis</author>
+  public class ManagedColoredConsoleAppender : AppenderSkeleton
+  {
+    /// <summary>
+    /// Initializes a new instance of the <see cref="ManagedColoredConsoleAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// The instance of the <see cref="ManagedColoredConsoleAppender" /> class is set up to write 
+    /// to the standard output stream.
+    /// </remarks>
+    public ManagedColoredConsoleAppender()
+    {
+    }
 
-				if (SystemInfo.EqualsIgnoringCase(ConsoleError, v))
-				{
-					m_writeToErrorStream = true;
-				} 
-				else 
-				{
-					m_writeToErrorStream = false;
-				}
-			}
-		}
+    #region Public Instance Properties
+    /// <summary>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </summary>
+    /// <value>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Target is the value of the console output stream.
+    /// This is either <c>"Console.Out"</c> or <c>"Console.Error"</c>.
+    /// </para>
+    /// </remarks>
+    public virtual string Target
+    {
+      get { return m_writeToErrorStream ? ConsoleError : ConsoleOut; }
+      set
+      {
+        string v = value.Trim();
 
-		/// <summary>
-		/// Add a mapping of level to color - done by the config file
-		/// </summary>
-		/// <param name="mapping">The mapping to add</param>
-		/// <remarks>
-		/// <para>
-		/// Add a <see cref="LevelColors"/> mapping to this appender.
-		/// Each mapping defines the foreground and background colors
-		/// for a level.
-		/// </para>
-		/// </remarks>
-		public void AddMapping(LevelColors mapping)
-		{
-			m_levelMapping.Add(mapping);
-		}
-		#endregion // Public Instance Properties
+        if (SystemInfo.EqualsIgnoringCase(ConsoleError, v))
+        {
+          m_writeToErrorStream = true;
+        }
+        else
+        {
+          m_writeToErrorStream = false;
+        }
+      }
+    }
 
-		#region Override implementation of AppenderSkeleton
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the event to the console.
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
-		protected override void Append(log4net.Core.LoggingEvent loggingEvent) 
-		{
-			System.IO.TextWriter writer;
-			
-			if (m_writeToErrorStream)
-				writer = Console.Error;
-			else
-				writer = Console.Out;
-			
-			// Reset color
-			Console.ResetColor();
-			
-			// see if there is a specified lookup
-			LevelColors levelColors = m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
-			if (levelColors != null)
-			{
-				// if the backColor has been explicitly set
-				if (levelColors.HasBackColor)
-					Console.BackgroundColor = levelColors.BackColor;
-				// if the foreColor has been explicitly set
-				if (levelColors.HasForeColor)
-					Console.ForegroundColor = levelColors.ForeColor;
-			}
-			
-			// Render the event to a string
-			string strLoggingMessage = RenderLoggingEvent(loggingEvent);
-			// and write it
-			writer.Write(strLoggingMessage);
+    /// <summary>
+    /// Add a mapping of level to color - done by the config file
+    /// </summary>
+    /// <param name="mapping">The mapping to add</param>
+    /// <remarks>
+    /// <para>
+    /// Add a <see cref="LevelColors"/> mapping to this appender.
+    /// Each mapping defines the foreground and background colors
+    /// for a level.
+    /// </para>
+    /// </remarks>
+    public void AddMapping(LevelColors mapping)
+    {
+      m_levelMapping.Add(mapping);
+    }
+    #endregion // Public Instance Properties
 
-			// Reset color again
-			Console.ResetColor();
-		}
+    #region Override implementation of AppenderSkeleton
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(log4net.Core.LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the event to the console.
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
+    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
+    {
+      System.IO.TextWriter writer;
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+      if (m_writeToErrorStream)
+        writer = Console.Error;
+      else
+        writer = Console.Out;
 
-		/// <summary>
-		/// Initialize the options for this appender
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initialize the level to color mappings set on this appender.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
-			m_levelMapping.ActivateOptions();
-		}
-		#endregion // Override implementation of AppenderSkeleton
+      // Reset color
+      Console.ResetColor();
 
-		#region Public Static Fields
-		/// <summary>
-		/// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleOut = "Console.Out";
+      // see if there is a specified lookup
+      LevelColors levelColors = m_levelMapping.Lookup(loggingEvent.Level) as LevelColors;
+      if (levelColors != null)
+      {
+        // if the backColor has been explicitly set
+        if (levelColors.HasBackColor)
+          Console.BackgroundColor = levelColors.BackColor;
+        // if the foreColor has been explicitly set
+        if (levelColors.HasForeColor)
+          Console.ForegroundColor = levelColors.ForeColor;
+      }
 
-		/// <summary>
-		/// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
-		/// standard error output stream.
-		/// </para>
-		/// </remarks>
-		public const string ConsoleError = "Console.Error";
-		#endregion // Public Static Fields
+      // Render the event to a string
+      string strLoggingMessage = RenderLoggingEvent(loggingEvent);
+      // and write it
+      writer.Write(strLoggingMessage);
 
-		#region Private Instances Fields
-		/// <summary>
-		/// Flag to write output to the error stream rather than the standard output stream
-		/// </summary>
-		private bool m_writeToErrorStream = false;
+      // Reset color again
+      Console.ResetColor();
+    }
 
-		/// <summary>
-		/// Mapping from level object to color value
-		/// </summary>
-		private LevelMapping m_levelMapping = new LevelMapping();
-		#endregion // Private Instances Fields
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#region LevelColors LevelMapping Entry
-		/// <summary>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the color it should be displayed as.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Defines the mapping between a level and the color it should be displayed in.
-		/// </para>
-		/// </remarks>
-		public class LevelColors : LevelMappingEntry
-		{
-			/// <summary>
-			/// The mapped foreground color for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped foreground color for the specified level.
-			/// </para>
-			/// </remarks>
-			public ConsoleColor ForeColor
-			{
-				get { return (this.foreColor); }
-				// Keep a flag that the color has been set
-				// and is no longer the default.
-				set { this.foreColor = value; this.hasForeColor = true; }
-			}
-			private ConsoleColor foreColor;
-			private bool hasForeColor;
-            internal bool HasForeColor {
-                get {
-                    return hasForeColor;
-                }
-            }
+    /// <summary>
+    /// Initialize the options for this appender
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initialize the level to color mappings set on this appender.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
+      m_levelMapping.ActivateOptions();
+    }
+    #endregion // Override implementation of AppenderSkeleton
 
-			/// <summary>
-			/// The mapped background color for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped background color for the specified level.
-			/// </para>
-			/// </remarks>
-			public ConsoleColor BackColor
-			{
-				get { return (this.backColor); }
-				// Keep a flag that the color has been set
-				// and is no longer the default.
-				set { this.backColor = value; this.hasBackColor = true; }
-			}
-			private ConsoleColor backColor;
-            private bool hasBackColor;
-            internal bool HasBackColor {
-                get {
-                    return hasBackColor;
-                }
-            }
-		}
-		#endregion // LevelColors LevelMapping Entry
-	}
+    #region Public Static Fields
+    /// <summary>
+    /// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleOut = "Console.Out";
+
+    /// <summary>
+    /// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ManagedColoredConsoleAppender.Target"/> to use when writing to the Console 
+    /// standard error output stream.
+    /// </para>
+    /// </remarks>
+    public const string ConsoleError = "Console.Error";
+    #endregion // Public Static Fields
+
+    #region Private Instances Fields
+    /// <summary>
+    /// Flag to write output to the error stream rather than the standard output stream
+    /// </summary>
+    private bool m_writeToErrorStream = false;
+
+    /// <summary>
+    /// Mapping from level object to color value
+    /// </summary>
+    private LevelMapping m_levelMapping = new LevelMapping();
+    #endregion // Private Instances Fields
+
+    #region LevelColors LevelMapping Entry
+    /// <summary>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the color it should be displayed as.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defines the mapping between a level and the color it should be displayed in.
+    /// </para>
+    /// </remarks>
+    public class LevelColors : LevelMappingEntry
+    {
+      /// <summary>
+      /// The mapped foreground color for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped foreground color for the specified level.
+      /// </para>
+      /// </remarks>
+      public ConsoleColor ForeColor
+      {
+        get { return (this.foreColor); }
+        // Keep a flag that the color has been set
+        // and is no longer the default.
+        set { this.foreColor = value; this.hasForeColor = true; }
+      }
+      private ConsoleColor foreColor;
+      private bool hasForeColor;
+      internal bool HasForeColor
+      {
+        get
+        {
+          return hasForeColor;
+        }
+      }
+
+      /// <summary>
+      /// The mapped background color for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped background color for the specified level.
+      /// </para>
+      /// </remarks>
+      public ConsoleColor BackColor
+      {
+        get { return (this.backColor); }
+        // Keep a flag that the color has been set
+        // and is no longer the default.
+        set { this.backColor = value; this.hasBackColor = true; }
+      }
+      private ConsoleColor backColor;
+      private bool hasBackColor;
+      internal bool HasBackColor
+      {
+        get
+        {
+          return hasBackColor;
+        }
+      }
+    }
+    #endregion // LevelColors LevelMapping Entry
+  }
 }
 
 #endif
diff --git a/src/log4net/Appender/MemoryAppender.cs b/src/log4net/Appender/MemoryAppender.cs
index 441569c..486a410 100644
--- a/src/log4net/Appender/MemoryAppender.cs
+++ b/src/log4net/Appender/MemoryAppender.cs
@@ -24,202 +24,202 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Stores logging events in an array.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The memory appender stores all the logging events
-	/// that are appended in an in-memory array.
-	/// </para>
-	/// <para>
-	/// Use the <see cref="M:PopAllEvents()"/> method to get
-	/// and clear the current list of events that have been appended.
-	/// </para>
-	/// <para>
-	/// Use the <see cref="M:GetEvents()"/> method to get the current
-	/// list of events that have been appended.  Note there is a
-	/// race-condition when calling <see cref="M:GetEvents()"/> and
-	/// <see cref="M:Clear()"/> in pairs, you better use <see
-	/// mref="M:PopAllEvents()"/> in that case.
-	/// </para>
-	/// <para>
-	/// Use the <see cref="M:Clear()"/> method to clear the
-	/// current list of events.  Note there is a
-	/// race-condition when calling <see cref="M:GetEvents()"/> and
-	/// <see cref="M:Clear()"/> in pairs, you better use <see
-	/// mref="M:PopAllEvents()"/> in that case.
-	/// </para>
-	/// </remarks>
-	/// <author>Julian Biddle</author>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class MemoryAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Stores logging events in an array.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The memory appender stores all the logging events
+  /// that are appended in an in-memory array.
+  /// </para>
+  /// <para>
+  /// Use the <see cref="M:PopAllEvents()"/> method to get
+  /// and clear the current list of events that have been appended.
+  /// </para>
+  /// <para>
+  /// Use the <see cref="M:GetEvents()"/> method to get the current
+  /// list of events that have been appended.  Note there is a
+  /// race-condition when calling <see cref="M:GetEvents()"/> and
+  /// <see cref="M:Clear()"/> in pairs, you better use <see
+  /// mref="M:PopAllEvents()"/> in that case.
+  /// </para>
+  /// <para>
+  /// Use the <see cref="M:Clear()"/> method to clear the
+  /// current list of events.  Note there is a
+  /// race-condition when calling <see cref="M:GetEvents()"/> and
+  /// <see cref="M:Clear()"/> in pairs, you better use <see
+  /// mref="M:PopAllEvents()"/> in that case.
+  /// </para>
+  /// </remarks>
+  /// <author>Julian Biddle</author>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class MemoryAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="MemoryAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public MemoryAppender() : base()
-		{
-			m_eventsList = new ArrayList();
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="MemoryAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public MemoryAppender() : base()
+    {
+      m_eventsList = new ArrayList();
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the events that have been logged.
-		/// </summary>
-		/// <returns>The events that have been logged</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the events that have been logged.
-		/// </para>
-		/// </remarks>
-		public virtual LoggingEvent[] GetEvents()
-		{
-            lock (m_eventsList.SyncRoot)
-            {
-                return (LoggingEvent[]) m_eventsList.ToArray(typeof(LoggingEvent));
-            }
-		}
+    /// <summary>
+    /// Gets the events that have been logged.
+    /// </summary>
+    /// <returns>The events that have been logged</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the events that have been logged.
+    /// </para>
+    /// </remarks>
+    public virtual LoggingEvent[] GetEvents()
+    {
+      lock (m_eventsList.SyncRoot)
+      {
+        return (LoggingEvent[])m_eventsList.ToArray(typeof(LoggingEvent));
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets a value indicating whether only part of the logging event 
-		/// data should be fixed.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if the appender should only fix part of the logging event 
-		/// data, otherwise <c>false</c>. The default is <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Setting this property to <c>true</c> will cause only part of the event 
-		/// data to be fixed and stored in the appender, hereby improving performance. 
-		/// </para>
-		/// <para>
-		/// See <see cref="M:LoggingEvent.FixVolatileData(bool)"/> for more information.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use Fix property")]
-		public virtual bool OnlyFixPartialEventData
-		{
-			get { return (Fix == FixFlags.Partial); }
-			set 
-			{ 
-				if (value)
-				{
-					Fix = FixFlags.Partial;
-				}
-				else
-				{
-					Fix = FixFlags.All;
-				}
-			}
-		}
-
-		/// <summary>
-		/// Gets or sets the fields that will be fixed in the event
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The logging event needs to have certain thread specific values 
-		/// captured before it can be buffered. See <see cref="LoggingEvent.Fix"/>
-		/// for details.
-		/// </para>
-		/// </remarks>
-		public virtual FixFlags Fix
-		{
-			get { return m_fixFlags; }
-			set { m_fixFlags = value; }
-		}
-
-		#endregion Public Instance Properties
-
-		#region Override implementation of AppenderSkeleton
-
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method. 
-		/// </summary>
-		/// <param name="loggingEvent">the event to log</param>
-		/// <remarks>
-		/// <para>Stores the <paramref name="loggingEvent"/> in the events list.</para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			// Because we are caching the LoggingEvent beyond the
-			// lifetime of the Append() method we must fix any
-			// volatile data in the event.
-			loggingEvent.Fix = this.Fix;
-
-            lock (m_eventsList.SyncRoot)
-            {
-                m_eventsList.Add(loggingEvent);
-            }
-		} 
-
-		#endregion Override implementation of AppenderSkeleton
-
-		#region Public Instance Methods
-
-		/// <summary>
-		/// Clear the list of events
-		/// </summary>
-		/// <remarks>
-		/// Clear the list of events
-		/// </remarks>
-		public virtual void Clear()
-		{
-            lock (m_eventsList.SyncRoot)
-            {
-                m_eventsList.Clear();
-            }
-		}
-
-        /// <summary>
-        /// Gets the events that have been logged and clears the list of events.
-        /// </summary>
-        /// <returns>The events that have been logged</returns>
-        /// <remarks>
-        /// <para>
-        /// Gets the events that have been logged and clears the list of events.
-        /// </para>
-        /// </remarks>
-        public virtual LoggingEvent[] PopAllEvents()
+    /// <summary>
+    /// Gets or sets a value indicating whether only part of the logging event 
+    /// data should be fixed.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if the appender should only fix part of the logging event 
+    /// data, otherwise <c>false</c>. The default is <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Setting this property to <c>true</c> will cause only part of the event 
+    /// data to be fixed and stored in the appender, hereby improving performance. 
+    /// </para>
+    /// <para>
+    /// See <see cref="M:LoggingEvent.FixVolatileData(bool)"/> for more information.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use Fix property")]
+    public virtual bool OnlyFixPartialEventData
+    {
+      get { return (Fix == FixFlags.Partial); }
+      set
+      {
+        if (value)
         {
-            lock (m_eventsList.SyncRoot)
-            {
-                LoggingEvent[] tmp = (LoggingEvent[]) m_eventsList.ToArray(typeof (LoggingEvent));
-                m_eventsList.Clear();
-                return tmp;
-            }
+          Fix = FixFlags.Partial;
         }
+        else
+        {
+          Fix = FixFlags.All;
+        }
+      }
+    }
 
-		#endregion Public Instance Methods
+    /// <summary>
+    /// Gets or sets the fields that will be fixed in the event
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The logging event needs to have certain thread specific values 
+    /// captured before it can be buffered. See <see cref="LoggingEvent.Fix"/>
+    /// for details.
+    /// </para>
+    /// </remarks>
+    public virtual FixFlags Fix
+    {
+      get { return m_fixFlags; }
+      set { m_fixFlags = value; }
+    }
 
-		#region Protected Instance Fields
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// The list of events that have been appended.
-		/// </summary>
-		protected ArrayList m_eventsList;
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Value indicating which fields in the event should be fixed
-		/// </summary>
-		/// <remarks>
-		/// By default all fields are fixed
-		/// </remarks>
-		protected FixFlags m_fixFlags = FixFlags.All;
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method. 
+    /// </summary>
+    /// <param name="loggingEvent">the event to log</param>
+    /// <remarks>
+    /// <para>Stores the <paramref name="loggingEvent"/> in the events list.</para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      // Because we are caching the LoggingEvent beyond the
+      // lifetime of the Append() method we must fix any
+      // volatile data in the event.
+      loggingEvent.Fix = this.Fix;
 
-		#endregion Protected Instance Fields
-	}
+      lock (m_eventsList.SyncRoot)
+      {
+        m_eventsList.Add(loggingEvent);
+      }
+    }
+
+    #endregion Override implementation of AppenderSkeleton
+
+    #region Public Instance Methods
+
+    /// <summary>
+    /// Clear the list of events
+    /// </summary>
+    /// <remarks>
+    /// Clear the list of events
+    /// </remarks>
+    public virtual void Clear()
+    {
+      lock (m_eventsList.SyncRoot)
+      {
+        m_eventsList.Clear();
+      }
+    }
+
+    /// <summary>
+    /// Gets the events that have been logged and clears the list of events.
+    /// </summary>
+    /// <returns>The events that have been logged</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the events that have been logged and clears the list of events.
+    /// </para>
+    /// </remarks>
+    public virtual LoggingEvent[] PopAllEvents()
+    {
+      lock (m_eventsList.SyncRoot)
+      {
+        LoggingEvent[] tmp = (LoggingEvent[])m_eventsList.ToArray(typeof(LoggingEvent));
+        m_eventsList.Clear();
+        return tmp;
+      }
+    }
+
+    #endregion Public Instance Methods
+
+    #region Protected Instance Fields
+
+    /// <summary>
+    /// The list of events that have been appended.
+    /// </summary>
+    protected ArrayList m_eventsList;
+
+    /// <summary>
+    /// Value indicating which fields in the event should be fixed
+    /// </summary>
+    /// <remarks>
+    /// By default all fields are fixed
+    /// </remarks>
+    protected FixFlags m_fixFlags = FixFlags.All;
+
+    #endregion Protected Instance Fields
+  }
 }
diff --git a/src/log4net/Appender/NetSendAppender.cs b/src/log4net/Appender/NetSendAppender.cs
index b03d21d..1c0d0ae 100644
--- a/src/log4net/Appender/NetSendAppender.cs
+++ b/src/log4net/Appender/NetSendAppender.cs
@@ -35,388 +35,388 @@
 using log4net.Core;
 
 
-namespace log4net.Appender 
+namespace log4net.Appender
 {
-	/// <summary>
-	/// Logs entries by sending network messages using the 
-	/// <see cref="NetMessageBufferSend" /> native function.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// You can send messages only to names that are active 
-	/// on the network. If you send the message to a user name, 
-	/// that user must be logged on and running the Messenger 
-	/// service to receive the message.
-	/// </para>
-	/// <para>
-	/// The receiver will get a top most window displaying the 
-	/// messages one at a time, therefore this appender should 
-	/// not be used to deliver a high volume of messages.
-	/// </para>
-	/// <para>
-	/// The following table lists some possible uses for this appender :
-	/// </para>
-	/// <para>
-	/// <list type="table">
-	///     <listheader>
-	///         <term>Action</term>
-	///         <description>Property Value(s)</description>
-	///     </listheader>
-	///     <item>
-	///         <term>Send a message to a user account on the local machine</term>
-	///         <description>
-	///             <para>
-	///             <see cref="NetSendAppender.Server"/> = &lt;name of the local machine&gt;
-	///             </para>
-	///             <para>
-	///             <see cref="NetSendAppender.Recipient"/> = &lt;user name&gt;
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>Send a message to a user account on a remote machine</term>
-	///         <description>
-	///             <para>
-	///             <see cref="NetSendAppender.Server"/> = &lt;name of the remote machine&gt;
-	///             </para>
-	///             <para>
-	///             <see cref="NetSendAppender.Recipient"/> = &lt;user name&gt;
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>Send a message to a domain user account</term>
-	///         <description>
-	///             <para>
-	///             <see cref="NetSendAppender.Server"/> = &lt;name of a domain controller | uninitialized&gt;
-	///             </para>
-	///             <para>
-	///             <see cref="NetSendAppender.Recipient"/> = &lt;user name&gt;
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>Send a message to all the names in a workgroup or domain</term>
-	///         <description>
-	///             <para>
-	///             <see cref="NetSendAppender.Recipient"/> = &lt;workgroup name | domain name&gt;*
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>Send a message from the local machine to a remote machine</term>
-	///         <description>
-	///             <para>
-	///             <see cref="NetSendAppender.Server"/> = &lt;name of the local machine | uninitialized&gt;
-	///             </para>
-	///             <para>
-	///             <see cref="NetSendAppender.Recipient"/> = &lt;name of the remote machine&gt;
-	///             </para>
-	///         </description>
-	///     </item>
-	/// </list>
-	/// </para>
-	/// <para>
-	/// <b>Note :</b> security restrictions apply for sending 
-	/// network messages, see <see cref="NetMessageBufferSend" /> 
-	/// for more information.
-	/// </para>
-	/// </remarks>
-	/// <example>
-	/// <para>
-	/// An example configuration section to log information 
-	/// using this appender from the local machine, named 
-	/// LOCAL_PC, to machine OPERATOR_PC :
-	/// </para>
-	/// <code lang="XML" escaped="true">
-	/// <appender name="NetSendAppender_Operator" type="log4net.Appender.NetSendAppender">
-	///     <server value="LOCAL_PC" />
-	///     <recipient value="OPERATOR_PC" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%-5p %c [%x] - %m%n" />
-	/// </appender>
-	/// </code>
-	/// </example>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class NetSendAppender : AppenderSkeleton 
-	{
-		#region Member Variables
+  /// <summary>
+  /// Logs entries by sending network messages using the 
+  /// <see cref="NetMessageBufferSend" /> native function.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// You can send messages only to names that are active 
+  /// on the network. If you send the message to a user name, 
+  /// that user must be logged on and running the Messenger 
+  /// service to receive the message.
+  /// </para>
+  /// <para>
+  /// The receiver will get a top most window displaying the 
+  /// messages one at a time, therefore this appender should 
+  /// not be used to deliver a high volume of messages.
+  /// </para>
+  /// <para>
+  /// The following table lists some possible uses for this appender :
+  /// </para>
+  /// <para>
+  /// <list type="table">
+  ///     <listheader>
+  ///         <term>Action</term>
+  ///         <description>Property Value(s)</description>
+  ///     </listheader>
+  ///     <item>
+  ///         <term>Send a message to a user account on the local machine</term>
+  ///         <description>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Server"/> = &lt;name of the local machine&gt;
+  ///             </para>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Recipient"/> = &lt;user name&gt;
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>Send a message to a user account on a remote machine</term>
+  ///         <description>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Server"/> = &lt;name of the remote machine&gt;
+  ///             </para>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Recipient"/> = &lt;user name&gt;
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>Send a message to a domain user account</term>
+  ///         <description>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Server"/> = &lt;name of a domain controller | uninitialized&gt;
+  ///             </para>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Recipient"/> = &lt;user name&gt;
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>Send a message to all the names in a workgroup or domain</term>
+  ///         <description>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Recipient"/> = &lt;workgroup name | domain name&gt;*
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>Send a message from the local machine to a remote machine</term>
+  ///         <description>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Server"/> = &lt;name of the local machine | uninitialized&gt;
+  ///             </para>
+  ///             <para>
+  ///             <see cref="NetSendAppender.Recipient"/> = &lt;name of the remote machine&gt;
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  /// </list>
+  /// </para>
+  /// <para>
+  /// <b>Note :</b> security restrictions apply for sending 
+  /// network messages, see <see cref="NetMessageBufferSend" /> 
+  /// for more information.
+  /// </para>
+  /// </remarks>
+  /// <example>
+  /// <para>
+  /// An example configuration section to log information 
+  /// using this appender from the local machine, named 
+  /// LOCAL_PC, to machine OPERATOR_PC :
+  /// </para>
+  /// <code lang="XML" escaped="true">
+  /// <appender name="NetSendAppender_Operator" type="log4net.Appender.NetSendAppender">
+  ///     <server value="LOCAL_PC" />
+  ///     <recipient value="OPERATOR_PC" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%-5p %c [%x] - %m%n" />
+  /// </appender>
+  /// </code>
+  /// </example>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class NetSendAppender : AppenderSkeleton
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// The DNS or NetBIOS name of the server on which the function is to execute.
-		/// </summary>
-		private string m_server;
+    /// <summary>
+    /// The DNS or NetBIOS name of the server on which the function is to execute.
+    /// </summary>
+    private string m_server;
 
-		/// <summary>
-		/// The sender of the network message.
-		/// </summary>
-		private string m_sender;
+    /// <summary>
+    /// The sender of the network message.
+    /// </summary>
+    private string m_sender;
 
-		/// <summary>
-		/// The message alias to which the message should be sent.
-		/// </summary>
-		private string m_recipient;
+    /// <summary>
+    /// The message alias to which the message should be sent.
+    /// </summary>
+    private string m_recipient;
 
-		/// <summary>
-		/// The security context to use for privileged calls
-		/// </summary>
-		private SecurityContext m_securityContext;
+    /// <summary>
+    /// The security context to use for privileged calls
+    /// </summary>
+    private SecurityContext m_securityContext;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Initializes the appender.
-		/// </summary>
-		/// <remarks>
-		/// The default constructor initializes all fields to their default values.
-		/// </remarks>
-		public NetSendAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes the appender.
+    /// </summary>
+    /// <remarks>
+    /// The default constructor initializes all fields to their default values.
+    /// </remarks>
+    public NetSendAppender()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Properties
+    #region Properties
 
-		/// <summary>
-		/// Gets or sets the sender of the message.
-		/// </summary>
-		/// <value>
-		/// The sender of the message.
-		/// </value>
-		/// <remarks>
-		/// If this property is not specified, the message is sent from the local computer.
-		/// </remarks>
-		public string Sender 
-		{
-			get { return m_sender; }
-			set { m_sender = value; }
-		}
+    /// <summary>
+    /// Gets or sets the sender of the message.
+    /// </summary>
+    /// <value>
+    /// The sender of the message.
+    /// </value>
+    /// <remarks>
+    /// If this property is not specified, the message is sent from the local computer.
+    /// </remarks>
+    public string Sender
+    {
+      get { return m_sender; }
+      set { m_sender = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the message alias to which the message should be sent.
-		/// </summary>
-		/// <value>
-		/// The recipient of the message.
-		/// </value>
-		/// <remarks>
-		/// This property should always be specified in order to send a message.
-		/// </remarks>
-		public string Recipient 
-		{
-			get { return m_recipient; }
-			set { m_recipient = value; }
-		}
-		
-		/// <summary>
-		/// Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute.
-		/// </summary>
-		/// <value>
-		/// DNS or NetBIOS name of the remote server on which the function is to execute.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// For Windows NT 4.0 and earlier, the string should begin with \\.
-		/// </para>
-		/// <para>
-		/// If this property is not specified, the local computer is used. 
-		/// </para>
-		/// </remarks>
-		public string Server 
-		{
-			get { return m_server; }
-			set { m_server = value; }
-		}
+    /// <summary>
+    /// Gets or sets the message alias to which the message should be sent.
+    /// </summary>
+    /// <value>
+    /// The recipient of the message.
+    /// </value>
+    /// <remarks>
+    /// This property should always be specified in order to send a message.
+    /// </remarks>
+    public string Recipient
+    {
+      get { return m_recipient; }
+      set { m_recipient = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="SecurityContext"/> used to call the NetSend method.
-		/// </summary>
-		/// <value>
-		/// The <see cref="SecurityContext"/> used to call the NetSend method.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Unless a <see cref="SecurityContext"/> specified here for this appender
-		/// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
-		/// security context to use. The default behavior is to use the security context
-		/// of the current thread.
-		/// </para>
-		/// </remarks>
-		public SecurityContext SecurityContext 
-		{
-			get { return m_securityContext; }
-			set { m_securityContext = value; }
-		}
+    /// <summary>
+    /// Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute.
+    /// </summary>
+    /// <value>
+    /// DNS or NetBIOS name of the remote server on which the function is to execute.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// For Windows NT 4.0 and earlier, the string should begin with \\.
+    /// </para>
+    /// <para>
+    /// If this property is not specified, the local computer is used. 
+    /// </para>
+    /// </remarks>
+    public string Server
+    {
+      get { return m_server; }
+      set { m_server = value; }
+    }
 
-		#endregion
+    /// <summary>
+    /// Gets or sets the <see cref="SecurityContext"/> used to call the NetSend method.
+    /// </summary>
+    /// <value>
+    /// The <see cref="SecurityContext"/> used to call the NetSend method.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Unless a <see cref="SecurityContext"/> specified here for this appender
+    /// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
+    /// security context to use. The default behavior is to use the security context
+    /// of the current thread.
+    /// </para>
+    /// </remarks>
+    public SecurityContext SecurityContext
+    {
+      get { return m_securityContext; }
+      set { m_securityContext = value; }
+    }
 
-		#region Implementation of IOptionHandler
+    #endregion
 
-		/// <summary>
-		/// Initialize the appender based on the options set.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// The appender will be ignored if no <see cref="Recipient" /> was specified.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">The required property <see cref="Recipient" /> was not specified.</exception>
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
-	
-			if (this.Recipient == null) 
-			{
-				throw new ArgumentNullException("Recipient", "The required property 'Recipient' was not specified.");
-			}
+    #region Implementation of IOptionHandler
 
-			if (m_securityContext == null)
-			{
-				m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-			}
-		}
+    /// <summary>
+    /// Initialize the appender based on the options set.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// The appender will be ignored if no <see cref="Recipient" /> was specified.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">The required property <see cref="Recipient" /> was not specified.</exception>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-		#endregion
+      if (this.Recipient == null)
+      {
+        throw new ArgumentNullException("Recipient", "The required property 'Recipient' was not specified.");
+      }
 
-		#region Override implementation of AppenderSkeleton
+      if (m_securityContext == null)
+      {
+        m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
+      }
+    }
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Sends the event using a network message.
-		/// </para>
-		/// </remarks>
+    #endregion
+
+    #region Override implementation of AppenderSkeleton
+
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Sends the event using a network message.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
 #if !NETSTANDARD1_3
-		[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
 #endif
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			NativeError nativeError = null;
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      NativeError nativeError = null;
 
-			// Render the event in the callers security context
-			string renderedLoggingEvent = RenderLoggingEvent(loggingEvent);
+      // Render the event in the callers security context
+      string renderedLoggingEvent = RenderLoggingEvent(loggingEvent);
 
-			using(m_securityContext.Impersonate(this))
-			{
-				// Send the message
-				int returnValue = NetMessageBufferSend(this.Server, this.Recipient, this.Sender, renderedLoggingEvent, renderedLoggingEvent.Length * Marshal.SystemDefaultCharSize);   
+      using (m_securityContext.Impersonate(this))
+      {
+        // Send the message
+        int returnValue = NetMessageBufferSend(this.Server, this.Recipient, this.Sender, renderedLoggingEvent, renderedLoggingEvent.Length * Marshal.SystemDefaultCharSize);
 
-				// Log the error if the message could not be sent
-				if (returnValue != 0) 
-				{
-					// Lookup the native error
-					nativeError = NativeError.GetError(returnValue);
-				}
-			}
+        // Log the error if the message could not be sent
+        if (returnValue != 0)
+        {
+          // Lookup the native error
+          nativeError = NativeError.GetError(returnValue);
+        }
+      }
 
-			if (nativeError != null)
-			{
-				// Handle the error over to the ErrorHandler
-				ErrorHandler.Error(nativeError.ToString() + " (Params: Server=" + this.Server + ", Recipient=" + this.Recipient + ", Sender=" + this.Sender + ")");
-			}
-		}
+      if (nativeError != null)
+      {
+        // Handle the error over to the ErrorHandler
+        ErrorHandler.Error(nativeError.ToString() + " (Params: Server=" + this.Server + ", Recipient=" + this.Recipient + ", Sender=" + this.Sender + ")");
+      }
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Stubs For Native Function Calls
+    #region Stubs For Native Function Calls
 
-		/// <summary>
-		/// Sends a buffer of information to a registered message alias.
-		/// </summary>
-		/// <param name="serverName">The DNS or NetBIOS name of the server on which the function is to execute.</param>
-		/// <param name="msgName">The message alias to which the message buffer should be sent</param>
-		/// <param name="fromName">The originator of the message.</param>
-		/// <param name="buffer">The message text.</param>
-		/// <param name="bufferSize">The length, in bytes, of the message text.</param>
-		/// <remarks>
-		/// <para>
-		/// The following restrictions apply for sending network messages:
-		/// </para>
-		/// <para>
-		/// <list type="table">
-		///     <listheader>
-		///         <term>Platform</term>
-		///         <description>Requirements</description>
-		///     </listheader>
-		///     <item>
-		///         <term>Windows NT</term>
-		///         <description>
-		///             <para>
-		///             No special group membership is required to send a network message.
-		///             </para>
-		///             <para>
-		///             Admin, Accounts, Print, or Server Operator group membership is required to 
-		///             successfully send a network message on a remote server.
-		///             </para>
-		///         </description>
-		///     </item>
-		///     <item>
-		///         <term>Windows 2000 or later</term>
-		///         <description>
-		///             <para>
-		///             If you send a message on a domain controller that is running Active Directory, 
-		///             access is allowed or denied based on the access control list (ACL) for the securable 
-		///             object. The default ACL permits only Domain Admins and Account Operators to send a network message. 
-		///             </para>
-		///             <para>
-		///             On a member server or workstation, only Administrators and Server Operators can send a network message. 
-		///             </para>
-		///         </description>
-		///     </item>
-		/// </list>
-		/// </para>
-		/// <para>
-		/// For more information see <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/security_requirements_for_the_network_management_functions.asp">Security Requirements for the Network Management Functions</a>.
-		/// </para>
-		/// </remarks>
-		/// <returns>
-		/// <para>
-		/// If the function succeeds, the return value is zero.
-		/// </para>
-		/// </returns>
-		[DllImport("netapi32.dll", SetLastError=true)] 
-		protected static extern int NetMessageBufferSend(	   
-			[MarshalAs(UnmanagedType.LPWStr)] string serverName,
-			[MarshalAs(UnmanagedType.LPWStr)] string msgName,
-			[MarshalAs(UnmanagedType.LPWStr)] string fromName,
-			[MarshalAs(UnmanagedType.LPWStr)] string buffer,
-			int bufferSize);
+    /// <summary>
+    /// Sends a buffer of information to a registered message alias.
+    /// </summary>
+    /// <param name="serverName">The DNS or NetBIOS name of the server on which the function is to execute.</param>
+    /// <param name="msgName">The message alias to which the message buffer should be sent</param>
+    /// <param name="fromName">The originator of the message.</param>
+    /// <param name="buffer">The message text.</param>
+    /// <param name="bufferSize">The length, in bytes, of the message text.</param>
+    /// <remarks>
+    /// <para>
+    /// The following restrictions apply for sending network messages:
+    /// </para>
+    /// <para>
+    /// <list type="table">
+    ///     <listheader>
+    ///         <term>Platform</term>
+    ///         <description>Requirements</description>
+    ///     </listheader>
+    ///     <item>
+    ///         <term>Windows NT</term>
+    ///         <description>
+    ///             <para>
+    ///             No special group membership is required to send a network message.
+    ///             </para>
+    ///             <para>
+    ///             Admin, Accounts, Print, or Server Operator group membership is required to 
+    ///             successfully send a network message on a remote server.
+    ///             </para>
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>Windows 2000 or later</term>
+    ///         <description>
+    ///             <para>
+    ///             If you send a message on a domain controller that is running Active Directory, 
+    ///             access is allowed or denied based on the access control list (ACL) for the securable 
+    ///             object. The default ACL permits only Domain Admins and Account Operators to send a network message. 
+    ///             </para>
+    ///             <para>
+    ///             On a member server or workstation, only Administrators and Server Operators can send a network message. 
+    ///             </para>
+    ///         </description>
+    ///     </item>
+    /// </list>
+    /// </para>
+    /// <para>
+    /// For more information see <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/security_requirements_for_the_network_management_functions.asp">Security Requirements for the Network Management Functions</a>.
+    /// </para>
+    /// </remarks>
+    /// <returns>
+    /// <para>
+    /// If the function succeeds, the return value is zero.
+    /// </para>
+    /// </returns>
+    [DllImport("netapi32.dll", SetLastError = true)]
+    protected static extern int NetMessageBufferSend(
+      [MarshalAs(UnmanagedType.LPWStr)] string serverName,
+      [MarshalAs(UnmanagedType.LPWStr)] string msgName,
+      [MarshalAs(UnmanagedType.LPWStr)] string fromName,
+      [MarshalAs(UnmanagedType.LPWStr)] string buffer,
+      int bufferSize);
 
-		#endregion
-	}
+    #endregion
+  }
 }
 
 #endif // !CLI_1_0
diff --git a/src/log4net/Appender/OutputDebugStringAppender.cs b/src/log4net/Appender/OutputDebugStringAppender.cs
index 1a13512..5580532 100644
--- a/src/log4net/Appender/OutputDebugStringAppender.cs
+++ b/src/log4net/Appender/OutputDebugStringAppender.cs
@@ -30,104 +30,104 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends log events to the OutputDebugString system.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// OutputDebugStringAppender appends log events to the
-	/// OutputDebugString system.
-	/// </para>
-	/// <para>
-	/// The string is passed to the native <c>OutputDebugString</c> 
-	/// function.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class OutputDebugStringAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Appends log events to the OutputDebugString system.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// OutputDebugStringAppender appends log events to the
+  /// OutputDebugString system.
+  /// </para>
+  /// <para>
+  /// The string is passed to the native <c>OutputDebugString</c> 
+  /// function.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class OutputDebugStringAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="OutputDebugStringAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public OutputDebugStringAppender()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="OutputDebugStringAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public OutputDebugStringAppender()
+    {
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Write the logging event to the output debug string API
-		/// </summary>
-		/// <param name="loggingEvent">the event to log</param>
-		/// <remarks>
-		/// <para>
-		/// Write the logging event to the output debug string API
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Write the logging event to the output debug string API
+    /// </summary>
+    /// <param name="loggingEvent">the event to log</param>
+    /// <remarks>
+    /// <para>
+    /// Write the logging event to the output debug string API
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
 #if !NETCF && !NETSTANDARD1_3
-		[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
 #endif
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
+    protected override void Append(LoggingEvent loggingEvent)
+    {
 #if NETSTANDARD
-			if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
-			{
-				throw new System.PlatformNotSupportedException("OutputDebugString is only available on Windows");
-			}
+      if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+      {
+        throw new System.PlatformNotSupportedException("OutputDebugString is only available on Windows");
+      }
 #endif
 
-			OutputDebugString(RenderLoggingEvent(loggingEvent));
-		} 
+      OutputDebugString(RenderLoggingEvent(loggingEvent));
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion // Override implementation of AppenderSkeleton
+    #endregion // Override implementation of AppenderSkeleton
 
-		#region Protected Static Methods
+    #region Protected Static Methods
 
-		/// <summary>
-		/// Stub for OutputDebugString native method
-		/// </summary>
-		/// <param name="message">the string to output</param>
-		/// <remarks>
-		/// <para>
-		/// Stub for OutputDebugString native method
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Stub for OutputDebugString native method
+    /// </summary>
+    /// <param name="message">the string to output</param>
+    /// <remarks>
+    /// <para>
+    /// Stub for OutputDebugString native method
+    /// </para>
+    /// </remarks>
 #if NETCF || NETSTANDARD
-		[DllImport("CoreDll.dll")]
+    [DllImport("CoreDll.dll")]
 #else
-		[DllImport("Kernel32.dll")]
+    [DllImport("Kernel32.dll")]
 #endif
-		protected static extern void OutputDebugString(string message);
+    protected static extern void OutputDebugString(string message);
 
-		#endregion // Protected Static Methods
-	}
+    #endregion // Protected Static Methods
+  }
 }
 
 #endif // !CLI_1_0
diff --git a/src/log4net/Appender/RemoteSyslogAppender.cs b/src/log4net/Appender/RemoteSyslogAppender.cs
index b67abd3..83e8de0 100644
--- a/src/log4net/Appender/RemoteSyslogAppender.cs
+++ b/src/log4net/Appender/RemoteSyslogAppender.cs
@@ -27,580 +27,580 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Logs events to a remote syslog daemon.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The BSD syslog protocol is used to remotely log to
-	/// a syslog daemon. The syslogd listens for for messages
-	/// on UDP port 514.
-	/// </para>
-	/// <para>
-	/// The syslog UDP protocol is not authenticated. Most syslog daemons
-	/// do not accept remote log messages because of the security implications.
-	/// You may be able to use the LocalSyslogAppender to talk to a local
-	/// syslog service.
-	/// </para>
-	/// <para>
-	/// There is an RFC 3164 that claims to document the BSD Syslog Protocol.
-	/// This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html.
-	/// This appender generates what the RFC calls an "Original Device Message",
-	/// i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation
-	/// this format of message will be accepted by all current syslog daemon
-	/// implementations. The daemon will attach the current time and the source
-	/// hostname or IP address to any messages received.
-	/// </para>
-	/// <para>
-	/// Syslog messages must have a facility and and a severity. The severity
-	/// is derived from the Level of the logging event.
-	/// The facility must be chosen from the set of defined syslog 
-	/// <see cref="SyslogFacility"/> values. The facilities list is predefined
-	/// and cannot be extended.
-	/// </para>
-	/// <para>
-	/// An identifier is specified with each log message. This can be specified
-	/// by setting the <see cref="Identity"/> property. The identity (also know 
-	/// as the tag) must not contain white space. The default value for the
-	/// identity is the application name (from <see cref="LoggingEvent.Domain"/>).
-	/// </para>
-	/// </remarks>
-	/// <author>Rob Lyon</author>
-	/// <author>Nicko Cadell</author>
-	public class RemoteSyslogAppender : UdpAppender
-	{
-		/// <summary>
-		/// Syslog port 514
-		/// </summary>
-		private const int DefaultSyslogPort = 514;
+  /// <summary>
+  /// Logs events to a remote syslog daemon.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The BSD syslog protocol is used to remotely log to
+  /// a syslog daemon. The syslogd listens for for messages
+  /// on UDP port 514.
+  /// </para>
+  /// <para>
+  /// The syslog UDP protocol is not authenticated. Most syslog daemons
+  /// do not accept remote log messages because of the security implications.
+  /// You may be able to use the LocalSyslogAppender to talk to a local
+  /// syslog service.
+  /// </para>
+  /// <para>
+  /// There is an RFC 3164 that claims to document the BSD Syslog Protocol.
+  /// This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html.
+  /// This appender generates what the RFC calls an "Original Device Message",
+  /// i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation
+  /// this format of message will be accepted by all current syslog daemon
+  /// implementations. The daemon will attach the current time and the source
+  /// hostname or IP address to any messages received.
+  /// </para>
+  /// <para>
+  /// Syslog messages must have a facility and and a severity. The severity
+  /// is derived from the Level of the logging event.
+  /// The facility must be chosen from the set of defined syslog 
+  /// <see cref="SyslogFacility"/> values. The facilities list is predefined
+  /// and cannot be extended.
+  /// </para>
+  /// <para>
+  /// An identifier is specified with each log message. This can be specified
+  /// by setting the <see cref="Identity"/> property. The identity (also know 
+  /// as the tag) must not contain white space. The default value for the
+  /// identity is the application name (from <see cref="LoggingEvent.Domain"/>).
+  /// </para>
+  /// </remarks>
+  /// <author>Rob Lyon</author>
+  /// <author>Nicko Cadell</author>
+  public class RemoteSyslogAppender : UdpAppender
+  {
+    /// <summary>
+    /// Syslog port 514
+    /// </summary>
+    private const int DefaultSyslogPort = 514;
 
-		#region Enumerations
+    #region Enumerations
 
-		/// <summary>
-		/// syslog severities
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The syslog severities.
-		/// </para>
-		/// </remarks>
-		public enum SyslogSeverity
-		{
-			/// <summary>
-			/// system is unusable
-			/// </summary>
-			Emergency = 0,
+    /// <summary>
+    /// syslog severities
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The syslog severities.
+    /// </para>
+    /// </remarks>
+    public enum SyslogSeverity
+    {
+      /// <summary>
+      /// system is unusable
+      /// </summary>
+      Emergency = 0,
 
-			/// <summary>
-			/// action must be taken immediately
-			/// </summary>
-			Alert = 1,
+      /// <summary>
+      /// action must be taken immediately
+      /// </summary>
+      Alert = 1,
 
-			/// <summary>
-			/// critical conditions
-			/// </summary>
-			Critical = 2,
+      /// <summary>
+      /// critical conditions
+      /// </summary>
+      Critical = 2,
 
-			/// <summary>
-			/// error conditions
-			/// </summary>
-			Error = 3,
+      /// <summary>
+      /// error conditions
+      /// </summary>
+      Error = 3,
 
-			/// <summary>
-			/// warning conditions
-			/// </summary>
-			Warning = 4,
+      /// <summary>
+      /// warning conditions
+      /// </summary>
+      Warning = 4,
 
-			/// <summary>
-			/// normal but significant condition
-			/// </summary>
-			Notice = 5,
+      /// <summary>
+      /// normal but significant condition
+      /// </summary>
+      Notice = 5,
 
-			/// <summary>
-			/// informational
-			/// </summary>
-			Informational = 6,
+      /// <summary>
+      /// informational
+      /// </summary>
+      Informational = 6,
 
-			/// <summary>
-			/// debug-level messages
-			/// </summary>
-			Debug = 7
-		};
+      /// <summary>
+      /// debug-level messages
+      /// </summary>
+      Debug = 7
+    };
 
-		/// <summary>
-		/// syslog facilities
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The syslog facilities
-		/// </para>
-		/// </remarks>
-		public enum SyslogFacility
-		{
-			/// <summary>
-			/// kernel messages
-			/// </summary>
-			Kernel = 0,
+    /// <summary>
+    /// syslog facilities
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The syslog facilities
+    /// </para>
+    /// </remarks>
+    public enum SyslogFacility
+    {
+      /// <summary>
+      /// kernel messages
+      /// </summary>
+      Kernel = 0,
 
-			/// <summary>
-			/// random user-level messages
-			/// </summary>
-			User = 1,
+      /// <summary>
+      /// random user-level messages
+      /// </summary>
+      User = 1,
 
-			/// <summary>
-			/// mail system
-			/// </summary>
-			Mail = 2,
+      /// <summary>
+      /// mail system
+      /// </summary>
+      Mail = 2,
 
-			/// <summary>
-			/// system daemons
-			/// </summary>
-			Daemons = 3,
+      /// <summary>
+      /// system daemons
+      /// </summary>
+      Daemons = 3,
 
-			/// <summary>
-			/// security/authorization messages
-			/// </summary>
-			Authorization = 4,
+      /// <summary>
+      /// security/authorization messages
+      /// </summary>
+      Authorization = 4,
 
-			/// <summary>
-			/// messages generated internally by syslogd
-			/// </summary>
-			Syslog = 5,
+      /// <summary>
+      /// messages generated internally by syslogd
+      /// </summary>
+      Syslog = 5,
 
-			/// <summary>
-			/// line printer subsystem
-			/// </summary>
-			Printer = 6,
+      /// <summary>
+      /// line printer subsystem
+      /// </summary>
+      Printer = 6,
 
-			/// <summary>
-			/// network news subsystem
-			/// </summary>
-			News = 7,
+      /// <summary>
+      /// network news subsystem
+      /// </summary>
+      News = 7,
 
-			/// <summary>
-			/// UUCP subsystem
-			/// </summary>
-			Uucp = 8,
+      /// <summary>
+      /// UUCP subsystem
+      /// </summary>
+      Uucp = 8,
 
-			/// <summary>
-			/// clock (cron/at) daemon
-			/// </summary>
-			Clock = 9,
+      /// <summary>
+      /// clock (cron/at) daemon
+      /// </summary>
+      Clock = 9,
 
-			/// <summary>
-			/// security/authorization  messages (private)
-			/// </summary>
-			Authorization2 = 10,
+      /// <summary>
+      /// security/authorization  messages (private)
+      /// </summary>
+      Authorization2 = 10,
 
-			/// <summary>
-			/// ftp daemon
-			/// </summary>
-			Ftp = 11,
+      /// <summary>
+      /// ftp daemon
+      /// </summary>
+      Ftp = 11,
 
-			/// <summary>
-			/// NTP subsystem
-			/// </summary>
-			Ntp = 12,
+      /// <summary>
+      /// NTP subsystem
+      /// </summary>
+      Ntp = 12,
 
-			/// <summary>
-			/// log audit
-			/// </summary>
-			Audit = 13,
+      /// <summary>
+      /// log audit
+      /// </summary>
+      Audit = 13,
 
-			/// <summary>
-			/// log alert
-			/// </summary>
-			Alert = 14,
+      /// <summary>
+      /// log alert
+      /// </summary>
+      Alert = 14,
 
-			/// <summary>
-			/// clock daemon
-			/// </summary>
-			Clock2 = 15,
+      /// <summary>
+      /// clock daemon
+      /// </summary>
+      Clock2 = 15,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local0 = 16,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local0 = 16,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local1 = 17,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local1 = 17,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local2 = 18,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local2 = 18,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local3 = 19,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local3 = 19,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local4 = 20,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local4 = 20,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local5 = 21,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local5 = 21,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local6 = 22,
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local6 = 22,
 
-			/// <summary>
-			/// reserved for local use
-			/// </summary>
-			Local7 = 23
-		}
+      /// <summary>
+      /// reserved for local use
+      /// </summary>
+      Local7 = 23
+    }
 
-		#endregion Enumerations
+    #endregion Enumerations
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="RemoteSyslogAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// This instance of the <see cref="RemoteSyslogAppender" /> class is set up to write 
-		/// to a remote syslog daemon.
-		/// </remarks>
-		public RemoteSyslogAppender()
-		{
-			// syslog udp defaults
-			this.RemotePort = DefaultSyslogPort;
-			this.RemoteAddress = System.Net.IPAddress.Parse("127.0.0.1");
-			this.Encoding = System.Text.Encoding.ASCII;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="RemoteSyslogAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// This instance of the <see cref="RemoteSyslogAppender" /> class is set up to write 
+    /// to a remote syslog daemon.
+    /// </remarks>
+    public RemoteSyslogAppender()
+    {
+      // syslog udp defaults
+      this.RemotePort = DefaultSyslogPort;
+      this.RemoteAddress = System.Net.IPAddress.Parse("127.0.0.1");
+      this.Encoding = System.Text.Encoding.ASCII;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Message identity
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// An identifier is specified with each log message. This can be specified
-		/// by setting the <see cref="Identity"/> property. The identity (also know 
-		/// as the tag) must not contain white space. The default value for the
-		/// identity is the application name (from <see cref="LoggingEvent.Domain"/>).
-		/// </para>
-		/// </remarks>
-		public PatternLayout Identity
-		{
-			get { return m_identity; }
-			set { m_identity = value; }
-		}
+    /// <summary>
+    /// Message identity
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// An identifier is specified with each log message. This can be specified
+    /// by setting the <see cref="Identity"/> property. The identity (also know 
+    /// as the tag) must not contain white space. The default value for the
+    /// identity is the application name (from <see cref="LoggingEvent.Domain"/>).
+    /// </para>
+    /// </remarks>
+    public PatternLayout Identity
+    {
+      get { return m_identity; }
+      set { m_identity = value; }
+    }
 
-		/// <summary>
-		/// Syslog facility
-		/// </summary>
-		/// <remarks>
-		/// Set to one of the <see cref="SyslogFacility"/> values. The list of
-		/// facilities is predefined and cannot be extended. The default value
-		/// is <see cref="SyslogFacility.User"/>.
-		/// </remarks>
-		public SyslogFacility Facility
-		{
-			get { return m_facility; }
-			set { m_facility = value; }
-		}
+    /// <summary>
+    /// Syslog facility
+    /// </summary>
+    /// <remarks>
+    /// Set to one of the <see cref="SyslogFacility"/> values. The list of
+    /// facilities is predefined and cannot be extended. The default value
+    /// is <see cref="SyslogFacility.User"/>.
+    /// </remarks>
+    public SyslogFacility Facility
+    {
+      get { return m_facility; }
+      set { m_facility = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// Add a mapping of level to severity
-		/// </summary>
-		/// <param name="mapping">The mapping to add</param>
-		/// <remarks>
-		/// <para>
-		/// Add a <see cref="LevelSeverity"/> mapping to this appender.
-		/// </para>
-		/// </remarks>
-		public void AddMapping(LevelSeverity mapping)
-		{
-			m_levelMapping.Add(mapping);
-		}
+    /// <summary>
+    /// Add a mapping of level to severity
+    /// </summary>
+    /// <param name="mapping">The mapping to add</param>
+    /// <remarks>
+    /// <para>
+    /// Add a <see cref="LevelSeverity"/> mapping to this appender.
+    /// </para>
+    /// </remarks>
+    public void AddMapping(LevelSeverity mapping)
+    {
+      m_levelMapping.Add(mapping);
+    }
 
-		#region AppenderSkeleton Implementation
+    #region AppenderSkeleton Implementation
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the event to a remote syslog daemon.
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent)
-		{
-			try
-			{
-				// Priority
-				int priority = GeneratePriority(m_facility, GetSeverity(loggingEvent.Level));
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the event to a remote syslog daemon.
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      try
+      {
+        // Priority
+        int priority = GeneratePriority(m_facility, GetSeverity(loggingEvent.Level));
 
-				// Identity
-				string identity;
+        // Identity
+        string identity;
 
-				if (m_identity != null)
-				{
-					identity = m_identity.Format(loggingEvent);
-				}
-				else
-				{
-					identity = loggingEvent.Domain;
-				}
+        if (m_identity != null)
+        {
+          identity = m_identity.Format(loggingEvent);
+        }
+        else
+        {
+          identity = loggingEvent.Domain;
+        }
 
-				// Message. The message goes after the tag/identity
-				string message = RenderLoggingEvent(loggingEvent);
+        // Message. The message goes after the tag/identity
+        string message = RenderLoggingEvent(loggingEvent);
 
-				byte[] buffer;
-				int i = 0;
+        byte[] buffer;
+        int i = 0;
 
-				StringBuilder builder = new StringBuilder();
+        StringBuilder builder = new StringBuilder();
 
-				while (i < message.Length)
-				{
-					// Clear StringBuilder
-					builder.Length = 0;
+        while (i < message.Length)
+        {
+          // Clear StringBuilder
+          builder.Length = 0;
 
-					// Write priority
-					builder.Append('<');
-					builder.Append(priority);
-					builder.Append('>');
+          // Write priority
+          builder.Append('<');
+          builder.Append(priority);
+          builder.Append('>');
 
-					// Write identity
-					builder.Append(identity);
-					builder.Append(": ");
+          // Write identity
+          builder.Append(identity);
+          builder.Append(": ");
 
-					AppendMessage(message, ref i, builder);
+          AppendMessage(message, ref i, builder);
 
-					// Grab as a byte array
-					buffer = this.Encoding.GetBytes(builder.ToString());
+          // Grab as a byte array
+          buffer = this.Encoding.GetBytes(builder.ToString());
 
 #if NET_4_5 || NETSTANDARD
-					Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait();
+          Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait();
 #else
-					this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint);
+          this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint);
 #endif
-				}
-			}
-			catch (Exception e)
-			{
-				ErrorHandler.Error(
-						"Unable to send logging event to remote syslog " +
-						this.RemoteAddress.ToString() +
-						" on port " +
-						this.RemotePort + ".",
-						e,
-						ErrorCode.WriteFailure);
-			}
-		}
+        }
+      }
+      catch (Exception e)
+      {
+        ErrorHandler.Error(
+            "Unable to send logging event to remote syslog " +
+            this.RemoteAddress.ToString() +
+            " on port " +
+            this.RemotePort + ".",
+            e,
+            ErrorCode.WriteFailure);
+      }
+    }
 
-		/// <summary>
-		/// Appends the rendered message to the buffer
-		/// </summary>
-		/// <param name="message">rendered message</param>
-		/// <param name="characterIndex">index of the current character in the message</param>
-		/// <param name="builder">buffer</param>
-		protected virtual void AppendMessage(string message, ref int characterIndex, StringBuilder builder)
-		{
-			for (; characterIndex < message.Length; characterIndex++)
-			{
-				char c = message[characterIndex];
+    /// <summary>
+    /// Appends the rendered message to the buffer
+    /// </summary>
+    /// <param name="message">rendered message</param>
+    /// <param name="characterIndex">index of the current character in the message</param>
+    /// <param name="builder">buffer</param>
+    protected virtual void AppendMessage(string message, ref int characterIndex, StringBuilder builder)
+    {
+      for (; characterIndex < message.Length; characterIndex++)
+      {
+        char c = message[characterIndex];
 
-				// Accept only visible ASCII characters and space. See RFC 3164 section 4.1.3
-				if (((int)c >= 32) && ((int)c <= 126))
-				{
-					builder.Append(c);
-				}
-				// If character is newline, break and send the current line
-				else if ((c == '\r') || (c == '\n'))
-				{
-					// Check the next character to handle \r\n or \n\r
-					if ((message.Length > characterIndex + 1) && ((message[characterIndex + 1] == '\r') || (message[characterIndex + 1] == '\n')))
-					{
-						characterIndex++;
-					}
-					characterIndex++;
-					break;
-				}
-			}
-		}
+        // Accept only visible ASCII characters and space. See RFC 3164 section 4.1.3
+        if (((int)c >= 32) && ((int)c <= 126))
+        {
+          builder.Append(c);
+        }
+        // If character is newline, break and send the current line
+        else if ((c == '\r') || (c == '\n'))
+        {
+          // Check the next character to handle \r\n or \n\r
+          if ((message.Length > characterIndex + 1) && ((message[characterIndex + 1] == '\r') || (message[characterIndex + 1] == '\n')))
+          {
+            characterIndex++;
+          }
+          characterIndex++;
+          break;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Initialize the options for this appender
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initialize the level to syslog severity mappings set on this appender.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
-			m_levelMapping.ActivateOptions();
-		}
+    /// <summary>
+    /// Initialize the options for this appender
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initialize the level to syslog severity mappings set on this appender.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
+      m_levelMapping.ActivateOptions();
+    }
 
-		#endregion AppenderSkeleton Implementation
+    #endregion AppenderSkeleton Implementation
 
-		#region Protected Members
+    #region Protected Members
 
-		/// <summary>
-		/// Translates a log4net level to a syslog severity.
-		/// </summary>
-		/// <param name="level">A log4net level.</param>
-		/// <returns>A syslog severity.</returns>
-		/// <remarks>
-		/// <para>
-		/// Translates a log4net level to a syslog severity.
-		/// </para>
-		/// </remarks>
-		protected virtual SyslogSeverity GetSeverity(Level level)
-		{
-			LevelSeverity levelSeverity = m_levelMapping.Lookup(level) as LevelSeverity;
-			if (levelSeverity != null)
-			{
-				return levelSeverity.Severity;
-			}
+    /// <summary>
+    /// Translates a log4net level to a syslog severity.
+    /// </summary>
+    /// <param name="level">A log4net level.</param>
+    /// <returns>A syslog severity.</returns>
+    /// <remarks>
+    /// <para>
+    /// Translates a log4net level to a syslog severity.
+    /// </para>
+    /// </remarks>
+    protected virtual SyslogSeverity GetSeverity(Level level)
+    {
+      LevelSeverity levelSeverity = m_levelMapping.Lookup(level) as LevelSeverity;
+      if (levelSeverity != null)
+      {
+        return levelSeverity.Severity;
+      }
 
-			//
-			// Fallback to sensible default values
-			//
+      //
+      // Fallback to sensible default values
+      //
 
-			if (level >= Level.Alert)
-			{
-				return SyslogSeverity.Alert;
-			}
-			else if (level >= Level.Critical)
-			{
-				return SyslogSeverity.Critical;
-			}
-			else if (level >= Level.Error)
-			{
-				return SyslogSeverity.Error;
-			}
-			else if (level >= Level.Warn)
-			{
-				return SyslogSeverity.Warning;
-			}
-			else if (level >= Level.Notice)
-			{
-				return SyslogSeverity.Notice;
-			}
-			else if (level >= Level.Info)
-			{
-				return SyslogSeverity.Informational;
-			}
-			// Default setting
-			return SyslogSeverity.Debug;
-		}
+      if (level >= Level.Alert)
+      {
+        return SyslogSeverity.Alert;
+      }
+      else if (level >= Level.Critical)
+      {
+        return SyslogSeverity.Critical;
+      }
+      else if (level >= Level.Error)
+      {
+        return SyslogSeverity.Error;
+      }
+      else if (level >= Level.Warn)
+      {
+        return SyslogSeverity.Warning;
+      }
+      else if (level >= Level.Notice)
+      {
+        return SyslogSeverity.Notice;
+      }
+      else if (level >= Level.Info)
+      {
+        return SyslogSeverity.Informational;
+      }
+      // Default setting
+      return SyslogSeverity.Debug;
+    }
 
-		#endregion Protected Members
+    #endregion Protected Members
 
-		#region Public Static Members
+    #region Public Static Members
 
-		/// <summary>
-		/// Generate a syslog priority.
-		/// </summary>
-		/// <param name="facility">The syslog facility.</param>
-		/// <param name="severity">The syslog severity.</param>
-		/// <returns>A syslog priority.</returns>
-		/// <remarks>
-		/// <para>
-		/// Generate a syslog priority.
-		/// </para>
-		/// </remarks>
-		public static int GeneratePriority(SyslogFacility facility, SyslogSeverity severity)
-		{
-			if (facility < SyslogFacility.Kernel || facility > SyslogFacility.Local7)
-			{
-				throw new ArgumentException("SyslogFacility out of range", "facility");
-			}
+    /// <summary>
+    /// Generate a syslog priority.
+    /// </summary>
+    /// <param name="facility">The syslog facility.</param>
+    /// <param name="severity">The syslog severity.</param>
+    /// <returns>A syslog priority.</returns>
+    /// <remarks>
+    /// <para>
+    /// Generate a syslog priority.
+    /// </para>
+    /// </remarks>
+    public static int GeneratePriority(SyslogFacility facility, SyslogSeverity severity)
+    {
+      if (facility < SyslogFacility.Kernel || facility > SyslogFacility.Local7)
+      {
+        throw new ArgumentException("SyslogFacility out of range", "facility");
+      }
 
-			if (severity < SyslogSeverity.Emergency || severity > SyslogSeverity.Debug)
-			{
-				throw new ArgumentException("SyslogSeverity out of range", "severity");
-			}
+      if (severity < SyslogSeverity.Emergency || severity > SyslogSeverity.Debug)
+      {
+        throw new ArgumentException("SyslogSeverity out of range", "severity");
+      }
 
-			unchecked
-			{
-				return ((int)facility * 8) + (int)severity;
-			}
-		}
+      unchecked
+      {
+        return ((int)facility * 8) + (int)severity;
+      }
+    }
 
-		#endregion Public Static Members
+    #endregion Public Static Members
 
-		#region Private Instances Fields
+    #region Private Instances Fields
 
-		/// <summary>
-		/// The facility. The default facility is <see cref="SyslogFacility.User"/>.
-		/// </summary>
-		private SyslogFacility m_facility = SyslogFacility.User;
+    /// <summary>
+    /// The facility. The default facility is <see cref="SyslogFacility.User"/>.
+    /// </summary>
+    private SyslogFacility m_facility = SyslogFacility.User;
 
-		/// <summary>
-		/// The message identity
-		/// </summary>
-		private PatternLayout m_identity;
+    /// <summary>
+    /// The message identity
+    /// </summary>
+    private PatternLayout m_identity;
 
-		/// <summary>
-		/// Mapping from level object to syslog severity
-		/// </summary>
-		private LevelMapping m_levelMapping = new LevelMapping();
+    /// <summary>
+    /// Mapping from level object to syslog severity
+    /// </summary>
+    private LevelMapping m_levelMapping = new LevelMapping();
 
-		/// <summary>
-		/// Initial buffer size
-		/// </summary>
-		private const int c_renderBufferSize = 256;
+    /// <summary>
+    /// Initial buffer size
+    /// </summary>
+    private const int c_renderBufferSize = 256;
 
-		/// <summary>
-		/// Maximum buffer size before it is recycled
-		/// </summary>
-		private const int c_renderBufferMaxCapacity = 1024;
+    /// <summary>
+    /// Maximum buffer size before it is recycled
+    /// </summary>
+    private const int c_renderBufferMaxCapacity = 1024;
 
-		#endregion Private Instances Fields
+    #endregion Private Instances Fields
 
-		#region LevelSeverity LevelMapping Entry
-		/// <summary>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the syslog severity that is should be logged at.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// A class to act as a mapping between the level that a logging call is made at and
-		/// the syslog severity that is should be logged at.
-		/// </para>
-		/// </remarks>
-		public class LevelSeverity : LevelMappingEntry
-		{
-			private SyslogSeverity m_severity;
+    #region LevelSeverity LevelMapping Entry
+    /// <summary>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the syslog severity that is should be logged at.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// A class to act as a mapping between the level that a logging call is made at and
+    /// the syslog severity that is should be logged at.
+    /// </para>
+    /// </remarks>
+    public class LevelSeverity : LevelMappingEntry
+    {
+      private SyslogSeverity m_severity;
 
-			/// <summary>
-			/// The mapped syslog severity for the specified level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Required property.
-			/// The mapped syslog severity for the specified level
-			/// </para>
-			/// </remarks>
-			public SyslogSeverity Severity
-			{
-				get { return m_severity; }
-				set { m_severity = value; }
-			}
-		}
+      /// <summary>
+      /// The mapped syslog severity for the specified level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Required property.
+      /// The mapped syslog severity for the specified level
+      /// </para>
+      /// </remarks>
+      public SyslogSeverity Severity
+      {
+        get { return m_severity; }
+        set { m_severity = value; }
+      }
+    }
 
-		#endregion // LevelSeverity LevelMapping Entry
-	}
+    #endregion // LevelSeverity LevelMapping Entry
+  }
 }
diff --git a/src/log4net/Appender/RemotingAppender.cs b/src/log4net/Appender/RemotingAppender.cs
index 7c095f8..69a0b6b 100644
--- a/src/log4net/Appender/RemotingAppender.cs
+++ b/src/log4net/Appender/RemotingAppender.cs
@@ -32,308 +32,308 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Delivers logging events to a remote logging sink. 
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This Appender is designed to deliver events to a remote sink. 
-	/// That is any object that implements the <see cref="IRemoteLoggingSink"/>
-	/// interface. It delivers the events using .NET remoting. The
-	/// object to deliver events to is specified by setting the
-	/// appenders <see cref="RemotingAppender.Sink"/> property.</para>
-	/// <para>
-	/// The RemotingAppender buffers events before sending them. This allows it to 
-	/// make more efficient use of the remoting infrastructure.</para>
-	/// <para>
-	/// Once the buffer is full the events are still not sent immediately. 
-	/// They are scheduled to be sent using a pool thread. The effect is that 
-	/// the send occurs asynchronously. This is very important for a 
-	/// number of non obvious reasons. The remoting infrastructure will 
-	/// flow thread local variables (stored in the <see cref="CallContext"/>),
-	/// if they are marked as <see cref="ILogicalThreadAffinative"/>, across the 
-	/// remoting boundary. If the server is not contactable then
-	/// the remoting infrastructure will clear the <see cref="ILogicalThreadAffinative"/>
-	/// objects from the <see cref="CallContext"/>. To prevent a logging failure from
-	/// having side effects on the calling application the remoting call must be made
-	/// from a separate thread to the one used by the application. A <see cref="ThreadPool"/>
-	/// thread is used for this. If no <see cref="ThreadPool"/> thread is available then
-	/// the events will block in the thread pool manager until a thread is available.</para>
-	/// <para>
-	/// Because the events are sent asynchronously using pool threads it is possible to close 
-	/// this appender before all the queued events have been sent.
-	/// When closing the appender attempts to wait until all the queued events have been sent, but 
-	/// this will timeout after 30 seconds regardless.</para>
-	/// <para>
-	/// If this appender is being closed because the <see cref="AppDomain.ProcessExit"/>
-	/// event has fired it may not be possible to send all the queued events. During process
-	/// exit the runtime limits the time that a <see cref="AppDomain.ProcessExit"/>
-	/// event handler is allowed to run for. If the runtime terminates the threads before
-	/// the queued events have been sent then they will be lost. To ensure that all events
-	/// are sent the appender must be closed before the application exits. See 
-	/// <see cref="log4net.Core.LoggerManager.Shutdown"/> for details on how to shutdown
-	/// log4net programmatically.</para>
-	/// </remarks>
-	/// <seealso cref="IRemoteLoggingSink" />
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Daniel Cazzulino</author>
-	public class RemotingAppender : BufferingAppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Delivers logging events to a remote logging sink. 
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This Appender is designed to deliver events to a remote sink. 
+  /// That is any object that implements the <see cref="IRemoteLoggingSink"/>
+  /// interface. It delivers the events using .NET remoting. The
+  /// object to deliver events to is specified by setting the
+  /// appenders <see cref="RemotingAppender.Sink"/> property.</para>
+  /// <para>
+  /// The RemotingAppender buffers events before sending them. This allows it to 
+  /// make more efficient use of the remoting infrastructure.</para>
+  /// <para>
+  /// Once the buffer is full the events are still not sent immediately. 
+  /// They are scheduled to be sent using a pool thread. The effect is that 
+  /// the send occurs asynchronously. This is very important for a 
+  /// number of non obvious reasons. The remoting infrastructure will 
+  /// flow thread local variables (stored in the <see cref="CallContext"/>),
+  /// if they are marked as <see cref="ILogicalThreadAffinative"/>, across the 
+  /// remoting boundary. If the server is not contactable then
+  /// the remoting infrastructure will clear the <see cref="ILogicalThreadAffinative"/>
+  /// objects from the <see cref="CallContext"/>. To prevent a logging failure from
+  /// having side effects on the calling application the remoting call must be made
+  /// from a separate thread to the one used by the application. A <see cref="ThreadPool"/>
+  /// thread is used for this. If no <see cref="ThreadPool"/> thread is available then
+  /// the events will block in the thread pool manager until a thread is available.</para>
+  /// <para>
+  /// Because the events are sent asynchronously using pool threads it is possible to close 
+  /// this appender before all the queued events have been sent.
+  /// When closing the appender attempts to wait until all the queued events have been sent, but 
+  /// this will timeout after 30 seconds regardless.</para>
+  /// <para>
+  /// If this appender is being closed because the <see cref="AppDomain.ProcessExit"/>
+  /// event has fired it may not be possible to send all the queued events. During process
+  /// exit the runtime limits the time that a <see cref="AppDomain.ProcessExit"/>
+  /// event handler is allowed to run for. If the runtime terminates the threads before
+  /// the queued events have been sent then they will be lost. To ensure that all events
+  /// are sent the appender must be closed before the application exits. See 
+  /// <see cref="log4net.Core.LoggerManager.Shutdown"/> for details on how to shutdown
+  /// log4net programmatically.</para>
+  /// </remarks>
+  /// <seealso cref="IRemoteLoggingSink" />
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Daniel Cazzulino</author>
+  public class RemotingAppender : BufferingAppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="RemotingAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public RemotingAppender()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="RemotingAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public RemotingAppender()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the URL of the well-known object that will accept 
-		/// the logging events.
-		/// </summary>
-		/// <value>
-		/// The well-known URL of the remote sink.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The URL of the remoting sink that will accept logging events.
-		/// The sink must implement the <see cref="IRemoteLoggingSink"/>
-		/// interface.
-		/// </para>
-		/// </remarks>
-		public string Sink
-		{
-			get { return m_sinkUrl; }
-			set { m_sinkUrl = value; }
-		}
+    /// <summary>
+    /// Gets or sets the URL of the well-known object that will accept 
+    /// the logging events.
+    /// </summary>
+    /// <value>
+    /// The well-known URL of the remote sink.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The URL of the remoting sink that will accept logging events.
+    /// The sink must implement the <see cref="IRemoteLoggingSink"/>
+    /// interface.
+    /// </para>
+    /// </remarks>
+    public string Sink
+    {
+      get { return m_sinkUrl; }
+      set { m_sinkUrl = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the appender based on the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Initialize the appender based on the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0
         [System.Security.SecuritySafeCritical]
 #endif
-        public override void ActivateOptions() 
-		{
-			base.ActivateOptions();
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-			IDictionary channelProperties = new Hashtable(); 
-			channelProperties["typeFilterLevel"] = "Full";
+      IDictionary channelProperties = new Hashtable();
+      channelProperties["typeFilterLevel"] = "Full";
 
-			m_sinkObj = (IRemoteLoggingSink)Activator.GetObject(typeof(IRemoteLoggingSink), m_sinkUrl, channelProperties);
-		}
+      m_sinkObj = (IRemoteLoggingSink)Activator.GetObject(typeof(IRemoteLoggingSink), m_sinkUrl, channelProperties);
+    }
 
-		#endregion
+    #endregion
 
-		#region Override implementation of BufferingAppenderSkeleton
+    #region Override implementation of BufferingAppenderSkeleton
 
-		/// <summary>
-		/// Send the contents of the buffer to the remote sink.
-		/// </summary>
-		/// <remarks>
-		/// The events are not sent immediately. They are scheduled to be sent
-		/// using a pool thread. The effect is that the send occurs asynchronously.
-		/// This is very important for a number of non obvious reasons. The remoting
-		/// infrastructure will flow thread local variables (stored in the <see cref="CallContext"/>),
-		/// if they are marked as <see cref="ILogicalThreadAffinative"/>, across the 
-		/// remoting boundary. If the server is not contactable then
-		/// the remoting infrastructure will clear the <see cref="ILogicalThreadAffinative"/>
-		/// objects from the <see cref="CallContext"/>. To prevent a logging failure from
-		/// having side effects on the calling application the remoting call must be made
-		/// from a separate thread to the one used by the application. A <see cref="ThreadPool"/>
-		/// thread is used for this. If no <see cref="ThreadPool"/> thread is available then
-		/// the events will block in the thread pool manager until a thread is available.
-		/// </remarks>
-		/// <param name="events">The events to send.</param>
-		protected override void SendBuffer(LoggingEvent[] events)
-		{
-			// Setup for an async send
-			BeginAsyncSend();
+    /// <summary>
+    /// Send the contents of the buffer to the remote sink.
+    /// </summary>
+    /// <remarks>
+    /// The events are not sent immediately. They are scheduled to be sent
+    /// using a pool thread. The effect is that the send occurs asynchronously.
+    /// This is very important for a number of non obvious reasons. The remoting
+    /// infrastructure will flow thread local variables (stored in the <see cref="CallContext"/>),
+    /// if they are marked as <see cref="ILogicalThreadAffinative"/>, across the 
+    /// remoting boundary. If the server is not contactable then
+    /// the remoting infrastructure will clear the <see cref="ILogicalThreadAffinative"/>
+    /// objects from the <see cref="CallContext"/>. To prevent a logging failure from
+    /// having side effects on the calling application the remoting call must be made
+    /// from a separate thread to the one used by the application. A <see cref="ThreadPool"/>
+    /// thread is used for this. If no <see cref="ThreadPool"/> thread is available then
+    /// the events will block in the thread pool manager until a thread is available.
+    /// </remarks>
+    /// <param name="events">The events to send.</param>
+    protected override void SendBuffer(LoggingEvent[] events)
+    {
+      // Setup for an async send
+      BeginAsyncSend();
 
-			// Send the events
-			if (!ThreadPool.QueueUserWorkItem(new WaitCallback(SendBufferCallback), events))
-			{
-				// Cancel the async send
-				EndAsyncSend();
+      // Send the events
+      if (!ThreadPool.QueueUserWorkItem(new WaitCallback(SendBufferCallback), events))
+      {
+        // Cancel the async send
+        EndAsyncSend();
 
-				ErrorHandler.Error("RemotingAppender ["+Name+"] failed to ThreadPool.QueueUserWorkItem logging events in SendBuffer.");
-			}
-		}
+        ErrorHandler.Error("RemotingAppender [" + Name + "] failed to ThreadPool.QueueUserWorkItem logging events in SendBuffer.");
+      }
+    }
 
-		/// <summary>
-		/// Override base class close.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method waits while there are queued work items. The events are
-		/// sent asynchronously using <see cref="ThreadPool"/> work items. These items
-		/// will be sent once a thread pool thread is available to send them, therefore
-		/// it is possible to close the appender before all the queued events have been
-		/// sent.</para>
-		/// <para>
-		/// This method attempts to wait until all the queued events have been sent, but this 
-		/// method will timeout after 30 seconds regardless.</para>
-		/// <para>
-		/// If the appender is being closed because the <see cref="AppDomain.ProcessExit"/>
-		/// event has fired it may not be possible to send all the queued events. During process
-		/// exit the runtime limits the time that a <see cref="AppDomain.ProcessExit"/>
-		/// event handler is allowed to run for.</para>
-		/// </remarks>
-		protected override void OnClose()
-		{
-			base.OnClose();
+    /// <summary>
+    /// Override base class close.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method waits while there are queued work items. The events are
+    /// sent asynchronously using <see cref="ThreadPool"/> work items. These items
+    /// will be sent once a thread pool thread is available to send them, therefore
+    /// it is possible to close the appender before all the queued events have been
+    /// sent.</para>
+    /// <para>
+    /// This method attempts to wait until all the queued events have been sent, but this 
+    /// method will timeout after 30 seconds regardless.</para>
+    /// <para>
+    /// If the appender is being closed because the <see cref="AppDomain.ProcessExit"/>
+    /// event has fired it may not be possible to send all the queued events. During process
+    /// exit the runtime limits the time that a <see cref="AppDomain.ProcessExit"/>
+    /// event handler is allowed to run for.</para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      base.OnClose();
 
-			// Wait for the work queue to become empty before closing, timeout 30 seconds
-			if (!m_workQueueEmptyEvent.WaitOne(30 * 1000, false))
-			{
-				ErrorHandler.Error("RemotingAppender ["+Name+"] failed to send all queued events before close, in OnClose.");
-			}
-		}
+      // Wait for the work queue to become empty before closing, timeout 30 seconds
+      if (!m_workQueueEmptyEvent.WaitOne(30 * 1000, false))
+      {
+        ErrorHandler.Error("RemotingAppender [" + Name + "] failed to send all queued events before close, in OnClose.");
+      }
+    }
 
-		/// <summary>
-		/// Flushes any buffered log data.
-		/// </summary>
-		/// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
-		/// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-		public override bool Flush(int millisecondsTimeout)
-		{
-			base.Flush();
-			return m_workQueueEmptyEvent.WaitOne(millisecondsTimeout, false);
-		}
+    /// <summary>
+    /// Flushes any buffered log data.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public override bool Flush(int millisecondsTimeout)
+    {
+      base.Flush();
+      return m_workQueueEmptyEvent.WaitOne(millisecondsTimeout, false);
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// A work item is being queued into the thread pool
-		/// </summary>
-		private void BeginAsyncSend()
-		{
-			// The work queue is not empty
-			m_workQueueEmptyEvent.Reset();
+    /// <summary>
+    /// A work item is being queued into the thread pool
+    /// </summary>
+    private void BeginAsyncSend()
+    {
+      // The work queue is not empty
+      m_workQueueEmptyEvent.Reset();
 
-			// Increment the queued count
-			Interlocked.Increment(ref m_queuedCallbackCount);
-		}
+      // Increment the queued count
+      Interlocked.Increment(ref m_queuedCallbackCount);
+    }
 
-		/// <summary>
-		/// A work item from the thread pool has completed
-		/// </summary>
-		private void EndAsyncSend()
-		{
-			// Decrement the queued count
-			if (Interlocked.Decrement(ref m_queuedCallbackCount) <= 0)
-			{
-				// If the work queue is empty then set the event
-				m_workQueueEmptyEvent.Set();
-			}
-		}
+    /// <summary>
+    /// A work item from the thread pool has completed
+    /// </summary>
+    private void EndAsyncSend()
+    {
+      // Decrement the queued count
+      if (Interlocked.Decrement(ref m_queuedCallbackCount) <= 0)
+      {
+        // If the work queue is empty then set the event
+        m_workQueueEmptyEvent.Set();
+      }
+    }
 
-		/// <summary>
-		/// Send the contents of the buffer to the remote sink.
-		/// </summary>
-		/// <remarks>
-		/// This method is designed to be used with the <see cref="ThreadPool"/>.
-		/// This method expects to be passed an array of <see cref="LoggingEvent"/>
-		/// objects in the state param.
-		/// </remarks>
-		/// <param name="state">the logging events to send</param>
-		private void SendBufferCallback(object state)
-		{
-			try
-			{
-				LoggingEvent[] events = (LoggingEvent[])state;
+    /// <summary>
+    /// Send the contents of the buffer to the remote sink.
+    /// </summary>
+    /// <remarks>
+    /// This method is designed to be used with the <see cref="ThreadPool"/>.
+    /// This method expects to be passed an array of <see cref="LoggingEvent"/>
+    /// objects in the state param.
+    /// </remarks>
+    /// <param name="state">the logging events to send</param>
+    private void SendBufferCallback(object state)
+    {
+      try
+      {
+        LoggingEvent[] events = (LoggingEvent[])state;
 
-				// Send the events
-				m_sinkObj.LogEvents(events);
-			}
-			catch(Exception ex)
-			{
-				ErrorHandler.Error("Failed in SendBufferCallback", ex);
-			}
-			finally
-			{
-				EndAsyncSend();
-			}
-		}
+        // Send the events
+        m_sinkObj.LogEvents(events);
+      }
+      catch (Exception ex)
+      {
+        ErrorHandler.Error("Failed in SendBufferCallback", ex);
+      }
+      finally
+      {
+        EndAsyncSend();
+      }
+    }
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The URL of the remote sink.
-		/// </summary>
-		private string m_sinkUrl;
+    /// <summary>
+    /// The URL of the remote sink.
+    /// </summary>
+    private string m_sinkUrl;
 
-		/// <summary>
-		/// The local proxy (.NET remoting) for the remote logging sink.
-		/// </summary>
-		private IRemoteLoggingSink m_sinkObj;
+    /// <summary>
+    /// The local proxy (.NET remoting) for the remote logging sink.
+    /// </summary>
+    private IRemoteLoggingSink m_sinkObj;
 
-		/// <summary>
-		/// The number of queued callbacks currently waiting or executing
-		/// </summary>
-		private int m_queuedCallbackCount = 0;
+    /// <summary>
+    /// The number of queued callbacks currently waiting or executing
+    /// </summary>
+    private int m_queuedCallbackCount = 0;
 
-		/// <summary>
-		/// Event used to signal when there are no queued work items
-		/// </summary>
-		/// <remarks>
-		/// This event is set when there are no queued work items. In this
-		/// state it is safe to close the appender.
-		/// </remarks>
-		private ManualResetEvent m_workQueueEmptyEvent = new ManualResetEvent(true);
+    /// <summary>
+    /// Event used to signal when there are no queued work items
+    /// </summary>
+    /// <remarks>
+    /// This event is set when there are no queued work items. In this
+    /// state it is safe to close the appender.
+    /// </remarks>
+    private ManualResetEvent m_workQueueEmptyEvent = new ManualResetEvent(true);
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		/// <summary>
-		/// Interface used to deliver <see cref="LoggingEvent"/> objects to a remote sink.
-		/// </summary>
-		/// <remarks>
-		/// This interface must be implemented by a remoting sink
-		/// if the <see cref="RemotingAppender"/> is to be used
-		/// to deliver logging events to the sink.
-		/// </remarks>
-		public interface IRemoteLoggingSink
-		{
-			/// <summary>
-			/// Delivers logging events to the remote sink
-			/// </summary>
-			/// <param name="events">Array of events to log.</param>
-			/// <remarks>
-			/// <para>
-			/// Delivers logging events to the remote sink
-			/// </para>
-			/// </remarks>
-			void LogEvents(LoggingEvent[] events);
-		}
-	}
+    /// <summary>
+    /// Interface used to deliver <see cref="LoggingEvent"/> objects to a remote sink.
+    /// </summary>
+    /// <remarks>
+    /// This interface must be implemented by a remoting sink
+    /// if the <see cref="RemotingAppender"/> is to be used
+    /// to deliver logging events to the sink.
+    /// </remarks>
+    public interface IRemoteLoggingSink
+    {
+      /// <summary>
+      /// Delivers logging events to the remote sink
+      /// </summary>
+      /// <param name="events">Array of events to log.</param>
+      /// <remarks>
+      /// <para>
+      /// Delivers logging events to the remote sink
+      /// </para>
+      /// </remarks>
+      void LogEvents(LoggingEvent[] events);
+    }
+  }
 }
 
 #endif // NET_2_0
\ No newline at end of file
diff --git a/src/log4net/Appender/RollingFileAppender.cs b/src/log4net/Appender/RollingFileAppender.cs
index d6aef10..aaf0b33 100644
--- a/src/log4net/Appender/RollingFileAppender.cs
+++ b/src/log4net/Appender/RollingFileAppender.cs
@@ -29,1765 +29,1766 @@
 namespace log4net.Appender
 {
 #if CONFIRM_WIN32_FILE_SHAREMODES
-	// The following sounds good, and I though it was the case, but after
-	// further testing on Windows I have not been able to confirm it.
+  // The following sounds good, and I though it was the case, but after
+  // further testing on Windows I have not been able to confirm it.
 
-	/// On the Windows platform if another process has a write lock on the file 
-	/// that is to be deleted, but allows shared read access to the file then the
-	/// file can be moved, but cannot be deleted. If the other process also allows 
-	/// shared delete access to the file then the file will be deleted once that 
-	/// process closes the file. If it is necessary to open the log file or any
-	/// of the backup files outside of this appender for either read or 
-	/// write access please ensure that read and delete share modes are enabled.
+  /// On the Windows platform if another process has a write lock on the file 
+  /// that is to be deleted, but allows shared read access to the file then the
+  /// file can be moved, but cannot be deleted. If the other process also allows 
+  /// shared delete access to the file then the file will be deleted once that 
+  /// process closes the file. If it is necessary to open the log file or any
+  /// of the backup files outside of this appender for either read or 
+  /// write access please ensure that read and delete share modes are enabled.
 #endif
 
-	/// <summary>
-	/// Appender that rolls log files based on size or date or both.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// RollingFileAppender can roll log files based on size or date or both
-	/// depending on the setting of the <see cref="RollingStyle"/> property.
-	/// When set to <see cref="RollingMode.Size"/> the log file will be rolled
-	/// once its size exceeds the <see cref="MaximumFileSize"/>.
-	/// When set to <see cref="RollingMode.Date"/> the log file will be rolled
-	/// once the date boundary specified in the <see cref="DatePattern"/> property
-	/// is crossed.
-	/// When set to <see cref="RollingMode.Composite"/> the log file will be
-	/// rolled once the date boundary specified in the <see cref="DatePattern"/> property
-	/// is crossed, but within a date boundary the file will also be rolled
-	/// once its size exceeds the <see cref="MaximumFileSize"/>.
-	/// When set to <see cref="RollingMode.Once"/> the log file will be rolled when
-	/// the appender is configured. This effectively means that the log file can be
-	/// rolled once per program execution.
-	/// </para>
-	/// <para>
-	/// A of few additional optional features have been added:
-	/// <list type="bullet">
-	/// <item>Attach date pattern for current log file <see cref="StaticLogFileName"/></item>
-	/// <item>Backup number increments for newer files <see cref="CountDirection"/></item>
-	/// <item>Infinite number of backups by file size <see cref="MaxSizeRollBackups"/></item>
-	/// </list>
-	/// </para>
-	/// 
-	/// <note>
-	/// <para>
-	/// For large or infinite numbers of backup files a <see cref="CountDirection"/> 
-	/// greater than zero is highly recommended, otherwise all the backup files need
-	/// to be renamed each time a new backup is created.
-	/// </para>
-	/// <para>
-	/// When Date/Time based rolling is used setting <see cref="StaticLogFileName"/> 
-	/// to <see langword="true"/> will reduce the number of file renamings to few or none.
-	/// </para>
-	/// </note>
-	/// 
-	/// <note type="caution">
-	/// <para>
-	/// Changing <see cref="StaticLogFileName"/> or <see cref="CountDirection"/> without clearing
-	/// the log file directory of backup files will cause unexpected and unwanted side effects.  
-	/// </para>
-	/// </note>
-	/// 
-	/// <para>
-	/// If Date/Time based rolling is enabled this appender will attempt to roll existing files
-	/// in the directory without a Date/Time tag based on the last write date of the base log file.
-	/// The appender only rolls the log file when a message is logged. If Date/Time based rolling 
-	/// is enabled then the appender will not roll the log file at the Date/Time boundary but
-	/// at the point when the next message is logged after the boundary has been crossed.
-	/// </para>
-	/// 
-	/// <para>
-	/// The <see cref="RollingFileAppender"/> extends the <see cref="FileAppender"/> and
-	/// has the same behavior when opening the log file.
-	/// The appender will first try to open the file for writing when <see cref="ActivateOptions"/>
-	/// is called. This will typically be during configuration.
-	/// If the file cannot be opened for writing the appender will attempt
-	/// to open the file again each time a message is logged to the appender.
-	/// If the file cannot be opened for writing when a message is logged then
-	/// the message will be discarded by this appender.
-	/// </para>
-	/// <para>
-	/// When rolling a backup file necessitates deleting an older backup file the
-	/// file to be deleted is moved to a temporary name before being deleted.
-	/// </para>
-	/// 
-	/// <note type="caution">
-	/// <para>
-	/// A maximum number of backup files when rolling on date/time boundaries is not supported.
-	/// </para>
-	/// </note>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Aspi Havewala</author>
-	/// <author>Douglas de la Torre</author>
-	/// <author>Edward Smit</author>
-	public class RollingFileAppender : FileAppender
+  /// <summary>
+  /// Appender that rolls log files based on size or date or both.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// RollingFileAppender can roll log files based on size or date or both
+  /// depending on the setting of the <see cref="RollingStyle"/> property.
+  /// When set to <see cref="RollingMode.Size"/> the log file will be rolled
+  /// once its size exceeds the <see cref="MaximumFileSize"/>.
+  /// When set to <see cref="RollingMode.Date"/> the log file will be rolled
+  /// once the date boundary specified in the <see cref="DatePattern"/> property
+  /// is crossed.
+  /// When set to <see cref="RollingMode.Composite"/> the log file will be
+  /// rolled once the date boundary specified in the <see cref="DatePattern"/> property
+  /// is crossed, but within a date boundary the file will also be rolled
+  /// once its size exceeds the <see cref="MaximumFileSize"/>.
+  /// When set to <see cref="RollingMode.Once"/> the log file will be rolled when
+  /// the appender is configured. This effectively means that the log file can be
+  /// rolled once per program execution.
+  /// </para>
+  /// <para>
+  /// A of few additional optional features have been added:
+  /// <list type="bullet">
+  /// <item>Attach date pattern for current log file <see cref="StaticLogFileName"/></item>
+  /// <item>Backup number increments for newer files <see cref="CountDirection"/></item>
+  /// <item>Infinite number of backups by file size <see cref="MaxSizeRollBackups"/></item>
+  /// </list>
+  /// </para>
+  /// 
+  /// <note>
+  /// <para>
+  /// For large or infinite numbers of backup files a <see cref="CountDirection"/> 
+  /// greater than zero is highly recommended, otherwise all the backup files need
+  /// to be renamed each time a new backup is created.
+  /// </para>
+  /// <para>
+  /// When Date/Time based rolling is used setting <see cref="StaticLogFileName"/> 
+  /// to <see langword="true"/> will reduce the number of file renamings to few or none.
+  /// </para>
+  /// </note>
+  /// 
+  /// <note type="caution">
+  /// <para>
+  /// Changing <see cref="StaticLogFileName"/> or <see cref="CountDirection"/> without clearing
+  /// the log file directory of backup files will cause unexpected and unwanted side effects.  
+  /// </para>
+  /// </note>
+  /// 
+  /// <para>
+  /// If Date/Time based rolling is enabled this appender will attempt to roll existing files
+  /// in the directory without a Date/Time tag based on the last write date of the base log file.
+  /// The appender only rolls the log file when a message is logged. If Date/Time based rolling 
+  /// is enabled then the appender will not roll the log file at the Date/Time boundary but
+  /// at the point when the next message is logged after the boundary has been crossed.
+  /// </para>
+  /// 
+  /// <para>
+  /// The <see cref="RollingFileAppender"/> extends the <see cref="FileAppender"/> and
+  /// has the same behavior when opening the log file.
+  /// The appender will first try to open the file for writing when <see cref="ActivateOptions"/>
+  /// is called. This will typically be during configuration.
+  /// If the file cannot be opened for writing the appender will attempt
+  /// to open the file again each time a message is logged to the appender.
+  /// If the file cannot be opened for writing when a message is logged then
+  /// the message will be discarded by this appender.
+  /// </para>
+  /// <para>
+  /// When rolling a backup file necessitates deleting an older backup file the
+  /// file to be deleted is moved to a temporary name before being deleted.
+  /// </para>
+  /// 
+  /// <note type="caution">
+  /// <para>
+  /// A maximum number of backup files when rolling on date/time boundaries is not supported.
+  /// </para>
+  /// </note>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Aspi Havewala</author>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Edward Smit</author>
+  public class RollingFileAppender : FileAppender
+  {
+    #region Public Enums
+
+    /// <summary>
+    /// Style of rolling to use
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Style of rolling to use
+    /// </para>
+    /// </remarks>
+    public enum RollingMode
     {
-        #region Public Enums
+      /// <summary>
+      /// Roll files once per program execution
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Roll files once per program execution.
+      /// Well really once each time this appender is
+      /// configured.
+      /// </para>
+      /// <para>
+      /// Setting this option also sets <c>AppendToFile</c> to
+      /// <c>false</c> on the <c>RollingFileAppender</c>, otherwise
+      /// this appender would just be a normal file appender.
+      /// </para>
+      /// </remarks>
+      Once = 0,
 
-        /// <summary>
-		/// Style of rolling to use
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Style of rolling to use
-		/// </para>
-		/// </remarks>
-		public enum RollingMode
-		{
-			/// <summary>
-			/// Roll files once per program execution
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Roll files once per program execution.
-			/// Well really once each time this appender is
-			/// configured.
-			/// </para>
-			/// <para>
-			/// Setting this option also sets <c>AppendToFile</c> to
-			/// <c>false</c> on the <c>RollingFileAppender</c>, otherwise
-			/// this appender would just be a normal file appender.
-			/// </para>
-			/// </remarks>
-			Once		= 0,
+      /// <summary>
+      /// Roll files based only on the size of the file
+      /// </summary>
+      Size = 1,
 
-			/// <summary>
-			/// Roll files based only on the size of the file
-			/// </summary>
-			Size		= 1,
+      /// <summary>
+      /// Roll files based only on the date
+      /// </summary>
+      Date = 2,
 
-			/// <summary>
-			/// Roll files based only on the date
-			/// </summary>
-			Date		= 2,
+      /// <summary>
+      /// Roll files based on both the size and date of the file
+      /// </summary>
+      Composite = 3
+    }
 
-			/// <summary>
-			/// Roll files based on both the size and date of the file
-			/// </summary>
-			Composite	= 3
-		}
+    #endregion
 
-		#endregion
+    #region Protected Enums
 
-		#region Protected Enums
+    /// <summary>
+    /// The code assumes that the following 'time' constants are in a increasing sequence.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The code assumes that the following 'time' constants are in a increasing sequence.
+    /// </para>
+    /// </remarks>
+    protected enum RollPoint
+    {
+      /// <summary>
+      /// Roll the log not based on the date
+      /// </summary>
+      InvalidRollPoint = -1,
 
-		/// <summary>
-		/// The code assumes that the following 'time' constants are in a increasing sequence.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The code assumes that the following 'time' constants are in a increasing sequence.
-		/// </para>
-		/// </remarks>
-		protected enum RollPoint
-		{
-			/// <summary>
-			/// Roll the log not based on the date
-			/// </summary>
-			InvalidRollPoint	=-1,
+      /// <summary>
+      /// Roll the log for each minute
+      /// </summary>
+      TopOfMinute = 0,
 
-			/// <summary>
-			/// Roll the log for each minute
-			/// </summary>
-			TopOfMinute			= 0,
+      /// <summary>
+      /// Roll the log for each hour
+      /// </summary>
+      TopOfHour = 1,
 
-			/// <summary>
-			/// Roll the log for each hour
-			/// </summary>
-			TopOfHour			= 1,
+      /// <summary>
+      /// Roll the log twice a day (midday and midnight)
+      /// </summary>
+      HalfDay = 2,
 
-			/// <summary>
-			/// Roll the log twice a day (midday and midnight)
-			/// </summary>
-			HalfDay				= 2,
+      /// <summary>
+      /// Roll the log each day (midnight)
+      /// </summary>
+      TopOfDay = 3,
 
-			/// <summary>
-			/// Roll the log each day (midnight)
-			/// </summary>
-			TopOfDay			= 3,
+      /// <summary>
+      /// Roll the log each week
+      /// </summary>
+      TopOfWeek = 4,
 
-			/// <summary>
-			/// Roll the log each week
-			/// </summary>
-			TopOfWeek			= 4,
+      /// <summary>
+      /// Roll the log each month
+      /// </summary>
+      TopOfMonth = 5
+    }
 
-			/// <summary>
-			/// Roll the log each month
-			/// </summary>
-			TopOfMonth			= 5
-		}
+    #endregion Protected Enums
 
-		#endregion Protected Enums
+    #region Public Instance Constructors
 
-		#region Public Instance Constructors
+    /// <summary>
+    /// Initializes a new instance of the <see cref="RollingFileAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public RollingFileAppender()
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="RollingFileAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public RollingFileAppender() 
-		{
-		}
-
-		/// <summary>
-		/// Cleans up all resources used by this appender.
-		/// </summary>
-		~RollingFileAppender()
-		{
+    /// <summary>
+    /// Cleans up all resources used by this appender.
+    /// </summary>
+    ~RollingFileAppender()
+    {
 #if !NETCF
-			if (m_mutexForRolling != null)
-			{
+      if (m_mutexForRolling != null)
+      {
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-				m_mutexForRolling.Dispose();
+        m_mutexForRolling.Dispose();
 #else
-				m_mutexForRolling.Close();
+        m_mutexForRolling.Close();
 #endif
-				m_mutexForRolling = null;
-			}
+        m_mutexForRolling = null;
+      }
 #endif
-		}
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
 #if !NET_1_0 && !CLI_1_0 && !NETCF
-        /// <summary>
-		/// Gets or sets the strategy for determining the current date and time. The default
-		/// implementation is to use LocalDateTime which internally calls through to DateTime.Now. 
-		/// DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying
-		/// <see cref="RollingFileAppender.UniversalDateTime"/>.
-		/// </summary>
-		/// <value>
-		/// An implementation of the <see cref="RollingFileAppender.IDateTime"/> interface which returns the current date and time.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the <see cref="RollingFileAppender.IDateTime"/> used to return the current date and time.
-		/// </para>
-        /// <para>
-        /// There are two built strategies for determining the current date and time, 
-		/// <see cref="RollingFileAppender.LocalDateTime"/>
-        /// and <see cref="RollingFileAppender.UniversalDateTime"/>.
-        /// </para>
-        /// <para>
-		/// The default strategy is <see cref="RollingFileAppender.LocalDateTime"/>.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Gets or sets the strategy for determining the current date and time. The default
+    /// implementation is to use LocalDateTime which internally calls through to DateTime.Now. 
+    /// DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying
+    /// <see cref="RollingFileAppender.UniversalDateTime"/>.
+    /// </summary>
+    /// <value>
+    /// An implementation of the <see cref="RollingFileAppender.IDateTime"/> interface which returns the current date and time.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the <see cref="RollingFileAppender.IDateTime"/> used to return the current date and time.
+    /// </para>
+    /// <para>
+    /// There are two built strategies for determining the current date and time, 
+    /// <see cref="RollingFileAppender.LocalDateTime"/>
+    /// and <see cref="RollingFileAppender.UniversalDateTime"/>.
+    /// </para>
+    /// <para>
+    /// The default strategy is <see cref="RollingFileAppender.LocalDateTime"/>.
+    /// </para>
+    /// </remarks>
 #else
         /// <summary>
-		/// Gets or sets the strategy for determining the current date and time. The default
-		/// implementation is to use LocalDateTime which internally calls through to DateTime.Now. 
-		/// </summary>
-		/// <value>
-		/// An implementation of the <see cref="RollingFileAppender.IDateTime"/> interface which returns the current date and time.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the <see cref="RollingFileAppender.IDateTime"/> used to return the current date and time.
-		/// </para>
+    /// Gets or sets the strategy for determining the current date and time. The default
+    /// implementation is to use LocalDateTime which internally calls through to DateTime.Now. 
+    /// </summary>
+    /// <value>
+    /// An implementation of the <see cref="RollingFileAppender.IDateTime"/> interface which returns the current date and time.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the <see cref="RollingFileAppender.IDateTime"/> used to return the current date and time.
+    /// </para>
         /// <para>
-		/// The default strategy is <see cref="RollingFileAppender.LocalDateTime"/>.
-		/// </para>
-		/// </remarks>
+    /// The default strategy is <see cref="RollingFileAppender.LocalDateTime"/>.
+    /// </para>
+    /// </remarks>
 #endif
-        public IDateTime DateTimeStrategy
-		{
-			get { return m_dateTime; }
-			set { m_dateTime = value; }
-		}
+    public IDateTime DateTimeStrategy
+    {
+      get { return m_dateTime; }
+      set { m_dateTime = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the date pattern to be used for generating file names
-		/// when rolling over on date.
-		/// </summary>
-		/// <value>
-		/// The date pattern to be used for generating file names when rolling 
-		/// over on date.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Takes a string in the same format as expected by 
-		/// <see cref="log4net.DateFormatter.SimpleDateFormatter" />.
-		/// </para>
-		/// <para>
-		/// This property determines the rollover schedule when rolling over
-		/// on date.
-		/// </para>
-		/// </remarks>
-		public string DatePattern
-		{
-			get { return m_datePattern; }
-			set { m_datePattern = value; }
-		}
-  
-		/// <summary>
-		/// Gets or sets the maximum number of backup files that are kept before
-		/// the oldest is erased.
-		/// </summary>
-		/// <value>
-		/// The maximum number of backup files that are kept before the oldest is
-		/// erased.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// If set to zero, then there will be no backup files and the log file 
-		/// will be truncated when it reaches <see cref="MaxFileSize"/>.  
-		/// </para>
-		/// <para>
-		/// If a negative number is supplied then no deletions will be made.  Note 
-		/// that this could result in very slow performance as a large number of 
-		/// files are rolled over unless <see cref="CountDirection"/> is used.
-		/// </para>
-		/// <para>
-		/// The maximum applies to <b>each</b> time based group of files and 
-		/// <b>not</b> the total.
-		/// </para>
-		/// </remarks>
-		public int MaxSizeRollBackups
-		{
-			get { return m_maxSizeRollBackups; }
-			set { m_maxSizeRollBackups = value; }
-		}
-  
-		/// <summary>
-		/// Gets or sets the maximum size that the output file is allowed to reach
-		/// before being rolled over to backup files.
-		/// </summary>
-		/// <value>
-		/// The maximum size in bytes that the output file is allowed to reach before being 
-		/// rolled over to backup files.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This property is equivalent to <see cref="MaximumFileSize"/> except
-		/// that it is required for differentiating the setter taking a
-		/// <see cref="long"/> argument from the setter taking a <see cref="string"/> 
-		/// argument.
-		/// </para>
-		/// <para>
-		/// The default maximum file size is 10MB (10*1024*1024).
-		/// </para>
-		/// </remarks>
-		public long MaxFileSize
-		{
-			get { return m_maxFileSize; }
-			set { m_maxFileSize = value; }
-		}
-  
-		/// <summary>
-		/// Gets or sets the maximum size that the output file is allowed to reach
-		/// before being rolled over to backup files.
-		/// </summary>
-		/// <value>
-		/// The maximum size that the output file is allowed to reach before being 
-		/// rolled over to backup files.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This property allows you to specify the maximum size with the
-		/// suffixes "KB", "MB" or "GB" so that the size is interpreted being 
-		/// expressed respectively in kilobytes, megabytes or gigabytes. 
-		/// </para>
-		/// <para>
-		/// For example, the value "10KB" will be interpreted as 10240 bytes.
-		/// </para>
-		/// <para>
-		/// The default maximum file size is 10MB.
-		/// </para>
-		/// <para>
-		/// If you have the option to set the maximum file size programmatically
-		/// consider using the <see cref="MaxFileSize"/> property instead as this
-		/// allows you to set the size in bytes as a <see cref="Int64"/>.
-		/// </para>
-		/// </remarks>
-		public string MaximumFileSize
-		{
-			get { return m_maxFileSize.ToString(NumberFormatInfo.InvariantInfo); }
-			set { m_maxFileSize = OptionConverter.ToFileSize(value, m_maxFileSize + 1); }
-		}
+    /// <summary>
+    /// Gets or sets the date pattern to be used for generating file names
+    /// when rolling over on date.
+    /// </summary>
+    /// <value>
+    /// The date pattern to be used for generating file names when rolling 
+    /// over on date.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Takes a string in the same format as expected by 
+    /// <see cref="log4net.DateFormatter.SimpleDateFormatter" />.
+    /// </para>
+    /// <para>
+    /// This property determines the rollover schedule when rolling over
+    /// on date.
+    /// </para>
+    /// </remarks>
+    public string DatePattern
+    {
+      get { return m_datePattern; }
+      set { m_datePattern = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the rolling file count direction. 
-		/// </summary>
-		/// <value>
-		/// The rolling file count direction.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Indicates if the current file is the lowest numbered file or the
-		/// highest numbered file.
-		/// </para>
-		/// <para>
-		/// By default newer files have lower numbers (<see cref="CountDirection" /> &lt; 0),
-		/// i.e. log.1 is most recent, log.5 is the 5th backup, etc...
-		/// </para>
-		/// <para>
-		/// <see cref="CountDirection" /> &gt;= 0 does the opposite i.e.
-		/// log.1 is the first backup made, log.5 is the 5th backup made, etc.
-		/// For infinite backups use <see cref="CountDirection" /> &gt;= 0 to reduce 
-		/// rollover costs.
-		/// </para>
-		/// <para>The default file count direction is -1.</para>
-		/// </remarks>
-		public int CountDirection
-		{
-			get { return m_countDirection; }
-			set { m_countDirection = value; }
-		}
-  
-		/// <summary>
-		/// Gets or sets the rolling style.
-		/// </summary>
-		/// <value>The rolling style.</value>
-		/// <remarks>
-		/// <para>
-		/// The default rolling style is <see cref="RollingMode.Composite" />.
-		/// </para>
-		/// <para>
-		/// When set to <see cref="RollingMode.Once"/> this appender's
-		/// <see cref="FileAppender.AppendToFile"/> property is set to <c>false</c>, otherwise
-		/// the appender would append to a single file rather than rolling
-		/// the file each time it is opened.
-		/// </para>
-		/// </remarks>
-		public RollingMode RollingStyle
-		{
-			get { return m_rollingStyle; }
-			set
-			{
-				m_rollingStyle = value;
-				switch (m_rollingStyle) 
-				{
-					case RollingMode.Once:
-						m_rollDate = false;
-						m_rollSize = false;
+    /// <summary>
+    /// Gets or sets the maximum number of backup files that are kept before
+    /// the oldest is erased.
+    /// </summary>
+    /// <value>
+    /// The maximum number of backup files that are kept before the oldest is
+    /// erased.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If set to zero, then there will be no backup files and the log file 
+    /// will be truncated when it reaches <see cref="MaxFileSize"/>.  
+    /// </para>
+    /// <para>
+    /// If a negative number is supplied then no deletions will be made.  Note 
+    /// that this could result in very slow performance as a large number of 
+    /// files are rolled over unless <see cref="CountDirection"/> is used.
+    /// </para>
+    /// <para>
+    /// The maximum applies to <b>each</b> time based group of files and 
+    /// <b>not</b> the total.
+    /// </para>
+    /// </remarks>
+    public int MaxSizeRollBackups
+    {
+      get { return m_maxSizeRollBackups; }
+      set { m_maxSizeRollBackups = value; }
+    }
 
-						AppendToFile = false;
-						break;
+    /// <summary>
+    /// Gets or sets the maximum size that the output file is allowed to reach
+    /// before being rolled over to backup files.
+    /// </summary>
+    /// <value>
+    /// The maximum size in bytes that the output file is allowed to reach before being 
+    /// rolled over to backup files.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This property is equivalent to <see cref="MaximumFileSize"/> except
+    /// that it is required for differentiating the setter taking a
+    /// <see cref="long"/> argument from the setter taking a <see cref="string"/> 
+    /// argument.
+    /// </para>
+    /// <para>
+    /// The default maximum file size is 10MB (10*1024*1024).
+    /// </para>
+    /// </remarks>
+    public long MaxFileSize
+    {
+      get { return m_maxFileSize; }
+      set { m_maxFileSize = value; }
+    }
 
-					case RollingMode.Size:
-						m_rollDate = false;
-						m_rollSize = true;
-						break;
+    /// <summary>
+    /// Gets or sets the maximum size that the output file is allowed to reach
+    /// before being rolled over to backup files.
+    /// </summary>
+    /// <value>
+    /// The maximum size that the output file is allowed to reach before being 
+    /// rolled over to backup files.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This property allows you to specify the maximum size with the
+    /// suffixes "KB", "MB" or "GB" so that the size is interpreted being 
+    /// expressed respectively in kilobytes, megabytes or gigabytes. 
+    /// </para>
+    /// <para>
+    /// For example, the value "10KB" will be interpreted as 10240 bytes.
+    /// </para>
+    /// <para>
+    /// The default maximum file size is 10MB.
+    /// </para>
+    /// <para>
+    /// If you have the option to set the maximum file size programmatically
+    /// consider using the <see cref="MaxFileSize"/> property instead as this
+    /// allows you to set the size in bytes as a <see cref="Int64"/>.
+    /// </para>
+    /// </remarks>
+    public string MaximumFileSize
+    {
+      get { return m_maxFileSize.ToString(NumberFormatInfo.InvariantInfo); }
+      set { m_maxFileSize = OptionConverter.ToFileSize(value, m_maxFileSize + 1); }
+    }
 
-					case RollingMode.Date:
-						m_rollDate = true;
-						m_rollSize = false;
-						break;
+    /// <summary>
+    /// Gets or sets the rolling file count direction. 
+    /// </summary>
+    /// <value>
+    /// The rolling file count direction.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Indicates if the current file is the lowest numbered file or the
+    /// highest numbered file.
+    /// </para>
+    /// <para>
+    /// By default newer files have lower numbers (<see cref="CountDirection" /> &lt; 0),
+    /// i.e. log.1 is most recent, log.5 is the 5th backup, etc...
+    /// </para>
+    /// <para>
+    /// <see cref="CountDirection" /> &gt;= 0 does the opposite i.e.
+    /// log.1 is the first backup made, log.5 is the 5th backup made, etc.
+    /// For infinite backups use <see cref="CountDirection" /> &gt;= 0 to reduce 
+    /// rollover costs.
+    /// </para>
+    /// <para>The default file count direction is -1.</para>
+    /// </remarks>
+    public int CountDirection
+    {
+      get { return m_countDirection; }
+      set { m_countDirection = value; }
+    }
 
-					case RollingMode.Composite:
-						m_rollDate = true;
-						m_rollSize = true;
-						break;	  
-				}
-			}
-		}
-
-        /// <summary>
-        /// Gets or sets a value indicating whether to preserve the file name extension when rolling.
-        /// </summary>
-        /// <value>
-        /// <c>true</c> if the file name extension should be preserved.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup.
-        /// However, under Windows the new file name will loose any program associations as the
-        /// extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or
-        /// file.curSizeRollBackup.log to maintain any program associations.
-        /// </para>
-        /// </remarks>
-        public bool PreserveLogFileNameExtension
+    /// <summary>
+    /// Gets or sets the rolling style.
+    /// </summary>
+    /// <value>The rolling style.</value>
+    /// <remarks>
+    /// <para>
+    /// The default rolling style is <see cref="RollingMode.Composite" />.
+    /// </para>
+    /// <para>
+    /// When set to <see cref="RollingMode.Once"/> this appender's
+    /// <see cref="FileAppender.AppendToFile"/> property is set to <c>false</c>, otherwise
+    /// the appender would append to a single file rather than rolling
+    /// the file each time it is opened.
+    /// </para>
+    /// </remarks>
+    public RollingMode RollingStyle
+    {
+      get { return m_rollingStyle; }
+      set
+      {
+        m_rollingStyle = value;
+        switch (m_rollingStyle)
         {
-            get { return m_preserveLogFileNameExtension; }
-            set { m_preserveLogFileNameExtension = value; }
+          case RollingMode.Once:
+            m_rollDate = false;
+            m_rollSize = false;
+
+            AppendToFile = false;
+            break;
+
+          case RollingMode.Size:
+            m_rollDate = false;
+            m_rollSize = true;
+            break;
+
+          case RollingMode.Date:
+            m_rollDate = true;
+            m_rollSize = false;
+            break;
+
+          case RollingMode.Composite:
+            m_rollDate = true;
+            m_rollSize = true;
+            break;
+        }
+      }
+    }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether to preserve the file name extension when rolling.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if the file name extension should be preserved.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup.
+    /// However, under Windows the new file name will loose any program associations as the
+    /// extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or
+    /// file.curSizeRollBackup.log to maintain any program associations.
+    /// </para>
+    /// </remarks>
+    public bool PreserveLogFileNameExtension
+    {
+      get { return m_preserveLogFileNameExtension; }
+      set { m_preserveLogFileNameExtension = value; }
+    }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether to always log to
+    /// the same file.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if always should be logged to the same file, otherwise <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// By default file.log is always the current file.  Optionally
+    /// file.log.yyyy-mm-dd for current formatted datePattern can by the currently
+    /// logging file (or file.log.curSizeRollBackup or even
+    /// file.log.yyyy-mm-dd.curSizeRollBackup).
+    /// </para>
+    /// <para>
+    /// This will make time based rollovers with a large number of backups 
+    /// much faster as the appender it won't have to rename all the backups!
+    /// </para>
+    /// </remarks>
+    public bool StaticLogFileName
+    {
+      get { return m_staticLogFileName; }
+      set { m_staticLogFileName = value; }
+    }
+
+    #endregion Public Instance Properties
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the RollingFileAppender class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(RollingFileAppender);
+
+    #endregion Private Static Fields
+
+    #region Override implementation of FileAppender 
+
+    /// <summary>
+    /// Sets the quiet writer being used.
+    /// </summary>
+    /// <remarks>
+    /// This method can be overridden by sub classes.
+    /// </remarks>
+    /// <param name="writer">the writer to set</param>
+    protected override void SetQWForFiles(TextWriter writer)
+    {
+      QuietWriter = new CountingQuietTextWriter(writer, ErrorHandler);
+    }
+
+    /// <summary>
+    /// Write out a logging event.
+    /// </summary>
+    /// <param name="loggingEvent">the event to write to file.</param>
+    /// <remarks>
+    /// <para>
+    /// Handles append time behavior for RollingFileAppender.  This checks
+    /// if a roll over either by date (checked first) or time (checked second)
+    /// is need and then appends to the file last.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      AdjustFileBeforeAppend();
+      base.Append(loggingEvent);
+    }
+
+    /// <summary>
+    /// Write out an array of logging events.
+    /// </summary>
+    /// <param name="loggingEvents">the events to write to file.</param>
+    /// <remarks>
+    /// <para>
+    /// Handles append time behavior for RollingFileAppender.  This checks
+    /// if a roll over either by date (checked first) or time (checked second)
+    /// is need and then appends to the file last.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent[] loggingEvents)
+    {
+      AdjustFileBeforeAppend();
+      base.Append(loggingEvents);
+    }
+
+    /// <summary>
+    /// Performs any required rolling before outputting the next event
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Handles append time behavior for RollingFileAppender.  This checks
+    /// if a roll over either by date (checked first) or time (checked second)
+    /// is need and then appends to the file last.
+    /// </para>
+    /// </remarks>
+    protected virtual void AdjustFileBeforeAppend()
+    {
+      // reuse the file appenders locking model to lock the rolling
+#if !NETCF
+      try
+      {
+        // if rolling should be locked, acquire the lock
+        if (m_mutexForRolling != null)
+        {
+          m_mutexForRolling.WaitOne();
+        }
+#endif
+        if (m_rollDate)
+        {
+          var n = m_dateTime.Now;
+          if (n >= m_nextCheck)
+          {
+            m_now = n;
+            m_nextCheck = NextCheckDate(m_now, m_rollPoint);
+
+            RollOverTime(true);
+          }
         }
 
-		/// <summary>
-		/// Gets or sets a value indicating whether to always log to
-		/// the same file.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if always should be logged to the same file, otherwise <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// By default file.log is always the current file.  Optionally
-		/// file.log.yyyy-mm-dd for current formatted datePattern can by the currently
-		/// logging file (or file.log.curSizeRollBackup or even
-		/// file.log.yyyy-mm-dd.curSizeRollBackup).
-		/// </para>
-		/// <para>
-		/// This will make time based rollovers with a large number of backups 
-		/// much faster as the appender it won't have to rename all the backups!
-		/// </para>
-		/// </remarks>
-		public bool StaticLogFileName
-		{
-			get { return m_staticLogFileName; }
-			set { m_staticLogFileName = value; }
-		}
-
-		#endregion Public Instance Properties
-
-	    #region Private Static Fields
-
-	    /// <summary>
-	    /// The fully qualified type of the RollingFileAppender class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(RollingFileAppender);
-
-	    #endregion Private Static Fields
-
-		#region Override implementation of FileAppender 
-  
-		/// <summary>
-		/// Sets the quiet writer being used.
-		/// </summary>
-		/// <remarks>
-		/// This method can be overridden by sub classes.
-		/// </remarks>
-		/// <param name="writer">the writer to set</param>
-		protected override void SetQWForFiles(TextWriter writer) 
-		{
-			QuietWriter = new CountingQuietTextWriter(writer, ErrorHandler);
-		}
-
-		/// <summary>
-		/// Write out a logging event.
-		/// </summary>
-		/// <param name="loggingEvent">the event to write to file.</param>
-		/// <remarks>
-		/// <para>
-		/// Handles append time behavior for RollingFileAppender.  This checks
-		/// if a roll over either by date (checked first) or time (checked second)
-		/// is need and then appends to the file last.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			AdjustFileBeforeAppend();
-			base.Append(loggingEvent);
-		}
-  
- 		/// <summary>
-		/// Write out an array of logging events.
-		/// </summary>
-		/// <param name="loggingEvents">the events to write to file.</param>
-		/// <remarks>
-		/// <para>
-		/// Handles append time behavior for RollingFileAppender.  This checks
-		/// if a roll over either by date (checked first) or time (checked second)
-		/// is need and then appends to the file last.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent[] loggingEvents) 
-		{
-			AdjustFileBeforeAppend();
-			base.Append(loggingEvents);
-		}
-
-		/// <summary>
-		/// Performs any required rolling before outputting the next event
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Handles append time behavior for RollingFileAppender.  This checks
-		/// if a roll over either by date (checked first) or time (checked second)
-		/// is need and then appends to the file last.
-		/// </para>
-		/// </remarks>
-		protected virtual void AdjustFileBeforeAppend()
-		{
-			// reuse the file appenders locking model to lock the rolling
+        if (m_rollSize)
+        {
+          if ((File != null) && ((CountingQuietTextWriter)QuietWriter).Count >= m_maxFileSize)
+          {
+            RollOverSize();
+          }
+        }
 #if !NETCF
-			try
-			{
-				// if rolling should be locked, acquire the lock
-				if (m_mutexForRolling != null)
-				{
-					m_mutexForRolling.WaitOne();
-				}
+      }
+      finally
+      {
+        // if rolling should be locked, release the lock
+        if (m_mutexForRolling != null)
+        {
+          m_mutexForRolling.ReleaseMutex();
+        }
+      }
 #endif
-				if (m_rollDate)
-				{
-					var n = m_dateTime.Now;
-					if (n >= m_nextCheck)
-					{
-						m_now = n;
-						m_nextCheck = NextCheckDate(m_now, m_rollPoint);
+    }
 
-						RollOverTime(true);
-					}
-				}
+    /// <summary>
+    /// Creates and opens the file for logging.  If <see cref="StaticLogFileName"/>
+    /// is false then the fully qualified name is determined and used.
+    /// </summary>
+    /// <param name="fileName">the name of the file to open</param>
+    /// <param name="append">true to append to existing file</param>
+    /// <remarks>
+    /// <para>This method will ensure that the directory structure
+    /// for the <paramref name="fileName"/> specified exists.</para>
+    /// </remarks>
+    protected override void OpenFile(string fileName, bool append)
+    {
+      lock (this)
+      {
+        fileName = GetNextOutputFileName(fileName);
 
-				if (m_rollSize)
-				{
-					if ((File != null) && ((CountingQuietTextWriter)QuietWriter).Count >= m_maxFileSize)
-					{
-						RollOverSize();
-					}
-				}
-#if !NETCF
-			}
-			finally
-			{
-				// if rolling should be locked, release the lock
-				if (m_mutexForRolling != null)
-				{
-					m_mutexForRolling.ReleaseMutex();
-				}
-			}
-#endif
-		}
-
-		/// <summary>
-		/// Creates and opens the file for logging.  If <see cref="StaticLogFileName"/>
-		/// is false then the fully qualified name is determined and used.
-		/// </summary>
-		/// <param name="fileName">the name of the file to open</param>
-		/// <param name="append">true to append to existing file</param>
-		/// <remarks>
-		/// <para>This method will ensure that the directory structure
-		/// for the <paramref name="fileName"/> specified exists.</para>
-		/// </remarks>
-		protected override void OpenFile(string fileName, bool append)
-		{
-			lock(this)
-			{
-				fileName = GetNextOutputFileName(fileName);
-
-				// Calculate the current size of the file
-				long currentCount = 0;
-				if (append) 
-				{
-					using(SecurityContext.Impersonate(this))
-					{
-						if (System.IO.File.Exists(fileName))
-						{
-							currentCount = (new FileInfo(fileName)).Length;
-						}
-					}
-				}
-				else
-				{
-					if (LogLog.IsErrorEnabled)
-					{
-						// Internal check that the file is not being overwritten
-						// If not Appending to an existing file we should have rolled the file out of the
-						// way. Therefore we should not be over-writing an existing file.
-						// The only exception is if we are not allowed to roll the existing file away.
-						if (m_maxSizeRollBackups != 0 && FileExists(fileName))
-						{
-							LogLog.Error(declaringType, "RollingFileAppender: INTERNAL ERROR. Append is False but OutputFile ["+fileName+"] already exists.");
-						}
-					}
-				}
-
-				if (!m_staticLogFileName) 
-				{
-					m_scheduledFilename = fileName;
-				}
-
-				// Open the file (call the base class to do it)
-				base.OpenFile(fileName, append);
-
-				// Set the file size onto the counting writer
-				((CountingQuietTextWriter)QuietWriter).Count = currentCount;
-			}
-		}
-
-		/// <summary>
-		/// Get the current output file name
-		/// </summary>
-		/// <param name="fileName">the base file name</param>
-		/// <returns>the output file name</returns>
-		/// <remarks>
-		/// The output file name is based on the base fileName specified.
-		/// If <see cref="StaticLogFileName"/> is set then the output 
-		/// file name is the same as the base file passed in. Otherwise
-		/// the output file depends on the date pattern, on the count
-		/// direction or both.
-		/// </remarks>
-		protected string GetNextOutputFileName(string fileName)
-		{
-			if (!m_staticLogFileName) 
-			{
-				fileName = fileName.Trim();
-
-				if (m_rollDate)
-				{
-                    fileName = CombinePath(fileName, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
-				}
-
-				if (m_countDirection >= 0) 
-				{
-                    fileName = CombinePath(fileName, "." + m_curSizeRollBackups);
-				}
-			}
-
-			return fileName;
-		}
-
-		#endregion
-
-		#region Initialize Options
-
-		/// <summary>
-		///	Determines curSizeRollBackups (only within the current roll point)
-		/// </summary>
-		private void DetermineCurSizeRollBackups()
-		{
-			m_curSizeRollBackups = 0;
-	
-			string fullPath = null;
-			string fileName = null;
-
-			using(SecurityContext.Impersonate(this))
-			{
-				fullPath = Path.GetFullPath(m_baseFileName);
-				fileName = Path.GetFileName(fullPath);
-			}
-
-			var arrayFiles = GetExistingFiles(fullPath);
-			InitializeRollBackups(fileName, arrayFiles);
-
-			LogLog.Debug(declaringType, "curSizeRollBackups starts at ["+m_curSizeRollBackups+"]");
-		}
-
-		/// <summary>
-		/// Generates a wildcard pattern that can be used to find all files
-		/// that are similar to the base file name.
-		/// </summary>
-		/// <param name="baseFileName"></param>
-		/// <returns></returns>
-		private string GetWildcardPatternForFile(string baseFileName)
-		{
-            if (m_preserveLogFileNameExtension)
+        // Calculate the current size of the file
+        long currentCount = 0;
+        if (append)
+        {
+          using (SecurityContext.Impersonate(this))
+          {
+            if (System.IO.File.Exists(fileName))
             {
-                return Path.GetFileNameWithoutExtension(baseFileName) + "*" + Path.GetExtension(baseFileName);
+              currentCount = (new FileInfo(fileName)).Length;
+            }
+          }
+        }
+        else
+        {
+          if (LogLog.IsErrorEnabled)
+          {
+            // Internal check that the file is not being overwritten
+            // If not Appending to an existing file we should have rolled the file out of the
+            // way. Therefore we should not be over-writing an existing file.
+            // The only exception is if we are not allowed to roll the existing file away.
+            if (m_maxSizeRollBackups != 0 && FileExists(fileName))
+            {
+              LogLog.Error(declaringType, "RollingFileAppender: INTERNAL ERROR. Append is False but OutputFile [" + fileName + "] already exists.");
+            }
+          }
+        }
+
+        if (!m_staticLogFileName)
+        {
+          m_scheduledFilename = fileName;
+        }
+
+        // Open the file (call the base class to do it)
+        base.OpenFile(fileName, append);
+
+        // Set the file size onto the counting writer
+        ((CountingQuietTextWriter)QuietWriter).Count = currentCount;
+      }
+    }
+
+    /// <summary>
+    /// Get the current output file name
+    /// </summary>
+    /// <param name="fileName">the base file name</param>
+    /// <returns>the output file name</returns>
+    /// <remarks>
+    /// The output file name is based on the base fileName specified.
+    /// If <see cref="StaticLogFileName"/> is set then the output 
+    /// file name is the same as the base file passed in. Otherwise
+    /// the output file depends on the date pattern, on the count
+    /// direction or both.
+    /// </remarks>
+    protected string GetNextOutputFileName(string fileName)
+    {
+      if (!m_staticLogFileName)
+      {
+        fileName = fileName.Trim();
+
+        if (m_rollDate)
+        {
+          fileName = CombinePath(fileName, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
+        }
+
+        if (m_countDirection >= 0)
+        {
+          fileName = CombinePath(fileName, "." + m_curSizeRollBackups);
+        }
+      }
+
+      return fileName;
+    }
+
+    #endregion
+
+    #region Initialize Options
+
+    /// <summary>
+    ///  Determines curSizeRollBackups (only within the current roll point)
+    /// </summary>
+    private void DetermineCurSizeRollBackups()
+    {
+      m_curSizeRollBackups = 0;
+
+      string fullPath = null;
+      string fileName = null;
+
+      using (SecurityContext.Impersonate(this))
+      {
+        fullPath = Path.GetFullPath(m_baseFileName);
+        fileName = Path.GetFileName(fullPath);
+      }
+
+      var arrayFiles = GetExistingFiles(fullPath);
+      InitializeRollBackups(fileName, arrayFiles);
+
+      LogLog.Debug(declaringType, "curSizeRollBackups starts at [" + m_curSizeRollBackups + "]");
+    }
+
+    /// <summary>
+    /// Generates a wildcard pattern that can be used to find all files
+    /// that are similar to the base file name.
+    /// </summary>
+    /// <param name="baseFileName"></param>
+    /// <returns></returns>
+    private string GetWildcardPatternForFile(string baseFileName)
+    {
+      if (m_preserveLogFileNameExtension)
+      {
+        return Path.GetFileNameWithoutExtension(baseFileName) + "*" + Path.GetExtension(baseFileName);
+      }
+      else
+      {
+        return baseFileName + '*';
+      }
+    }
+
+    /// <summary>
+    /// Builds a list of filenames for all files matching the base filename plus a file
+    /// pattern.
+    /// </summary>
+    /// <param name="baseFilePath"></param>
+    /// <returns></returns>
+    private ArrayList GetExistingFiles(string baseFilePath)
+    {
+      var alFiles = new ArrayList();
+
+      string directory = null;
+
+      using (SecurityContext.Impersonate(this))
+      {
+        var fullPath = Path.GetFullPath(baseFilePath);
+
+        directory = Path.GetDirectoryName(fullPath);
+        if (Directory.Exists(directory))
+        {
+          var baseFileName = Path.GetFileName(fullPath);
+
+          var files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName));
+
+          if (files != null)
+          {
+            for (var i = 0; i < files.Length; i++)
+            {
+              var curFileName = Path.GetFileName(files[i]);
+              if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFileName)))
+              {
+                alFiles.Add(curFileName);
+              }
+            }
+          }
+        }
+      }
+      LogLog.Debug(declaringType, "Searched for existing files in [" + directory + "]");
+      return alFiles;
+    }
+
+    /// <summary>
+    /// Initiates a roll over if needed for crossing a date boundary since the last run.
+    /// </summary>
+    private void RollOverIfDateBoundaryCrossing()
+    {
+      if (m_staticLogFileName && m_rollDate)
+      {
+        if (FileExists(m_baseFileName))
+        {
+          DateTime last;
+          using (SecurityContext.Impersonate(this))
+          {
+#if !NET_1_0 && !CLI_1_0 && !NETCF
+            if (DateTimeStrategy is UniversalDateTime)
+            {
+              last = System.IO.File.GetLastWriteTimeUtc(m_baseFileName);
             }
             else
             {
-                return baseFileName + '*';
+#endif
+              last = System.IO.File.GetLastWriteTime(m_baseFileName);
+#if !NET_1_0 && !CLI_1_0 && !NETCF
             }
-		}
-
-		/// <summary>
-		/// Builds a list of filenames for all files matching the base filename plus a file
-		/// pattern.
-		/// </summary>
-		/// <param name="baseFilePath"></param>
-		/// <returns></returns>
-		private ArrayList GetExistingFiles(string baseFilePath)
-		{
-			var alFiles = new ArrayList();
-
-			string directory = null;
-
-			using(SecurityContext.Impersonate(this))
-			{
-				var fullPath = Path.GetFullPath(baseFilePath);
-
-				directory = Path.GetDirectoryName(fullPath);
-				if (Directory.Exists(directory))
-				{
-					var baseFileName = Path.GetFileName(fullPath);
-
-					var files = Directory.GetFiles(directory, GetWildcardPatternForFile(baseFileName));
-	
-					if (files != null)
-					{
-						for (var i = 0; i < files.Length; i++) 
-						{
-							var curFileName = Path.GetFileName(files[i]);
-							if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFileName)))
-							{
-								alFiles.Add(curFileName);
-							}
-						}
-					}
-				}
-			}
-			LogLog.Debug(declaringType, "Searched for existing files in ["+directory+"]");
-			return alFiles;
-		}
-
-		/// <summary>
-		/// Initiates a roll over if needed for crossing a date boundary since the last run.
-		/// </summary>
-		private void RollOverIfDateBoundaryCrossing()
-		{
-			if (m_staticLogFileName && m_rollDate) 
-			{
-				if (FileExists(m_baseFileName)) 
-				{
-					DateTime last;
-					using(SecurityContext.Impersonate(this)) {
-#if !NET_1_0 && !CLI_1_0 && !NETCF
-                        if (DateTimeStrategy is UniversalDateTime)
-						{
-							last = System.IO.File.GetLastWriteTimeUtc(m_baseFileName);
-						}
-						else
-						{
 #endif
-							last = System.IO.File.GetLastWriteTime(m_baseFileName);
-#if !NET_1_0 && !CLI_1_0 && !NETCF
-                        }
+          }
+          LogLog.Debug(declaringType, "[" + last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo) + "] vs. [" + m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo) + "]");
+
+          if (!(last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo))))
+          {
+            m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
+            LogLog.Debug(declaringType, "Initial roll over to [" + m_scheduledFilename + "]");
+            RollOverTime(false);
+            LogLog.Debug(declaringType, "curSizeRollBackups after rollOver at [" + m_curSizeRollBackups + "]");
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Initializes based on existing conditions at time of <see cref="ActivateOptions"/>.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes based on existing conditions at time of <see cref="ActivateOptions"/>.
+    /// The following is done
+    /// <list type="bullet">
+    ///  <item>determine curSizeRollBackups (only within the current roll point)</item>
+    ///  <item>initiates a roll over if needed for crossing a date boundary since the last run.</item>
+    ///  </list>
+    ///  </para>
+    /// </remarks>
+    protected void ExistingInit()
+    {
+      DetermineCurSizeRollBackups();
+      RollOverIfDateBoundaryCrossing();
+
+      // If file exists and we are not appending then roll it out of the way
+      if (AppendToFile != false)
+      {
+        return;
+      }
+
+      bool fileExists;
+      var fileName = GetNextOutputFileName(m_baseFileName);
+
+      using (SecurityContext.Impersonate(this))
+      {
+        fileExists = System.IO.File.Exists(fileName);
+      }
+
+      if (!fileExists)
+      {
+        return;
+      }
+
+      if (m_maxSizeRollBackups == 0)
+      {
+        LogLog.Debug(declaringType, "Output file [" + fileName + "] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file.");
+      }
+      else
+      {
+        LogLog.Debug(declaringType, "Output file [" + fileName + "] already exists. Not appending to file. Rolling existing file out of the way.");
+
+        RollOverRenameFiles(fileName);
+      }
+    }
+
+    /// <summary>
+    /// Does the work of bumping the 'current' file counter higher
+    /// to the highest count when an incremental file name is seen.
+    /// The highest count is either the first file (when count direction
+    /// is greater than 0) or the last file (when count direction less than 0).
+    /// In either case, we want to know the highest count that is present.
+    /// </summary>
+    /// <param name="baseFile"></param>
+    /// <param name="curFileName"></param>
+    private void InitializeFromOneFile(string baseFile, string curFileName)
+    {
+      curFileName = curFileName.ToLower();
+      baseFile = baseFile.ToLower();
+      if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFile)) == false)
+      {
+        // This is not a log file, so ignore
+        return;
+      }
+      if (curFileName.Equals(baseFile))
+      {
+        // Base log file is not an incremented logfile (.1 or .2, etc)
+        return;
+      }
+
+      // Only look for files in the current roll point
+      if (m_rollDate && !m_staticLogFileName)
+      {
+        var date = m_dateTime.Now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).ToLower();
+        var prefix = (m_preserveLogFileNameExtension
+          ? Path.GetFileNameWithoutExtension(baseFile) + date
+          : baseFile + date).ToLower();
+        var suffix = m_preserveLogFileNameExtension
+          ? Path.GetExtension(baseFile).ToLower()
+          : "";
+        if (!curFileName.StartsWith(prefix) || !curFileName.EndsWith(suffix))
+        {
+          LogLog.Debug(declaringType, "Ignoring file [" + curFileName + "] because it is from a different date period");
+          return;
+        }
+      }
+
+      try
+      {
+        // Bump the counter up to the highest count seen so far
+        var backup = GetBackUpIndex(curFileName);
+
+        // caution: we might get a false positive when certain
+        // date patterns such as yyyyMMdd are used...those are
+        // valid number but aren't the kind of back up index
+        // we're looking for
+        if (backup > m_curSizeRollBackups)
+        {
+          if (0 == m_maxSizeRollBackups)
+          {
+            // Stay at zero when zero backups are desired
+          }
+          else if (-1 == m_maxSizeRollBackups)
+          {
+            // Infinite backups, so go as high as the highest value
+            m_curSizeRollBackups = backup;
+          }
+          else
+          {
+            // Backups limited to a finite number
+            if (m_countDirection >= 0)
+            {
+              // Go with the highest file when counting up
+              m_curSizeRollBackups = backup;
+            }
+            else
+            {
+              // Clip to the limit when counting down
+              if (backup <= m_maxSizeRollBackups)
+              {
+                m_curSizeRollBackups = backup;
+              }
+            }
+          }
+          LogLog.Debug(declaringType, "File name [" + curFileName + "] moves current count to [" + m_curSizeRollBackups + "]");
+        }
+      }
+      catch (FormatException)
+      {
+        //this happens when file.log -> file.log.yyyy-MM-dd which is normal
+        //when staticLogFileName == false
+        LogLog.Debug(declaringType, "Encountered a backup file not ending in .x [" + curFileName + "]");
+      }
+    }
+
+    /// <summary>
+    /// Attempts to extract a number from the end of the file name that indicates
+    /// the number of the times the file has been rolled over.
+    /// </summary>
+    /// <remarks>
+    /// Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes.
+    /// </remarks>
+    /// <param name="curFileName"></param>
+    /// <returns></returns>
+    private int GetBackUpIndex(string curFileName)
+    {
+      var backUpIndex = -1;
+      var fileName = curFileName;
+
+      if (m_preserveLogFileNameExtension)
+      {
+        fileName = Path.GetFileNameWithoutExtension(fileName);
+      }
+
+      var index = fileName.LastIndexOf(".");
+      if (index > 0)
+      {
+        // if the "yyyy-MM-dd" component of file.log.yyyy-MM-dd is passed to TryParse
+        // it will gracefully fail and return backUpIndex will be 0
+        SystemInfo.TryParse(fileName.Substring(index + 1), out backUpIndex);
+      }
+
+      return backUpIndex;
+    }
+
+    /// <summary>
+    /// Takes a list of files and a base file name, and looks for 
+    /// 'incremented' versions of the base file.  Bumps the max
+    /// count up to the highest count seen.
+    /// </summary>
+    /// <param name="baseFile"></param>
+    /// <param name="arrayFiles"></param>
+    private void InitializeRollBackups(string baseFile, ArrayList arrayFiles)
+    {
+      if (null != arrayFiles)
+      {
+        var baseFileLower = baseFile.ToLowerInvariant();
+
+        foreach (string curFileName in arrayFiles)
+        {
+          InitializeFromOneFile(baseFileLower, curFileName.ToLowerInvariant());
+        }
+      }
+    }
+
+    /// <summary>
+    /// Calculates the RollPoint for the datePattern supplied.
+    /// </summary>
+    /// <param name="datePattern">the date pattern to calculate the check period for</param>
+    /// <returns>The RollPoint that is most accurate for the date pattern supplied</returns>
+    /// <remarks>
+    /// Essentially the date pattern is examined to determine what the
+    /// most suitable roll point is. The roll point chosen is the roll point
+    /// with the smallest period that can be detected using the date pattern
+    /// supplied. i.e. if the date pattern only outputs the year, month, day 
+    /// and hour then the smallest roll point that can be detected would be
+    /// and hourly roll point as minutes could not be detected.
+    /// </remarks>
+    private RollPoint ComputeCheckPeriod(string datePattern)
+    {
+      // s_date1970 is 1970-01-01 00:00:00 this is UniversalSortableDateTimePattern 
+      // (based on ISO 8601) using universal time. This date is used for reference
+      // purposes to calculate the resolution of the date pattern.
+
+      // Get string representation of base line date
+      var r0 = s_date1970.ToString(datePattern, DateTimeFormatInfo.InvariantInfo);
+
+      // Check each type of rolling mode starting with the smallest increment.
+      for (var i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++)
+      {
+        // Get string representation of next pattern
+        var r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, DateTimeFormatInfo.InvariantInfo);
+
+        LogLog.Debug(declaringType, "Type = [" + i + "], r0 = [" + r0 + "], r1 = [" + r1 + "]");
+
+        // Check if the string representations are different
+        if (r0 != null && r1 != null && !r0.Equals(r1))
+        {
+          // Found highest precision roll point
+          return (RollPoint)i;
+        }
+      }
+
+      return RollPoint.InvalidRollPoint; // Deliberately head for trouble...
+    }
+
+    /// <summary>
+    /// Initialize the appender based on the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// Sets initial conditions including date/time roll over information, first check,
+    /// scheduledFilename, and calls <see cref="ExistingInit"/> to initialize
+    /// the current number of backups.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      if (m_dateTime == null)
+      {
+        m_dateTime = new LocalDateTime();
+      }
+
+      if (m_rollDate && m_datePattern != null)
+      {
+        m_now = m_dateTime.Now;
+        m_rollPoint = ComputeCheckPeriod(m_datePattern);
+
+        if (m_rollPoint == RollPoint.InvalidRollPoint)
+        {
+          throw new ArgumentException("Invalid RollPoint, unable to parse [" + m_datePattern + "]");
+        }
+
+        // next line added as this removes the name check in rollOver
+        m_nextCheck = NextCheckDate(m_now, m_rollPoint);
+      }
+      else
+      {
+        if (m_rollDate)
+        {
+          ErrorHandler.Error("Either DatePattern or rollingStyle options are not set for [" + Name + "].");
+        }
+      }
+
+      if (SecurityContext == null)
+      {
+        SecurityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
+      }
+
+      using (SecurityContext.Impersonate(this))
+      {
+        // Must convert the FileAppender's m_filePath to an absolute path before we
+        // call ExistingInit(). This will be done by the base.ActivateOptions() but
+        // we need to duplicate that functionality here first.
+        base.File = ConvertToFullPath(base.File.Trim());
+
+        // Store fully qualified base file name
+        m_baseFileName = base.File;
+      }
+
+#if !NETCF
+      // initialize the mutex that is used to lock rolling
+      m_mutexForRolling = new Mutex(false, m_baseFileName
+        .Replace("\\", "_")
+        .Replace(":", "_")
+        .Replace("/", "_") + "_rolling"
+      );
 #endif
-                    }
-					LogLog.Debug(declaringType, "["+last.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo)+"] vs. ["+m_now.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo)+"]");
 
-					if (!(last.ToString(m_datePattern,DateTimeFormatInfo.InvariantInfo).Equals(m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo)))) 
-					{
-						m_scheduledFilename = CombinePath(m_baseFileName, last.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
-						LogLog.Debug(declaringType, "Initial roll over to ["+m_scheduledFilename+"]");
-						RollOverTime(false);
-						LogLog.Debug(declaringType, "curSizeRollBackups after rollOver at ["+m_curSizeRollBackups+"]");
-					}
-				}
-			}
-		}
+      if (m_rollDate && File != null && m_scheduledFilename == null)
+      {
+        m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
+      }
 
-		/// <summary>
-		/// Initializes based on existing conditions at time of <see cref="ActivateOptions"/>.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes based on existing conditions at time of <see cref="ActivateOptions"/>.
-		/// The following is done
-		/// <list type="bullet">
-		///	<item>determine curSizeRollBackups (only within the current roll point)</item>
-		///	<item>initiates a roll over if needed for crossing a date boundary since the last run.</item>
-		///	</list>
-		///	</para>
-		/// </remarks>
-		protected void ExistingInit() 
-		{
-			DetermineCurSizeRollBackups();
-			RollOverIfDateBoundaryCrossing();
+      ExistingInit();
 
-			// If file exists and we are not appending then roll it out of the way
-			if (AppendToFile != false)
-			{
-				return;
-			}
+      base.ActivateOptions();
+    }
 
-			bool fileExists;
-			var fileName = GetNextOutputFileName(m_baseFileName);
+    #endregion
 
-			using(SecurityContext.Impersonate(this))
-			{
-				fileExists = System.IO.File.Exists(fileName);
-			}
+    #region Roll File
 
-			if (!fileExists)
-			{
-				return;
-			}
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="path1"></param>
+    /// <param name="path2">.1, .2, .3, etc.</param>
+    /// <returns></returns>
+    private string CombinePath(string path1, string path2)
+    {
+      var extension = Path.GetExtension(path1);
+      if (m_preserveLogFileNameExtension && extension.Length > 0)
+      {
+        return Path.Combine(Path.GetDirectoryName(path1), Path.GetFileNameWithoutExtension(path1) + path2 + extension);
+      }
+      else
+      {
+        return path1 + path2;
+      }
+    }
 
-			if (m_maxSizeRollBackups == 0)
-			{
-				LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. MaxSizeRollBackups is 0; cannot roll. Overwriting existing file.");
-			}
-			else
-			{
-				LogLog.Debug(declaringType, "Output file ["+fileName+"] already exists. Not appending to file. Rolling existing file out of the way.");
+    /// <summary>
+    /// Rollover the file(s) to date/time tagged file(s).
+    /// </summary>
+    /// <param name="fileIsOpen">set to true if the file to be rolled is currently open</param>
+    /// <remarks>
+    /// <para>
+    /// Rollover the file(s) to date/time tagged file(s).
+    /// Resets curSizeRollBackups. 
+    /// If fileIsOpen is set then the new file is opened (through SafeOpenFile).
+    /// </para>
+    /// </remarks>
+    protected void RollOverTime(bool fileIsOpen)
+    {
+      if (m_staticLogFileName)
+      {
+        // Compute filename, but only if datePattern is specified
+        if (m_datePattern == null)
+        {
+          ErrorHandler.Error("Missing DatePattern option in rollOver().");
+          return;
+        }
 
-				RollOverRenameFiles(fileName);
-			}
-		}
+        //is the new file name equivalent to the 'current' one
+        //something has gone wrong if we hit this -- we should only
+        //roll over if the new file will be different from the old
+        var dateFormat = m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo);
+        if (m_scheduledFilename.Equals(CombinePath(File, dateFormat)))
+        {
+          ErrorHandler.Error("Compare " + m_scheduledFilename + " : " + CombinePath(File, dateFormat));
+          return;
+        }
 
-		/// <summary>
-		/// Does the work of bumping the 'current' file counter higher
-		/// to the highest count when an incremental file name is seen.
-		/// The highest count is either the first file (when count direction
-		/// is greater than 0) or the last file (when count direction less than 0).
-		/// In either case, we want to know the highest count that is present.
-		/// </summary>
-		/// <param name="baseFile"></param>
-		/// <param name="curFileName"></param>
-		private void InitializeFromOneFile(string baseFile, string curFileName)
-		{
-			curFileName = curFileName.ToLower();
-			baseFile = baseFile.ToLower();
-            if (curFileName.StartsWith(Path.GetFileNameWithoutExtension(baseFile)) == false)
-			{
-				// This is not a log file, so ignore
-				return;
-			}
-			if (curFileName.Equals(baseFile)) 
-			{
-				// Base log file is not an incremented logfile (.1 or .2, etc)
-				return;
-			}
-	
-			// Only look for files in the current roll point
-			if (m_rollDate && !m_staticLogFileName)
-			{
-				var date = m_dateTime.Now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo).ToLower();
-				var prefix = (m_preserveLogFileNameExtension 
-					? Path.GetFileNameWithoutExtension(baseFile) + date 
-					: baseFile + date).ToLower();
-				var suffix = m_preserveLogFileNameExtension 
-					? Path.GetExtension(baseFile).ToLower()
-					: "";
-				if (!curFileName.StartsWith(prefix) || !curFileName.EndsWith(suffix))
-				{
-					LogLog.Debug(declaringType, "Ignoring file ["+curFileName+"] because it is from a different date period");
-					return;
-				}
-			}
-            
-			try 
-			{
-				// Bump the counter up to the highest count seen so far
-                var backup = GetBackUpIndex(curFileName);
-                
-                // caution: we might get a false positive when certain
-                // date patterns such as yyyyMMdd are used...those are
-                // valid number but aren't the kind of back up index
-                // we're looking for
-                if (backup > m_curSizeRollBackups)
+        if (fileIsOpen)
+        {
+          // close current file, and rename it to datedFilename
+          CloseFile();
+        }
+
+        //we may have to roll over a large number of backups here
+        for (var i = 1; i <= m_curSizeRollBackups; i++)
+        {
+          var from = CombinePath(File, "." + i);
+          var to = CombinePath(m_scheduledFilename, "." + i);
+          RollFile(from, to);
+        }
+
+        RollFile(File, m_scheduledFilename);
+      }
+
+      //We've cleared out the old date and are ready for the new
+      m_curSizeRollBackups = 0;
+
+      //new scheduled name
+      m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
+
+      if (fileIsOpen)
+      {
+        // This will also close the file. This is OK since multiple close operations are safe.
+        SafeOpenFile(m_baseFileName, false);
+      }
+    }
+
+    /// <summary>
+    /// Renames file <paramref name="fromFile"/> to file <paramref name="toFile"/>.
+    /// </summary>
+    /// <param name="fromFile">Name of existing file to roll.</param>
+    /// <param name="toFile">New name for file.</param>
+    /// <remarks>
+    /// <para>
+    /// Renames file <paramref name="fromFile"/> to file <paramref name="toFile"/>. It
+    /// also checks for existence of target file and deletes if it does.
+    /// </para>
+    /// </remarks>
+    protected void RollFile(string fromFile, string toFile)
+    {
+      if (FileExists(fromFile))
+      {
+        // Delete the toFile if it exists
+        DeleteFile(toFile);
+
+        // We may not have permission to move the file, or the file may be locked
+        try
+        {
+          LogLog.Debug(declaringType, "Moving [" + fromFile + "] -> [" + toFile + "]");
+          using (SecurityContext.Impersonate(this))
+          {
+            System.IO.File.Move(fromFile, toFile);
+          }
+        }
+        catch (Exception moveEx)
+        {
+          ErrorHandler.Error("Exception while rolling file [" + fromFile + "] -> [" + toFile + "]", moveEx, ErrorCode.GenericFailure);
+        }
+      }
+      else
+      {
+        LogLog.Warn(declaringType, "Cannot RollFile [" + fromFile + "] -> [" + toFile + "]. Source does not exist");
+      }
+    }
+
+    /// <summary>
+    /// Test if a file exists at a specified path
+    /// </summary>
+    /// <param name="path">the path to the file</param>
+    /// <returns>true if the file exists</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if a file exists at a specified path
+    /// </para>
+    /// </remarks>
+    protected bool FileExists(string path)
+    {
+      using (SecurityContext.Impersonate(this))
+      {
+        return System.IO.File.Exists(path);
+      }
+    }
+
+    /// <summary>
+    /// Deletes the specified file if it exists.
+    /// </summary>
+    /// <param name="fileName">The file to delete.</param>
+    /// <remarks>
+    /// <para>
+    /// Delete a file if is exists.
+    /// The file is first moved to a new filename then deleted.
+    /// This allows the file to be removed even when it cannot
+    /// be deleted, but it still can be moved.
+    /// </para>
+    /// </remarks>
+    protected void DeleteFile(string fileName)
+    {
+      if (FileExists(fileName))
+      {
+        // We may not have permission to delete the file, or the file may be locked
+
+        var fileToDelete = fileName;
+
+        // Try to move the file to temp name.
+        // If the file is locked we may still be able to move it
+        var tempFileName = fileName + "." + Environment.TickCount + ".DeletePending";
+        try
+        {
+          using (SecurityContext.Impersonate(this))
+          {
+            System.IO.File.Move(fileName, tempFileName);
+          }
+          fileToDelete = tempFileName;
+        }
+        catch (Exception moveEx)
+        {
+          LogLog.Debug(declaringType, "Exception while moving file to be deleted [" + fileName + "] -> [" + tempFileName + "]", moveEx);
+        }
+
+        // Try to delete the file (either the original or the moved file)
+        try
+        {
+          using (SecurityContext.Impersonate(this))
+          {
+            System.IO.File.Delete(fileToDelete);
+          }
+          LogLog.Debug(declaringType, "Deleted file [" + fileName + "]");
+        }
+        catch (Exception deleteEx)
+        {
+          if (fileToDelete == fileName)
+          {
+            // Unable to move or delete the file
+            ErrorHandler.Error("Exception while deleting file [" + fileToDelete + "]", deleteEx, ErrorCode.GenericFailure);
+          }
+          else
+          {
+            // Moved the file, but the delete failed. File is probably locked.
+            // The file should automatically be deleted when the lock is released.
+            LogLog.Debug(declaringType, "Exception while deleting temp file [" + fileToDelete + "]", deleteEx);
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Implements file roll base on file size.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// If the maximum number of size based backups is reached
+    /// (<c>curSizeRollBackups == maxSizeRollBackups</c>) then the oldest
+    /// file is deleted -- its index determined by the sign of countDirection.
+    /// If <c>countDirection</c> &lt; 0, then files
+    /// {<c>File.1</c>, ..., <c>File.curSizeRollBackups -1</c>}
+    /// are renamed to {<c>File.2</c>, ...,
+    /// <c>File.curSizeRollBackups</c>}. Moreover, <c>File</c> is
+    /// renamed <c>File.1</c> and closed.
+    /// </para>
+    /// <para>
+    /// A new file is created to receive further log output.
+    /// </para>
+    /// <para>
+    /// If <c>maxSizeRollBackups</c> is equal to zero, then the
+    /// <c>File</c> is truncated with no backup files created.
+    /// </para>
+    /// <para>
+    /// If <c>maxSizeRollBackups</c> &lt; 0, then <c>File</c> is
+    /// renamed if needed and no files are deleted.
+    /// </para>
+    /// </remarks>
+    protected void RollOverSize()
+    {
+      CloseFile(); // keep windows happy.
+
+      LogLog.Debug(declaringType, "rolling over count [" + ((CountingQuietTextWriter)QuietWriter).Count + "]");
+      LogLog.Debug(declaringType, "maxSizeRollBackups [" + m_maxSizeRollBackups + "]");
+      LogLog.Debug(declaringType, "curSizeRollBackups [" + m_curSizeRollBackups + "]");
+      LogLog.Debug(declaringType, "countDirection [" + m_countDirection + "]");
+
+      RollOverRenameFiles(File);
+
+      if (!m_staticLogFileName && m_countDirection >= 0)
+      {
+        m_curSizeRollBackups++;
+      }
+
+      // This will also close the file. This is OK since multiple close operations are safe.
+      SafeOpenFile(m_baseFileName, false);
+    }
+
+    /// <summary>
+    /// Implements file roll.
+    /// </summary>
+    /// <param name="baseFileName">the base name to rename</param>
+    /// <remarks>
+    /// <para>
+    /// If the maximum number of size based backups is reached
+    /// (<c>curSizeRollBackups == maxSizeRollBackups</c>) then the oldest
+    /// file is deleted -- its index determined by the sign of countDirection.
+    /// If <c>countDirection</c> &lt; 0, then files
+    /// {<c>File.1</c>, ..., <c>File.curSizeRollBackups -1</c>}
+    /// are renamed to {<c>File.2</c>, ...,
+    /// <c>File.curSizeRollBackups</c>}. 
+    /// </para>
+    /// <para>
+    /// If <c>maxSizeRollBackups</c> is equal to zero, then the
+    /// <c>File</c> is truncated with no backup files created.
+    /// </para>
+    /// <para>
+    /// If <c>maxSizeRollBackups</c> &lt; 0, then <c>File</c> is
+    /// renamed if needed and no files are deleted.
+    /// </para>
+    /// <para>
+    /// This is called by <see cref="RollOverSize"/> to rename the files.
+    /// </para>
+    /// </remarks>
+    protected void RollOverRenameFiles(string baseFileName)
+    {
+      // If maxBackups <= 0, then there is no file renaming to be done.
+      if (m_maxSizeRollBackups != 0)
+      {
+        if (m_countDirection < 0)
+        {
+          // Delete the oldest file, to keep Windows happy.
+          if (m_curSizeRollBackups == m_maxSizeRollBackups)
+          {
+            DeleteFile(CombinePath(baseFileName, "." + m_maxSizeRollBackups));
+            m_curSizeRollBackups--;
+          }
+
+          // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
+          for (var i = m_curSizeRollBackups; i >= 1; i--)
+          {
+            RollFile((CombinePath(baseFileName, "." + i)), (CombinePath(baseFileName, "." + (i + 1))));
+          }
+
+          m_curSizeRollBackups++;
+
+          // Rename fileName to fileName.1
+          RollFile(baseFileName, CombinePath(baseFileName, ".1"));
+        }
+        else
+        {
+          //countDirection >= 0
+          if (m_curSizeRollBackups >= m_maxSizeRollBackups && m_maxSizeRollBackups > 0)
+          {
+            //delete the first and keep counting up.
+            var oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups;
+
+            // If static then there is 1 file without a number, therefore 1 less archive
+            if (m_staticLogFileName)
+            {
+              oldestFileIndex++;
+            }
+
+            // If using a static log file then the base for the numbered sequence is the baseFileName passed in
+            // If not using a static log file then the baseFileName will already have a numbered postfix which
+            // we must remove, however it may have a date postfix which we must keep!
+            var archiveFileBaseName = baseFileName;
+            if (!m_staticLogFileName)
+            {
+              if (m_preserveLogFileNameExtension)
+              {
+                var extension = Path.GetExtension(archiveFileBaseName);
+                var baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName);
+                var lastDotIndex = baseName.LastIndexOf(".");
+                if (lastDotIndex >= 0)
                 {
-                    if (0 == m_maxSizeRollBackups)
-                    {
-                        // Stay at zero when zero backups are desired
-                    }
-                    else if (-1 == m_maxSizeRollBackups)
-                    {
-                        // Infinite backups, so go as high as the highest value
-                        m_curSizeRollBackups = backup;
-                    }
-                    else
-                    {
-                        // Backups limited to a finite number
-                        if (m_countDirection >= 0)
-                        {
-                            // Go with the highest file when counting up
-                            m_curSizeRollBackups = backup;
-                        }
-                        else
-                        {
-                            // Clip to the limit when counting down
-                            if (backup <= m_maxSizeRollBackups)
-                            {
-                                m_curSizeRollBackups = backup;
-                            }
-                        }
-                    }
-                    LogLog.Debug(declaringType, "File name [" + curFileName + "] moves current count to [" + m_curSizeRollBackups + "]");
+                  archiveFileBaseName = baseName.Substring(0, lastDotIndex) + extension;
                 }
-			} 
-			catch(FormatException) 
-			{
-				//this happens when file.log -> file.log.yyyy-MM-dd which is normal
-				//when staticLogFileName == false
-				LogLog.Debug(declaringType, "Encountered a backup file not ending in .x ["+curFileName+"]");
-			}
-		}
-
-        /// <summary>
-        /// Attempts to extract a number from the end of the file name that indicates
-        /// the number of the times the file has been rolled over.
-        /// </summary>
-        /// <remarks>
-        /// Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes.
-        /// </remarks>
-        /// <param name="curFileName"></param>
-        /// <returns></returns>
-	    private int GetBackUpIndex(string curFileName)
-	    {
-            var backUpIndex = -1;
-            var fileName = curFileName;
-
-            if (m_preserveLogFileNameExtension)
-            {
-                fileName = Path.GetFileNameWithoutExtension(fileName);
-            }
-            
-            var index = fileName.LastIndexOf(".");
-            if (index > 0)
-            {
-                // if the "yyyy-MM-dd" component of file.log.yyyy-MM-dd is passed to TryParse
-                // it will gracefully fail and return backUpIndex will be 0
-                SystemInfo.TryParse(fileName.Substring(index + 1), out backUpIndex);
+              }
+              else
+              {
+                var lastDotIndex = archiveFileBaseName.LastIndexOf(".");
+                if (lastDotIndex >= 0)
+                {
+                  archiveFileBaseName = archiveFileBaseName.Substring(0, lastDotIndex);
+                }
+              }
             }
 
-            return backUpIndex;
-	    }
+            // Delete the archive file
+            DeleteFile(CombinePath(archiveFileBaseName, "." + oldestFileIndex));
+          }
 
-	    /// <summary>
-		/// Takes a list of files and a base file name, and looks for 
-		/// 'incremented' versions of the base file.  Bumps the max
-		/// count up to the highest count seen.
-		/// </summary>
-		/// <param name="baseFile"></param>
-		/// <param name="arrayFiles"></param>
-		private void InitializeRollBackups(string baseFile, ArrayList arrayFiles)
-		{
-			if (null != arrayFiles)
-			{
-				var baseFileLower = baseFile.ToLowerInvariant();
-
-				foreach(string curFileName in arrayFiles)
-				{
-					InitializeFromOneFile(baseFileLower, curFileName.ToLowerInvariant());
-				}
-			}
-		}
-
-		/// <summary>
-		/// Calculates the RollPoint for the datePattern supplied.
-		/// </summary>
-		/// <param name="datePattern">the date pattern to calculate the check period for</param>
-		/// <returns>The RollPoint that is most accurate for the date pattern supplied</returns>
-		/// <remarks>
-		/// Essentially the date pattern is examined to determine what the
-		/// most suitable roll point is. The roll point chosen is the roll point
-		/// with the smallest period that can be detected using the date pattern
-		/// supplied. i.e. if the date pattern only outputs the year, month, day 
-		/// and hour then the smallest roll point that can be detected would be
-		/// and hourly roll point as minutes could not be detected.
-		/// </remarks>
-		private RollPoint ComputeCheckPeriod(string datePattern) 
-		{
-			// s_date1970 is 1970-01-01 00:00:00 this is UniversalSortableDateTimePattern 
-			// (based on ISO 8601) using universal time. This date is used for reference
-			// purposes to calculate the resolution of the date pattern.
-
-			// Get string representation of base line date
-			var r0 = s_date1970.ToString(datePattern, DateTimeFormatInfo.InvariantInfo);
-
-			// Check each type of rolling mode starting with the smallest increment.
-			for(var i = (int)RollPoint.TopOfMinute; i <= (int)RollPoint.TopOfMonth; i++) 
-			{
-				// Get string representation of next pattern
-				var r1 = NextCheckDate(s_date1970, (RollPoint)i).ToString(datePattern, DateTimeFormatInfo.InvariantInfo);
-
-				LogLog.Debug(declaringType, "Type = ["+i+"], r0 = ["+r0+"], r1 = ["+r1+"]");
-
-				// Check if the string representations are different
-				if (r0 != null && r1 != null && !r0.Equals(r1)) 
-				{
-					// Found highest precision roll point
-					return (RollPoint)i;
-				}
-			}
-
-			return RollPoint.InvalidRollPoint; // Deliberately head for trouble...
-		}
-
-		/// <summary>
-		/// Initialize the appender based on the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// Sets initial conditions including date/time roll over information, first check,
-		/// scheduledFilename, and calls <see cref="ExistingInit"/> to initialize
-		/// the current number of backups.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			if (m_dateTime == null)
-			{
-				m_dateTime = new LocalDateTime();
-			}
-
-			if (m_rollDate && m_datePattern != null) 
-			{
-				m_now = m_dateTime.Now;
-				m_rollPoint = ComputeCheckPeriod(m_datePattern);
-
-				if (m_rollPoint == RollPoint.InvalidRollPoint)
-				{
-					throw new ArgumentException("Invalid RollPoint, unable to parse ["+m_datePattern+"]");
-				}
-
-				// next line added as this removes the name check in rollOver
-				m_nextCheck = NextCheckDate(m_now, m_rollPoint);
-			} 
-			else 
-			{
-				if (m_rollDate)
-				{
-					ErrorHandler.Error("Either DatePattern or rollingStyle options are not set for ["+Name+"].");
-				}
-			}
-
-			if (SecurityContext == null)
-			{
-				SecurityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-			}
-
-			using(SecurityContext.Impersonate(this))
-			{
-				// Must convert the FileAppender's m_filePath to an absolute path before we
-				// call ExistingInit(). This will be done by the base.ActivateOptions() but
-				// we need to duplicate that functionality here first.
-				base.File = ConvertToFullPath(base.File.Trim());
-
-				// Store fully qualified base file name
-				m_baseFileName = base.File;
-			}
-
-#if !NETCF
-			// initialize the mutex that is used to lock rolling
-			m_mutexForRolling = new Mutex(false, m_baseFileName
-				.Replace("\\", "_")
-				.Replace(":", "_")
-				.Replace("/", "_") + "_rolling"
-			);
-#endif
-
-			if (m_rollDate && File != null && m_scheduledFilename == null)
-			{
-                m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
-			}
-
-			ExistingInit();
-	
-			base.ActivateOptions();
-		}
-
-		#endregion
-  
-		#region Roll File
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="path1"></param>
-        /// <param name="path2">.1, .2, .3, etc.</param>
-        /// <returns></returns>
-        private string CombinePath(string path1, string path2)
-        {
-            var extension = Path.GetExtension(path1);
-            if (m_preserveLogFileNameExtension && extension.Length > 0)
-            {
-                return Path.Combine(Path.GetDirectoryName(path1), Path.GetFileNameWithoutExtension(path1) + path2 + extension);
-            }
-            else
-            {
-                return path1 + path2;
-            }
+          if (m_staticLogFileName)
+          {
+            m_curSizeRollBackups++;
+            RollFile(baseFileName, CombinePath(baseFileName, "." + m_curSizeRollBackups));
+          }
         }
+      }
+    }
 
-		/// <summary>
-		/// Rollover the file(s) to date/time tagged file(s).
-		/// </summary>
-		/// <param name="fileIsOpen">set to true if the file to be rolled is currently open</param>
-		/// <remarks>
-		/// <para>
-		/// Rollover the file(s) to date/time tagged file(s).
-		/// Resets curSizeRollBackups. 
-		/// If fileIsOpen is set then the new file is opened (through SafeOpenFile).
-		/// </para>
-		/// </remarks>
-		protected void RollOverTime(bool fileIsOpen) 
-		{
-			if (m_staticLogFileName) 
-			{
-				// Compute filename, but only if datePattern is specified
-				if (m_datePattern == null) 
-				{
-					ErrorHandler.Error("Missing DatePattern option in rollOver().");
-					return;
-				}
-	  
-				//is the new file name equivalent to the 'current' one
-				//something has gone wrong if we hit this -- we should only
-				//roll over if the new file will be different from the old
-				var dateFormat = m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo);
-                if (m_scheduledFilename.Equals(CombinePath(File, dateFormat))) 
-				{
-                    ErrorHandler.Error("Compare " + m_scheduledFilename + " : " + CombinePath(File, dateFormat));
-					return;
-				}
-	  
-				if (fileIsOpen)
-				{
-					// close current file, and rename it to datedFilename
-					CloseFile();
-				}
-	  
-				//we may have to roll over a large number of backups here
-				for (var i = 1; i <= m_curSizeRollBackups; i++) 
-				{
-                    var from = CombinePath(File, "." + i);
-                    var to = CombinePath(m_scheduledFilename, "." + i);
-					RollFile(from, to);
-				}
-	  
-				RollFile(File, m_scheduledFilename);
-			}
-	
-			//We've cleared out the old date and are ready for the new
-			m_curSizeRollBackups = 0; 
-	
-			//new scheduled name
-            m_scheduledFilename = CombinePath(File, m_now.ToString(m_datePattern, DateTimeFormatInfo.InvariantInfo));
+    #endregion
 
-			if (fileIsOpen)
-			{
-				// This will also close the file. This is OK since multiple close operations are safe.
-				SafeOpenFile(m_baseFileName, false);
-			}
-		}
-  
-		/// <summary>
-		/// Renames file <paramref name="fromFile"/> to file <paramref name="toFile"/>.
-		/// </summary>
-		/// <param name="fromFile">Name of existing file to roll.</param>
-		/// <param name="toFile">New name for file.</param>
-		/// <remarks>
-		/// <para>
-		/// Renames file <paramref name="fromFile"/> to file <paramref name="toFile"/>. It
-		/// also checks for existence of target file and deletes if it does.
-		/// </para>
-		/// </remarks>
-		protected void RollFile(string fromFile, string toFile) 
-		{
-			if (FileExists(fromFile))
-			{
-				// Delete the toFile if it exists
-				DeleteFile(toFile);
+    #region NextCheckDate
 
-				// We may not have permission to move the file, or the file may be locked
-				try
-				{
-					LogLog.Debug(declaringType, "Moving [" + fromFile + "] -> [" + toFile + "]");
-					using(SecurityContext.Impersonate(this))
-					{
-						System.IO.File.Move(fromFile, toFile);
-					}
-				}
-				catch(Exception moveEx)
-				{
-					ErrorHandler.Error("Exception while rolling file [" + fromFile + "] -> [" + toFile + "]", moveEx, ErrorCode.GenericFailure);
-				}
-			}
-			else
-			{
-				LogLog.Warn(declaringType, "Cannot RollFile [" + fromFile + "] -> [" + toFile + "]. Source does not exist");
-			}
-		}
+    /// <summary>
+    /// Get the start time of the next window for the current rollpoint
+    /// </summary>
+    /// <param name="currentDateTime">the current date</param>
+    /// <param name="rollPoint">the type of roll point we are working with</param>
+    /// <returns>the start time for the next roll point an interval after the currentDateTime date</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the date of the next roll point after the currentDateTime date passed to the method.
+    /// </para>
+    /// <para>
+    /// The basic strategy is to subtract the time parts that are less significant
+    /// than the rollpoint from the current time. This should roll the time back to
+    /// the start of the time window for the current rollpoint. Then we add 1 window
+    /// worth of time and get the start time of the next window for the rollpoint.
+    /// </para>
+    /// </remarks>
+    protected DateTime NextCheckDate(DateTime currentDateTime, RollPoint rollPoint)
+    {
+      // Local variable to work on (this does not look very efficient)
+      var current = currentDateTime;
 
-		/// <summary>
-		/// Test if a file exists at a specified path
-		/// </summary>
-		/// <param name="path">the path to the file</param>
-		/// <returns>true if the file exists</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if a file exists at a specified path
-		/// </para>
-		/// </remarks>
-		protected bool FileExists(string path)
-		{
-			using(SecurityContext.Impersonate(this))
-			{
-				return System.IO.File.Exists(path);
-			}
-		}
-  
-		/// <summary>
-		/// Deletes the specified file if it exists.
-		/// </summary>
-		/// <param name="fileName">The file to delete.</param>
-		/// <remarks>
-		/// <para>
-		/// Delete a file if is exists.
-		/// The file is first moved to a new filename then deleted.
-		/// This allows the file to be removed even when it cannot
-		/// be deleted, but it still can be moved.
-		/// </para>
-		/// </remarks>
-		protected void DeleteFile(string fileName) 
-		{
-			if (FileExists(fileName)) 
-			{
-				// We may not have permission to delete the file, or the file may be locked
+      // Do slightly different things depending on what the type of roll point we want.
+      switch (rollPoint)
+      {
+        case RollPoint.TopOfMinute:
+          current = current.AddMilliseconds(-current.Millisecond);
+          current = current.AddSeconds(-current.Second);
+          current = current.AddMinutes(1);
+          break;
 
-				var fileToDelete = fileName;
+        case RollPoint.TopOfHour:
+          current = current.AddMilliseconds(-current.Millisecond);
+          current = current.AddSeconds(-current.Second);
+          current = current.AddMinutes(-current.Minute);
+          current = current.AddHours(1);
+          break;
 
-				// Try to move the file to temp name.
-				// If the file is locked we may still be able to move it
-				var tempFileName = fileName + "." + Environment.TickCount + ".DeletePending";
-				try
-				{
-					using(SecurityContext.Impersonate(this))
-					{
-						System.IO.File.Move(fileName, tempFileName);
-					}
-					fileToDelete = tempFileName;
-				}
-				catch(Exception moveEx)
-				{
-					LogLog.Debug(declaringType, "Exception while moving file to be deleted [" + fileName + "] -> [" + tempFileName + "]", moveEx);
-				}
+        case RollPoint.HalfDay:
+          current = current.AddMilliseconds(-current.Millisecond);
+          current = current.AddSeconds(-current.Second);
+          current = current.AddMinutes(-current.Minute);
 
-				// Try to delete the file (either the original or the moved file)
-				try
-				{
-					using(SecurityContext.Impersonate(this))
-					{
-						System.IO.File.Delete(fileToDelete);
-					}
-					LogLog.Debug(declaringType, "Deleted file [" + fileName + "]");
-				}
-				catch(Exception deleteEx)
-				{
-					if (fileToDelete == fileName)
-					{
-						// Unable to move or delete the file
-						ErrorHandler.Error("Exception while deleting file [" + fileToDelete + "]", deleteEx, ErrorCode.GenericFailure);
-					}
-					else
-					{
-						// Moved the file, but the delete failed. File is probably locked.
-						// The file should automatically be deleted when the lock is released.
-						LogLog.Debug(declaringType, "Exception while deleting temp file [" + fileToDelete + "]", deleteEx);
-					}
-				}
-			}
-		}
-  
-		/// <summary>
-		/// Implements file roll base on file size.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// If the maximum number of size based backups is reached
-		/// (<c>curSizeRollBackups == maxSizeRollBackups</c>) then the oldest
-		/// file is deleted -- its index determined by the sign of countDirection.
-		/// If <c>countDirection</c> &lt; 0, then files
-		/// {<c>File.1</c>, ..., <c>File.curSizeRollBackups -1</c>}
-		/// are renamed to {<c>File.2</c>, ...,
-		/// <c>File.curSizeRollBackups</c>}. Moreover, <c>File</c> is
-		/// renamed <c>File.1</c> and closed.
-		/// </para>
-		/// <para>
-		/// A new file is created to receive further log output.
-		/// </para>
-		/// <para>
-		/// If <c>maxSizeRollBackups</c> is equal to zero, then the
-		/// <c>File</c> is truncated with no backup files created.
-		/// </para>
-		/// <para>
-		/// If <c>maxSizeRollBackups</c> &lt; 0, then <c>File</c> is
-		/// renamed if needed and no files are deleted.
-		/// </para>
-		/// </remarks>
-		protected void RollOverSize() 
-		{
-			CloseFile(); // keep windows happy.
-	
-			LogLog.Debug(declaringType, "rolling over count ["+((CountingQuietTextWriter)QuietWriter).Count+"]");
-			LogLog.Debug(declaringType, "maxSizeRollBackups ["+m_maxSizeRollBackups+"]");
-			LogLog.Debug(declaringType, "curSizeRollBackups ["+m_curSizeRollBackups+"]");
-			LogLog.Debug(declaringType, "countDirection ["+m_countDirection+"]");
+          if (current.Hour < 12)
+          {
+            current = current.AddHours(12 - current.Hour);
+          }
+          else
+          {
+            current = current.AddHours(-current.Hour);
+            current = current.AddDays(1);
+          }
+          break;
 
-			RollOverRenameFiles(File);
-	
-			if (!m_staticLogFileName && m_countDirection >= 0) 
-			{
-				m_curSizeRollBackups++;
-			}
+        case RollPoint.TopOfDay:
+          current = current.AddMilliseconds(-current.Millisecond);
+          current = current.AddSeconds(-current.Second);
+          current = current.AddMinutes(-current.Minute);
+          current = current.AddHours(-current.Hour);
+          current = current.AddDays(1);
+          break;
 
-			// This will also close the file. This is OK since multiple close operations are safe.
-			SafeOpenFile(m_baseFileName, false);
-		}
+        case RollPoint.TopOfWeek:
+          current = current.AddMilliseconds(-current.Millisecond);
+          current = current.AddSeconds(-current.Second);
+          current = current.AddMinutes(-current.Minute);
+          current = current.AddHours(-current.Hour);
+          current = current.AddDays(7 - (int)current.DayOfWeek);
+          break;
 
-		/// <summary>
-		/// Implements file roll.
-		/// </summary>
-		/// <param name="baseFileName">the base name to rename</param>
-		/// <remarks>
-		/// <para>
-		/// If the maximum number of size based backups is reached
-		/// (<c>curSizeRollBackups == maxSizeRollBackups</c>) then the oldest
-		/// file is deleted -- its index determined by the sign of countDirection.
-		/// If <c>countDirection</c> &lt; 0, then files
-		/// {<c>File.1</c>, ..., <c>File.curSizeRollBackups -1</c>}
-		/// are renamed to {<c>File.2</c>, ...,
-		/// <c>File.curSizeRollBackups</c>}. 
-		/// </para>
-		/// <para>
-		/// If <c>maxSizeRollBackups</c> is equal to zero, then the
-		/// <c>File</c> is truncated with no backup files created.
-		/// </para>
-		/// <para>
-		/// If <c>maxSizeRollBackups</c> &lt; 0, then <c>File</c> is
-		/// renamed if needed and no files are deleted.
-		/// </para>
-		/// <para>
-		/// This is called by <see cref="RollOverSize"/> to rename the files.
-		/// </para>
-		/// </remarks>
-		protected void RollOverRenameFiles(string baseFileName) 
-		{
-			// If maxBackups <= 0, then there is no file renaming to be done.
-			if (m_maxSizeRollBackups != 0) 
-			{
-				if (m_countDirection < 0) 
-				{
-					// Delete the oldest file, to keep Windows happy.
-					if (m_curSizeRollBackups == m_maxSizeRollBackups) 
-					{
-                        DeleteFile(CombinePath(baseFileName, "." + m_maxSizeRollBackups));
-						m_curSizeRollBackups--;
-					}
-	
-					// Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3, 2}
-					for (var i = m_curSizeRollBackups; i >= 1; i--) 
-					{
-                        RollFile((CombinePath(baseFileName, "." + i)), (CombinePath(baseFileName, "." + (i + 1))));
-					}
-	
-					m_curSizeRollBackups++;
+        case RollPoint.TopOfMonth:
+          current = current.AddMilliseconds(-current.Millisecond);
+          current = current.AddSeconds(-current.Second);
+          current = current.AddMinutes(-current.Minute);
+          current = current.AddHours(-current.Hour);
+          current = current.AddDays(1 - current.Day); /* first day of month is 1 not 0 */
+          current = current.AddMonths(1);
+          break;
+      }
+      return current;
+    }
 
-					// Rename fileName to fileName.1
-                    RollFile(baseFileName, CombinePath(baseFileName, ".1"));
-				} 
-				else 
-				{
-					//countDirection >= 0
-					if (m_curSizeRollBackups >= m_maxSizeRollBackups && m_maxSizeRollBackups > 0) 
-					{
-						//delete the first and keep counting up.
-						var oldestFileIndex = m_curSizeRollBackups - m_maxSizeRollBackups;
+    #endregion
 
-						// If static then there is 1 file without a number, therefore 1 less archive
-						if (m_staticLogFileName)
-						{
-							oldestFileIndex++;
-						}
+    #region Private Instance Fields
 
-						// If using a static log file then the base for the numbered sequence is the baseFileName passed in
-						// If not using a static log file then the baseFileName will already have a numbered postfix which
-						// we must remove, however it may have a date postfix which we must keep!
-						var archiveFileBaseName = baseFileName;
-						if (!m_staticLogFileName)
-						{
-                                                    if (m_preserveLogFileNameExtension)
-                                                    {
-                                                        var extension = Path.GetExtension(archiveFileBaseName);
-                                                        var baseName = Path.GetFileNameWithoutExtension(archiveFileBaseName);
-							var lastDotIndex = baseName.LastIndexOf(".");
-							if (lastDotIndex >= 0)
-							{
-								archiveFileBaseName = baseName.Substring(0, lastDotIndex) + extension;
-							}
-                                                    }
-                                                    else
-                                                    {
-							var lastDotIndex = archiveFileBaseName.LastIndexOf(".");
-							if (lastDotIndex >= 0) 
-							{
-								archiveFileBaseName = archiveFileBaseName.Substring(0, lastDotIndex);
-							}
-                                                    }
-						}
+    /// <summary>
+    /// This object supplies the current date/time.  Allows test code to plug in
+    /// a method to control this class when testing date/time based rolling. The default
+    /// implementation uses the underlying value of DateTime.Now.
+    /// </summary>
+    private IDateTime m_dateTime = null;
 
-						// Delete the archive file
-                        DeleteFile(CombinePath(archiveFileBaseName, "." + oldestFileIndex));
-					}
-	
-					if (m_staticLogFileName) 
-					{
-						m_curSizeRollBackups++;
-                        RollFile(baseFileName, CombinePath(baseFileName, "." + m_curSizeRollBackups));
-					}
-				}
-			}
-		}
+    /// <summary>
+    /// The date pattern. By default, the pattern is set to <c>".yyyy-MM-dd"</c> 
+    /// meaning daily rollover.
+    /// </summary>
+    private string m_datePattern = ".yyyy-MM-dd";
 
-		#endregion
+    /// <summary>
+    /// The actual formatted filename that is currently being written to
+    /// or will be the file transferred to on roll over
+    /// (based on staticLogFileName).
+    /// </summary>
+    private string m_scheduledFilename = null;
 
-		#region NextCheckDate
+    /// <summary>
+    /// The timestamp when we shall next recompute the filename.
+    /// </summary>
+    private DateTime m_nextCheck = DateTime.MaxValue;
 
-		/// <summary>
-		/// Get the start time of the next window for the current rollpoint
-		/// </summary>
-		/// <param name="currentDateTime">the current date</param>
-		/// <param name="rollPoint">the type of roll point we are working with</param>
-		/// <returns>the start time for the next roll point an interval after the currentDateTime date</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the date of the next roll point after the currentDateTime date passed to the method.
-		/// </para>
-		/// <para>
-		/// The basic strategy is to subtract the time parts that are less significant
-		/// than the rollpoint from the current time. This should roll the time back to
-		/// the start of the time window for the current rollpoint. Then we add 1 window
-		/// worth of time and get the start time of the next window for the rollpoint.
-		/// </para>
-		/// </remarks>
-		protected DateTime NextCheckDate(DateTime currentDateTime, RollPoint rollPoint) 
-		{
-			// Local variable to work on (this does not look very efficient)
-			var current = currentDateTime;
+    /// <summary>
+    /// Holds date of last roll over
+    /// </summary>
+    private DateTime m_now;
 
-			// Do slightly different things depending on what the type of roll point we want.
-			switch(rollPoint) 
-			{
-				case RollPoint.TopOfMinute:
-					current = current.AddMilliseconds(-current.Millisecond);
-					current = current.AddSeconds(-current.Second);
-					current = current.AddMinutes(1);
-					break;
+    /// <summary>
+    /// The type of rolling done
+    /// </summary>
+    private RollPoint m_rollPoint;
 
-				case RollPoint.TopOfHour:
-					current = current.AddMilliseconds(-current.Millisecond);
-					current = current.AddSeconds(-current.Second);
-					current = current.AddMinutes(-current.Minute);
-					current = current.AddHours(1);
-					break;
+    /// <summary>
+    /// The default maximum file size is 10MB
+    /// </summary>
+    private long m_maxFileSize = 10 * 1024 * 1024;
 
-				case RollPoint.HalfDay:
-					current = current.AddMilliseconds(-current.Millisecond);
-					current = current.AddSeconds(-current.Second);
-					current = current.AddMinutes(-current.Minute);
+    /// <summary>
+    /// There is zero backup files by default
+    /// </summary>
+    private int m_maxSizeRollBackups = 0;
 
-					if (current.Hour < 12) 
-					{
-						current = current.AddHours(12 - current.Hour);
-					} 
-					else 
-					{
-						current = current.AddHours(-current.Hour);
-						current = current.AddDays(1);
-					}
-					break;
+    /// <summary>
+    /// How many sized based backups have been made so far
+    /// </summary>
+    private int m_curSizeRollBackups = 0;
 
-				case RollPoint.TopOfDay:
-					current = current.AddMilliseconds(-current.Millisecond);
-					current = current.AddSeconds(-current.Second);
-					current = current.AddMinutes(-current.Minute);
-					current = current.AddHours(-current.Hour);
-					current = current.AddDays(1);
-					break;
+    /// <summary>
+    /// The rolling file count direction. 
+    /// </summary>
+    private int m_countDirection = -1;
 
-				case RollPoint.TopOfWeek:
-					current = current.AddMilliseconds(-current.Millisecond);
-					current = current.AddSeconds(-current.Second);
-					current = current.AddMinutes(-current.Minute);
-					current = current.AddHours(-current.Hour);
-					current = current.AddDays(7 - (int)current.DayOfWeek);
-					break;
+    /// <summary>
+    /// The rolling mode used in this appender.
+    /// </summary>
+    private RollingMode m_rollingStyle = RollingMode.Composite;
 
-				case RollPoint.TopOfMonth:
-					current = current.AddMilliseconds(-current.Millisecond);
-					current = current.AddSeconds(-current.Second);
-					current = current.AddMinutes(-current.Minute);
-					current = current.AddHours(-current.Hour);
-					current = current.AddDays(1 - current.Day); /* first day of month is 1 not 0 */
-					current = current.AddMonths(1);
-					break;
-			}	  
-			return current;
-		}
+    /// <summary>
+    /// Cache flag set if we are rolling by date.
+    /// </summary>
+    private bool m_rollDate = true;
 
-		#endregion
+    /// <summary>
+    /// Cache flag set if we are rolling by size.
+    /// </summary>
+    private bool m_rollSize = true;
 
-		#region Private Instance Fields
+    /// <summary>
+    /// Value indicating whether to always log to the same file.
+    /// </summary>
+    private bool m_staticLogFileName = true;
 
-		/// <summary>
-		/// This object supplies the current date/time.  Allows test code to plug in
-		/// a method to control this class when testing date/time based rolling. The default
-		/// implementation uses the underlying value of DateTime.Now.
-		/// </summary>
-		private IDateTime m_dateTime = null;
-
-		/// <summary>
-		/// The date pattern. By default, the pattern is set to <c>".yyyy-MM-dd"</c> 
-		/// meaning daily rollover.
-		/// </summary>
-		private string m_datePattern = ".yyyy-MM-dd";
-  
-		/// <summary>
-		/// The actual formatted filename that is currently being written to
-		/// or will be the file transferred to on roll over
-		/// (based on staticLogFileName).
-		/// </summary>
-		private string m_scheduledFilename = null;
-  
-		/// <summary>
-		/// The timestamp when we shall next recompute the filename.
-		/// </summary>
-		private DateTime m_nextCheck = DateTime.MaxValue;
-  
-		/// <summary>
-		/// Holds date of last roll over
-		/// </summary>
-		private DateTime m_now;
-  
-		/// <summary>
-		/// The type of rolling done
-		/// </summary>
-		private RollPoint m_rollPoint;
-  
-		/// <summary>
-		/// The default maximum file size is 10MB
-		/// </summary>
-		private long m_maxFileSize = 10*1024*1024;
-  
-		/// <summary>
-		/// There is zero backup files by default
-		/// </summary>
-		private int m_maxSizeRollBackups  = 0;
-
-		/// <summary>
-		/// How many sized based backups have been made so far
-		/// </summary>
-		private int m_curSizeRollBackups = 0;
-  
-		/// <summary>
-		/// The rolling file count direction. 
-		/// </summary>
-		private int m_countDirection = -1;
-  
-		/// <summary>
-		/// The rolling mode used in this appender.
-		/// </summary>
-		private RollingMode m_rollingStyle = RollingMode.Composite;
-
-		/// <summary>
-		/// Cache flag set if we are rolling by date.
-		/// </summary>
-		private bool m_rollDate = true;
-
-		/// <summary>
-		/// Cache flag set if we are rolling by size.
-		/// </summary>
-		private bool m_rollSize = true;
-  
-		/// <summary>
-		/// Value indicating whether to always log to the same file.
-		/// </summary>
-		private bool m_staticLogFileName = true;
-  
-   		/// <summary>
-		/// Value indicating whether to preserve the file name extension when rolling.
-		/// </summary>
-		private bool m_preserveLogFileNameExtension = false;
+    /// <summary>
+    /// Value indicating whether to preserve the file name extension when rolling.
+    /// </summary>
+    private bool m_preserveLogFileNameExtension = false;
 
 
-		/// <summary>
-		/// FileName provided in configuration.  Used for rolling properly
-		/// </summary>
-		private string m_baseFileName;
+    /// <summary>
+    /// FileName provided in configuration.  Used for rolling properly
+    /// </summary>
+    private string m_baseFileName;
 
 #if !NETCF
-		/// <summary>
-		/// A mutex that is used to lock rolling of files.
-		/// </summary>
-		private Mutex m_mutexForRolling;
+    /// <summary>
+    /// A mutex that is used to lock rolling of files.
+    /// </summary>
+    private Mutex m_mutexForRolling;
 #endif
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Static Members
+    #region Static Members
 
-		/// <summary>
-		/// The 1st of January 1970 in UTC
-		/// </summary>
-		private static readonly DateTime s_date1970 = new DateTime(1970, 1, 1);
+    /// <summary>
+    /// The 1st of January 1970 in UTC
+    /// </summary>
+    private static readonly DateTime s_date1970 = new DateTime(1970, 1, 1);
 
-		#endregion
+    #endregion
 
-		#region DateTime
+    #region DateTime
 
-		/// <summary>
-		/// This interface is used to supply Date/Time information to the <see cref="RollingFileAppender"/>.
-		/// </summary>
-		/// <remarks>
-		/// This interface is used to supply Date/Time information to the <see cref="RollingFileAppender"/>.
-		/// Used primarily to allow test classes to plug themselves in so they can
-		/// supply test date/times.
-		/// </remarks>
-		public interface IDateTime
-		{
-			/// <summary>
-			/// Gets the <i>current</i> time.
-			/// </summary>
-			/// <value>The <i>current</i> time.</value>
-			/// <remarks>
-			/// <para>
-			/// Gets the <i>current</i> time.
-			/// </para>
-			/// </remarks>
-			DateTime Now { get; }
-		}
+    /// <summary>
+    /// This interface is used to supply Date/Time information to the <see cref="RollingFileAppender"/>.
+    /// </summary>
+    /// <remarks>
+    /// This interface is used to supply Date/Time information to the <see cref="RollingFileAppender"/>.
+    /// Used primarily to allow test classes to plug themselves in so they can
+    /// supply test date/times.
+    /// </remarks>
+    public interface IDateTime
+    {
+      /// <summary>
+      /// Gets the <i>current</i> time.
+      /// </summary>
+      /// <value>The <i>current</i> time.</value>
+      /// <remarks>
+      /// <para>
+      /// Gets the <i>current</i> time.
+      /// </para>
+      /// </remarks>
+      DateTime Now { get; }
+    }
 
-		/// <summary>
-		/// Default implementation of <see cref="IDateTime"/> that returns the current time.
-		/// </summary>
-		private class LocalDateTime : IDateTime
-		{
-			/// <summary>
-			/// Gets the <b>current</b> time.
-			/// </summary>
-			/// <value>The <b>current</b> time.</value>
-			/// <remarks>
-			/// <para>
-			/// Gets the <b>current</b> time.
-			/// </para>
-			/// </remarks>
-			public DateTime Now
-			{
-				get { return DateTime.Now; }
-			}
-		}
+    /// <summary>
+    /// Default implementation of <see cref="IDateTime"/> that returns the current time.
+    /// </summary>
+    private class LocalDateTime : IDateTime
+    {
+      /// <summary>
+      /// Gets the <b>current</b> time.
+      /// </summary>
+      /// <value>The <b>current</b> time.</value>
+      /// <remarks>
+      /// <para>
+      /// Gets the <b>current</b> time.
+      /// </para>
+      /// </remarks>
+      public DateTime Now
+      {
+        get { return DateTime.Now; }
+      }
+    }
 
 #if !NET_1_0 && !CLI_1_0 && !NETCF
-        /// <summary>
-		/// Implementation of <see cref="IDateTime"/> that returns the current time as the coordinated universal time (UTC).
-		/// </summary>
-		private class UniversalDateTime : IDateTime
-		{
-			/// <summary>
-			/// Gets the <b>current</b> time.
-			/// </summary>
-			/// <value>The <b>current</b> time.</value>
-			/// <remarks>
-			/// <para>
-			/// Gets the <b>current</b> time.
-			/// </para>
-			/// </remarks>
-			public DateTime Now
-			{
-				get { return DateTime.UtcNow; }
-			}
-		}
+    /// <summary>
+    /// Implementation of <see cref="IDateTime"/> that returns the current time as the coordinated universal time (UTC).
+    /// </summary>
+    private class UniversalDateTime : IDateTime
+    {
+      /// <summary>
+      /// Gets the <b>current</b> time.
+      /// </summary>
+      /// <value>The <b>current</b> time.</value>
+      /// <remarks>
+      /// <para>
+      /// Gets the <b>current</b> time.
+      /// </para>
+      /// </remarks>
+      public DateTime Now
+      {
+        get { return DateTime.UtcNow; }
+      }
+    }
 #endif
 
-        #endregion DateTime
-	}
+    #endregion DateTime
+  }
 }
diff --git a/src/log4net/Appender/SmtpAppender.cs b/src/log4net/Appender/SmtpAppender.cs
index 98b6bb6..58f822b 100644
--- a/src/log4net/Appender/SmtpAppender.cs
+++ b/src/log4net/Appender/SmtpAppender.cs
@@ -36,633 +36,634 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Send an e-mail when a specific logging event occurs, typically on errors 
-	/// or fatal errors.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The number of logging events delivered in this e-mail depend on
-	/// the value of <see cref="BufferingAppenderSkeleton.BufferSize"/> option. The
-	/// <see cref="SmtpAppender"/> keeps only the last
-	/// <see cref="BufferingAppenderSkeleton.BufferSize"/> logging events in its 
-	/// cyclic buffer. This keeps memory requirements at a reasonable level while 
-	/// still delivering useful application context.
-	/// </para>
-	/// <note type="caution">
-	/// Authentication and setting the server Port are only available on the MS .NET 1.1 runtime.
-	/// For these features to be enabled you need to ensure that you are using a version of
-	/// the log4net assembly that is built against the MS .NET 1.1 framework and that you are
-	/// running the your application on the MS .NET 1.1 runtime. On all other platforms only sending
-	/// unauthenticated messages to a server listening on port 25 (the default) is supported.
-	/// </note>
-	/// <para>
-	/// Authentication is supported by setting the <see cref="Authentication"/> property to
-	/// either <see cref="SmtpAuthentication.Basic"/> or <see cref="SmtpAuthentication.Ntlm"/>.
-	/// If using <see cref="SmtpAuthentication.Basic"/> authentication then the <see cref="Username"/>
-	/// and <see cref="Password"/> properties must also be set.
-	/// </para>
-	/// <para>
-	/// To set the SMTP server port use the <see cref="Port"/> property. The default port is 25.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class SmtpAppender : BufferingAppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Send an e-mail when a specific logging event occurs, typically on errors 
+  /// or fatal errors.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The number of logging events delivered in this e-mail depend on
+  /// the value of <see cref="BufferingAppenderSkeleton.BufferSize"/> option. The
+  /// <see cref="SmtpAppender"/> keeps only the last
+  /// <see cref="BufferingAppenderSkeleton.BufferSize"/> logging events in its 
+  /// cyclic buffer. This keeps memory requirements at a reasonable level while 
+  /// still delivering useful application context.
+  /// </para>
+  /// <note type="caution">
+  /// Authentication and setting the server Port are only available on the MS .NET 1.1 runtime.
+  /// For these features to be enabled you need to ensure that you are using a version of
+  /// the log4net assembly that is built against the MS .NET 1.1 framework and that you are
+  /// running the your application on the MS .NET 1.1 runtime. On all other platforms only sending
+  /// unauthenticated messages to a server listening on port 25 (the default) is supported.
+  /// </note>
+  /// <para>
+  /// Authentication is supported by setting the <see cref="Authentication"/> property to
+  /// either <see cref="SmtpAuthentication.Basic"/> or <see cref="SmtpAuthentication.Ntlm"/>.
+  /// If using <see cref="SmtpAuthentication.Basic"/> authentication then the <see cref="Username"/>
+  /// and <see cref="Password"/> properties must also be set.
+  /// </para>
+  /// <para>
+  /// To set the SMTP server port use the <see cref="Port"/> property. The default port is 25.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class SmtpAppender : BufferingAppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public SmtpAppender()
-		{	
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public SmtpAppender()
+    {
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions).
-		/// </summary>
-		/// <value>
-		/// <para>
-		/// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
-		/// </para>
-		/// <para>
-		/// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
-		/// </para>
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
-		/// </para>
-		/// <para>
-		/// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
-		/// </para>
-		/// </remarks>
-		public string To
-		{
-			get { return m_to; }
-			set { m_to = MaybeTrimSeparators(value); }
-		}
+    /// <summary>
+    /// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions).
+    /// </summary>
+    /// <value>
+    /// <para>
+    /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
+    /// </para>
+    /// <para>
+    /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
+    /// </para>
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
+    /// </para>
+    /// <para>
+    /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
+    /// </para>
+    /// </remarks>
+    public string To
+    {
+      get { return m_to; }
+      set { m_to = MaybeTrimSeparators(value); }
+    }
 
-		/// <summary>
-		/// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses 
-		/// that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions).
-		/// </summary>
-		/// <value>
-		/// <para>
-		/// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
-		/// </para>
-		/// <para>
-		/// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
-		/// </para>
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
-		/// </para>
-		/// <para>
-		/// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
-		/// </para>
-		/// </remarks>
-		public string Cc
-		{
-			get { return m_cc; }
-			set { m_cc = MaybeTrimSeparators(value); }
-		}
+    /// <summary>
+    /// Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses 
+    /// that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions).
+    /// </summary>
+    /// <value>
+    /// <para>
+    /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
+    /// </para>
+    /// <para>
+    /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
+    /// </para>
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses.
+    /// </para>
+    /// <para>
+    /// For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses.
+    /// </para>
+    /// </remarks>
+    public string Cc
+    {
+      get { return m_cc; }
+      set { m_cc = MaybeTrimSeparators(value); }
+    }
 
-		/// <summary>
-		/// Gets or sets a semicolon-delimited list of recipient e-mail addresses
-		/// that will be blind carbon copied.
-		/// </summary>
-		/// <value>
-		/// A semicolon-delimited list of e-mail addresses.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// A semicolon-delimited list of recipient e-mail addresses.
-		/// </para>
-		/// </remarks>
-		public string Bcc
-		{
-			get { return m_bcc; }
-			set { m_bcc = MaybeTrimSeparators(value); }
-		}
+    /// <summary>
+    /// Gets or sets a semicolon-delimited list of recipient e-mail addresses
+    /// that will be blind carbon copied.
+    /// </summary>
+    /// <value>
+    /// A semicolon-delimited list of e-mail addresses.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// A semicolon-delimited list of recipient e-mail addresses.
+    /// </para>
+    /// </remarks>
+    public string Bcc
+    {
+      get { return m_bcc; }
+      set { m_bcc = MaybeTrimSeparators(value); }
+    }
 
-		/// <summary>
-		/// Gets or sets the e-mail address of the sender.
-		/// </summary>
-		/// <value>
-		/// The e-mail address of the sender.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The e-mail address of the sender.
-		/// </para>
-		/// </remarks>
-		public string From 
-		{
-			get { return m_from; }
-			set { m_from = value; }
-		}
+    /// <summary>
+    /// Gets or sets the e-mail address of the sender.
+    /// </summary>
+    /// <value>
+    /// The e-mail address of the sender.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The e-mail address of the sender.
+    /// </para>
+    /// </remarks>
+    public string From
+    {
+      get { return m_from; }
+      set { m_from = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the subject line of the e-mail message.
-		/// </summary>
-		/// <value>
-		/// The subject line of the e-mail message.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The subject line of the e-mail message.
-		/// </para>
-		/// </remarks>
-		public string Subject 
-		{
-			get { return m_subject; }
-			set { m_subject = value; }
-		}
-  
-		/// <summary>
-		/// Gets or sets the name of the SMTP relay mail server to use to send 
-		/// the e-mail messages.
-		/// </summary>
-		/// <value>
-		/// The name of the e-mail relay server. If SmtpServer is not set, the 
-		/// name of the local SMTP server is used.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of the e-mail relay server. If SmtpServer is not set, the 
-		/// name of the local SMTP server is used.
-		/// </para>
-		/// </remarks>
-		public string SmtpHost
-		{
-			get { return m_smtpHost; }
-			set { m_smtpHost = value; }
-		}
+    /// <summary>
+    /// Gets or sets the subject line of the e-mail message.
+    /// </summary>
+    /// <value>
+    /// The subject line of the e-mail message.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The subject line of the e-mail message.
+    /// </para>
+    /// </remarks>
+    public string Subject
+    {
+      get { return m_subject; }
+      set { m_subject = value; }
+    }
 
-		/// <summary>
-		/// Obsolete
-		/// </summary>
-		/// <remarks>
-		/// Use the BufferingAppenderSkeleton Fix methods instead 
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// Obsolete property.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use the BufferingAppenderSkeleton Fix methods")]
-		public bool LocationInfo
-		{
-			get { return false; }
-			set { ; }
-		}
+    /// <summary>
+    /// Gets or sets the name of the SMTP relay mail server to use to send 
+    /// the e-mail messages.
+    /// </summary>
+    /// <value>
+    /// The name of the e-mail relay server. If SmtpServer is not set, the 
+    /// name of the local SMTP server is used.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of the e-mail relay server. If SmtpServer is not set, the 
+    /// name of the local SMTP server is used.
+    /// </para>
+    /// </remarks>
+    public string SmtpHost
+    {
+      get { return m_smtpHost; }
+      set { m_smtpHost = value; }
+    }
 
-		/// <summary>
-		/// The mode to use to authentication with the SMTP server
-		/// </summary>
-		/// <remarks>
-		/// <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
-		/// <para>
-		/// Valid Authentication mode values are: <see cref="SmtpAuthentication.None"/>, 
-		/// <see cref="SmtpAuthentication.Basic"/>, and <see cref="SmtpAuthentication.Ntlm"/>. 
-		/// The default value is <see cref="SmtpAuthentication.None"/>. When using 
-		/// <see cref="SmtpAuthentication.Basic"/> you must specify the <see cref="Username"/> 
-		/// and <see cref="Password"/> to use to authenticate.
-		/// When using <see cref="SmtpAuthentication.Ntlm"/> the Windows credentials for the current
-		/// thread, if impersonating, or the process will be used to authenticate. 
-		/// </para>
-		/// </remarks>
-		public SmtpAuthentication Authentication
-		{
-			get { return m_authentication; }
-			set { m_authentication = value; }
-		}
+    /// <summary>
+    /// Obsolete
+    /// </summary>
+    /// <remarks>
+    /// Use the BufferingAppenderSkeleton Fix methods instead 
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// Obsolete property.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use the BufferingAppenderSkeleton Fix methods")]
+    public bool LocationInfo
+    {
+      get { return false; }
+      set {; }
+    }
 
-		/// <summary>
-		/// The username to use to authenticate with the SMTP server
-		/// </summary>
-		/// <remarks>
-		/// <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
-		/// <para>
-		/// A <see cref="Username"/> and <see cref="Password"/> must be specified when 
-		/// <see cref="Authentication"/> is set to <see cref="SmtpAuthentication.Basic"/>, 
-		/// otherwise the username will be ignored. 
-		/// </para>
-		/// </remarks>
-		public string Username
-		{
-			get { return m_username; }
-			set { m_username = value; }
-		}
+    /// <summary>
+    /// The mode to use to authentication with the SMTP server
+    /// </summary>
+    /// <remarks>
+    /// <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
+    /// <para>
+    /// Valid Authentication mode values are: <see cref="SmtpAuthentication.None"/>, 
+    /// <see cref="SmtpAuthentication.Basic"/>, and <see cref="SmtpAuthentication.Ntlm"/>. 
+    /// The default value is <see cref="SmtpAuthentication.None"/>. When using 
+    /// <see cref="SmtpAuthentication.Basic"/> you must specify the <see cref="Username"/> 
+    /// and <see cref="Password"/> to use to authenticate.
+    /// When using <see cref="SmtpAuthentication.Ntlm"/> the Windows credentials for the current
+    /// thread, if impersonating, or the process will be used to authenticate. 
+    /// </para>
+    /// </remarks>
+    public SmtpAuthentication Authentication
+    {
+      get { return m_authentication; }
+      set { m_authentication = value; }
+    }
 
-		/// <summary>
-		/// The password to use to authenticate with the SMTP server
-		/// </summary>
-		/// <remarks>
-		/// <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
-		/// <para>
-		/// A <see cref="Username"/> and <see cref="Password"/> must be specified when 
-		/// <see cref="Authentication"/> is set to <see cref="SmtpAuthentication.Basic"/>, 
-		/// otherwise the password will be ignored. 
-		/// </para>
-		/// </remarks>
-		public string Password
-		{
-			get { return m_password; }
-			set { m_password = value; }
-		}
+    /// <summary>
+    /// The username to use to authenticate with the SMTP server
+    /// </summary>
+    /// <remarks>
+    /// <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
+    /// <para>
+    /// A <see cref="Username"/> and <see cref="Password"/> must be specified when 
+    /// <see cref="Authentication"/> is set to <see cref="SmtpAuthentication.Basic"/>, 
+    /// otherwise the username will be ignored. 
+    /// </para>
+    /// </remarks>
+    public string Username
+    {
+      get { return m_username; }
+      set { m_username = value; }
+    }
 
-		/// <summary>
-		/// The port on which the SMTP server is listening
-		/// </summary>
-		/// <remarks>
-		/// <note type="caution">Server Port is only available on the MS .NET 1.1 runtime.</note>
-		/// <para>
-		/// The port on which the SMTP server is listening. The default
-		/// port is <c>25</c>. The Port can only be changed when running on
-		/// the MS .NET 1.1 runtime.
-		/// </para>
-		/// </remarks>
-		public int Port
-		{
-			get { return m_port; }
-			set { m_port = value; }
-		}
+    /// <summary>
+    /// The password to use to authenticate with the SMTP server
+    /// </summary>
+    /// <remarks>
+    /// <note type="caution">Authentication is only available on the MS .NET 1.1 runtime.</note>
+    /// <para>
+    /// A <see cref="Username"/> and <see cref="Password"/> must be specified when 
+    /// <see cref="Authentication"/> is set to <see cref="SmtpAuthentication.Basic"/>, 
+    /// otherwise the password will be ignored. 
+    /// </para>
+    /// </remarks>
+    public string Password
+    {
+      get { return m_password; }
+      set { m_password = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the priority of the e-mail message
-		/// </summary>
-		/// <value>
-		/// One of the <see cref="MailPriority"/> values.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Sets the priority of the e-mails generated by this
-		/// appender. The default priority is <see cref="MailPriority.Normal"/>.
-		/// </para>
-		/// <para>
-		/// If you are using this appender to report errors then
-		/// you may want to set the priority to <see cref="MailPriority.High"/>.
-		/// </para>
-		/// </remarks>
-		public MailPriority Priority
-		{
-			get { return m_mailPriority; }
-			set { m_mailPriority = value; }
-		}
+    /// <summary>
+    /// The port on which the SMTP server is listening
+    /// </summary>
+    /// <remarks>
+    /// <note type="caution">Server Port is only available on the MS .NET 1.1 runtime.</note>
+    /// <para>
+    /// The port on which the SMTP server is listening. The default
+    /// port is <c>25</c>. The Port can only be changed when running on
+    /// the MS .NET 1.1 runtime.
+    /// </para>
+    /// </remarks>
+    public int Port
+    {
+      get { return m_port; }
+      set { m_port = value; }
+    }
+
+    /// <summary>
+    /// Gets or sets the priority of the e-mail message
+    /// </summary>
+    /// <value>
+    /// One of the <see cref="MailPriority"/> values.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Sets the priority of the e-mails generated by this
+    /// appender. The default priority is <see cref="MailPriority.Normal"/>.
+    /// </para>
+    /// <para>
+    /// If you are using this appender to report errors then
+    /// you may want to set the priority to <see cref="MailPriority.High"/>.
+    /// </para>
+    /// </remarks>
+    public MailPriority Priority
+    {
+      get { return m_mailPriority; }
+      set { m_mailPriority = value; }
+    }
 
 #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0
-		/// <summary>
-		/// Enable or disable use of SSL when sending e-mail message
-		/// </summary>
-		/// <remarks>
-		/// This is available on MS .NET 2.0 runtime and higher
-		/// </remarks>
-		public bool EnableSsl
-		{
-			get { return m_enableSsl; }
-			set { m_enableSsl = value; }
-		}
+    /// <summary>
+    /// Enable or disable use of SSL when sending e-mail message
+    /// </summary>
+    /// <remarks>
+    /// This is available on MS .NET 2.0 runtime and higher
+    /// </remarks>
+    public bool EnableSsl
+    {
+      get { return m_enableSsl; }
+      set { m_enableSsl = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the reply-to e-mail address.
-		/// </summary>
-		/// <remarks>
-		/// This is available on MS .NET 2.0 runtime and higher
-		/// </remarks>
-		public string ReplyTo
-		{
-			get { return m_replyTo; }
-			set { m_replyTo = value; }
-		}
+    /// <summary>
+    /// Gets or sets the reply-to e-mail address.
+    /// </summary>
+    /// <remarks>
+    /// This is available on MS .NET 2.0 runtime and higher
+    /// </remarks>
+    public string ReplyTo
+    {
+      get { return m_replyTo; }
+      set { m_replyTo = value; }
+    }
 #endif
 
-		/// <summary>
-		/// Gets or sets the subject encoding to be used.
-		/// </summary>
-		/// <remarks>
-		/// The default encoding is the operating system's current ANSI codepage.
-		/// </remarks>
-		public Encoding SubjectEncoding
-		{
-			get { return m_subjectEncoding; }
-			set { m_subjectEncoding = value; }
-		}
+    /// <summary>
+    /// Gets or sets the subject encoding to be used.
+    /// </summary>
+    /// <remarks>
+    /// The default encoding is the operating system's current ANSI codepage.
+    /// </remarks>
+    public Encoding SubjectEncoding
+    {
+      get { return m_subjectEncoding; }
+      set { m_subjectEncoding = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the body encoding to be used.
-		/// </summary>
-		/// <remarks>
-		/// The default encoding is the operating system's current ANSI codepage.
-		/// </remarks>
-		public Encoding BodyEncoding
-		{
-			get { return m_bodyEncoding; }
-			set { m_bodyEncoding = value; }
-		}
+    /// <summary>
+    /// Gets or sets the body encoding to be used.
+    /// </summary>
+    /// <remarks>
+    /// The default encoding is the operating system's current ANSI codepage.
+    /// </remarks>
+    public Encoding BodyEncoding
+    {
+      get { return m_bodyEncoding; }
+      set { m_bodyEncoding = value; }
+    }
 
-		#endregion // Public Instance Properties
+    #endregion // Public Instance Properties
 
-		#region Override implementation of BufferingAppenderSkeleton
+    #region Override implementation of BufferingAppenderSkeleton
 
-		/// <summary>
-		/// Sends the contents of the cyclic buffer as an e-mail message.
-		/// </summary>
-		/// <param name="events">The logging events to send.</param>
-		protected override void SendBuffer(LoggingEvent[] events) 
-		{
-			// Note: this code already owns the monitor for this
-			// appender. This frees us from needing to synchronize again.
-			try 
-			{	  
-				using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
+    /// <summary>
+    /// Sends the contents of the cyclic buffer as an e-mail message.
+    /// </summary>
+    /// <param name="events">The logging events to send.</param>
+    protected override void SendBuffer(LoggingEvent[] events)
+    {
+      // Note: this code already owns the monitor for this
+      // appender. This frees us from needing to synchronize again.
+      try
+      {
+        using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
 
-				string t = Layout.Header;
-				if (t != null)
-				{
-					writer.Write(t);
-				}
+        string t = Layout.Header;
+        if (t != null)
+        {
+          writer.Write(t);
+        }
 
-				for(int i = 0; i < events.Length; i++) 
-				{
-					// Render the event and append the text to the buffer
-					RenderLoggingEvent(writer, events[i]);
-				}
+        for (int i = 0; i < events.Length; i++)
+        {
+          // Render the event and append the text to the buffer
+          RenderLoggingEvent(writer, events[i]);
+        }
 
-				t = Layout.Footer;
-				if (t != null)
-				{
-					writer.Write(t);
-				}
+        t = Layout.Footer;
+        if (t != null)
+        {
+          writer.Write(t);
+        }
 
-				SendEmail(writer.ToString());
-			} 
-			catch(Exception e) 
-			{
-				ErrorHandler.Error("Error occurred while sending e-mail notification.", e);
-			}
-		}
+        SendEmail(writer.ToString());
+      }
+      catch (Exception e)
+      {
+        ErrorHandler.Error("Error occurred while sending e-mail notification.", e);
+      }
+    }
 
-		#endregion // Override implementation of BufferingAppenderSkeleton
+    #endregion // Override implementation of BufferingAppenderSkeleton
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion // Override implementation of AppenderSkeleton
+    #endregion // Override implementation of AppenderSkeleton
 
-		#region Protected Methods
+    #region Protected Methods
 
-		/// <summary>
-		/// Send the email message
-		/// </summary>
-		/// <param name="messageBody">the body text to include in the mail</param>
-		protected virtual void SendEmail(string messageBody)
-		{
+    /// <summary>
+    /// Send the email message
+    /// </summary>
+    /// <param name="messageBody">the body text to include in the mail</param>
+    protected virtual void SendEmail(string messageBody)
+    {
 #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0
-			// .NET 2.0 has a new API for SMTP email System.Net.Mail
-			// This API supports credentials and multiple hosts correctly.
-			// The old API is deprecated.
+      // .NET 2.0 has a new API for SMTP email System.Net.Mail
+      // This API supports credentials and multiple hosts correctly.
+      // The old API is deprecated.
 
-			// Create and configure the smtp client
+      // Create and configure the smtp client
 #if NET_4_0 || MONO_4_0 || NETSTANDARD2_0
-			using SmtpClient smtpClient = new SmtpClient();
+      using SmtpClient smtpClient = new SmtpClient();
 #else
-			SmtpClient smtpClient = new SmtpClient();
+      SmtpClient smtpClient = new SmtpClient();
 #endif
-			if (!String.IsNullOrEmpty(m_smtpHost))
-			{
-				smtpClient.Host = m_smtpHost;
-			}
-			smtpClient.Port = m_port;
-			smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
-			smtpClient.EnableSsl = m_enableSsl;
+      if (!String.IsNullOrEmpty(m_smtpHost))
+      {
+        smtpClient.Host = m_smtpHost;
+      }
+      smtpClient.Port = m_port;
+      smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
+      smtpClient.EnableSsl = m_enableSsl;
 
-			if (m_authentication == SmtpAuthentication.Basic)
-			{
-				// Perform basic authentication
-				smtpClient.Credentials = new System.Net.NetworkCredential(m_username, m_password);
-			}
-			else if (m_authentication == SmtpAuthentication.Ntlm)
-			{
-				// Perform integrated authentication (NTLM)
-				smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
-			}
+      if (m_authentication == SmtpAuthentication.Basic)
+      {
+        // Perform basic authentication
+        smtpClient.Credentials = new System.Net.NetworkCredential(m_username, m_password);
+      }
+      else if (m_authentication == SmtpAuthentication.Ntlm)
+      {
+        // Perform integrated authentication (NTLM)
+        smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
+      }
 
-			using (MailMessage mailMessage = new MailMessage())
-			{
-				mailMessage.Body = messageBody;
-				mailMessage.BodyEncoding = m_bodyEncoding;
-				mailMessage.From = new MailAddress(m_from);
-				mailMessage.To.Add(m_to);
-				if (!String.IsNullOrEmpty(m_cc))
-				{
-					mailMessage.CC.Add(m_cc);
-				}
-				if (!String.IsNullOrEmpty(m_bcc))
-				{
-					mailMessage.Bcc.Add(m_bcc);
-				}
-				if (!String.IsNullOrEmpty(m_replyTo))
-				{
-					// .NET 4.0 warning CS0618: 'System.Net.Mail.MailMessage.ReplyTo' is obsolete:
-					// 'ReplyTo is obsoleted for this type.  Please use ReplyToList instead which can accept multiple addresses. http://go.microsoft.com/fwlink/?linkid=14202'
+      using (MailMessage mailMessage = new MailMessage())
+      {
+        mailMessage.Body = messageBody;
+        mailMessage.BodyEncoding = m_bodyEncoding;
+        mailMessage.From = new MailAddress(m_from);
+        mailMessage.To.Add(m_to);
+        if (!String.IsNullOrEmpty(m_cc))
+        {
+          mailMessage.CC.Add(m_cc);
+        }
+        if (!String.IsNullOrEmpty(m_bcc))
+        {
+          mailMessage.Bcc.Add(m_bcc);
+        }
+        if (!String.IsNullOrEmpty(m_replyTo))
+        {
+          // .NET 4.0 warning CS0618: 'System.Net.Mail.MailMessage.ReplyTo' is obsolete:
+          // 'ReplyTo is obsoleted for this type.  Please use ReplyToList instead which can accept multiple addresses. http://go.microsoft.com/fwlink/?linkid=14202'
 #if !NET_4_0 && !MONO_4_0 && !NETSTANDARD2_0
-					mailMessage.ReplyTo = new MailAddress(m_replyTo);
+          mailMessage.ReplyTo = new MailAddress(m_replyTo);
 #else
-					mailMessage.ReplyToList.Add(new MailAddress(m_replyTo));
+          mailMessage.ReplyToList.Add(new MailAddress(m_replyTo));
 #endif
-				}
-				mailMessage.Subject = m_subject;
-				mailMessage.SubjectEncoding = m_subjectEncoding;
-				mailMessage.Priority = m_mailPriority;
+        }
+        mailMessage.Subject = m_subject;
+        mailMessage.SubjectEncoding = m_subjectEncoding;
+        mailMessage.Priority = m_mailPriority;
 
-				// TODO: Consider using SendAsync to send the message without blocking. This would be a change in
-				// behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors.
-				smtpClient.Send(mailMessage);
-			}
+        // TODO: Consider using SendAsync to send the message without blocking. This would be a change in
+        // behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors.
+        smtpClient.Send(mailMessage);
+      }
 #else
-				// .NET 1.x uses the System.Web.Mail API for sending Mail
+        // .NET 1.x uses the System.Web.Mail API for sending Mail
 
-				MailMessage mailMessage = new MailMessage();
-				mailMessage.Body = messageBody;
-				mailMessage.BodyEncoding = m_bodyEncoding;
-				mailMessage.From = m_from;
-				mailMessage.To = m_to;
-				if (m_cc != null && m_cc.Length > 0)
-				{
-					mailMessage.Cc = m_cc;
-				}
-				if (m_bcc != null && m_bcc.Length > 0)
-				{
-					mailMessage.Bcc = m_bcc;
-				}
-				mailMessage.Subject = m_subject;
+        MailMessage mailMessage = new MailMessage();
+        mailMessage.Body = messageBody;
+        mailMessage.BodyEncoding = m_bodyEncoding;
+        mailMessage.From = m_from;
+        mailMessage.To = m_to;
+        if (m_cc != null && m_cc.Length > 0)
+        {
+          mailMessage.Cc = m_cc;
+        }
+        if (m_bcc != null && m_bcc.Length > 0)
+        {
+          mailMessage.Bcc = m_bcc;
+        }
+        mailMessage.Subject = m_subject;
 #if !MONO && !NET_1_0 && !NET_1_1 && !CLI_1_0
-				mailMessage.SubjectEncoding = m_subjectEncoding;
+        mailMessage.SubjectEncoding = m_subjectEncoding;
 #endif
-				mailMessage.Priority = m_mailPriority;
+        mailMessage.Priority = m_mailPriority;
 
 #if NET_1_1
-				// The Fields property on the MailMessage allows the CDO properties to be set directly.
-				// This property is only available on .NET Framework 1.1 and the implementation must understand
-				// the CDO properties. For details of the fields available in CDO see:
-				//
-				// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_configuration_coclass.asp
-				// 
+        // The Fields property on the MailMessage allows the CDO properties to be set directly.
+        // This property is only available on .NET Framework 1.1 and the implementation must understand
+        // the CDO properties. For details of the fields available in CDO see:
+        //
+        // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_configuration_coclass.asp
+        // 
 
-				try
-				{
-					if (m_authentication == SmtpAuthentication.Basic)
-					{
-						// Perform basic authentication
-						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1);
-						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", m_username);
-						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", m_password);
-					}
-					else if (m_authentication == SmtpAuthentication.Ntlm)
-					{
-						// Perform integrated authentication (NTLM)
-						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 2);
-					}
+        try
+        {
+          if (m_authentication == SmtpAuthentication.Basic)
+          {
+            // Perform basic authentication
+            mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1);
+            mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", m_username);
+            mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", m_password);
+          }
+          else if (m_authentication == SmtpAuthentication.Ntlm)
+          {
+            // Perform integrated authentication (NTLM)
+            mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 2);
+          }
 
-					// Set the port if not the default value
-					if (m_port != 25) 
-					{
-						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", m_port);
-					}
-				}
-				catch(MissingMethodException missingMethodException)
-				{
-					// If we were compiled against .NET 1.1 but are running against .NET 1.0 then
-					// we will get a MissingMethodException when accessing the MailMessage.Fields property.
+          // Set the port if not the default value
+          if (m_port != 25) 
+          {
+            mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", m_port);
+          }
+        }
+        catch(MissingMethodException missingMethodException)
+        {
+          // If we were compiled against .NET 1.1 but are running against .NET 1.0 then
+          // we will get a MissingMethodException when accessing the MailMessage.Fields property.
 
-					ErrorHandler.Error("SmtpAppender: Authentication and server Port are only supported when running on the MS .NET 1.1 framework", missingMethodException);
-				}
+          ErrorHandler.Error("SmtpAppender: Authentication and server Port are only supported when running on the MS .NET 1.1 framework", missingMethodException);
+        }
 #else
-				if (m_authentication != SmtpAuthentication.None)
-				{
-					ErrorHandler.Error("SmtpAppender: Authentication is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net");
-				}
+        if (m_authentication != SmtpAuthentication.None)
+        {
+          ErrorHandler.Error("SmtpAppender: Authentication is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net");
+        }
 
-				if (m_port != 25)
-				{
-					ErrorHandler.Error("SmtpAppender: Server Port is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net");
-				}
+        if (m_port != 25)
+        {
+          ErrorHandler.Error("SmtpAppender: Server Port is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net");
+        }
 #endif // if NET_1_1
 
-				if (m_smtpHost != null && m_smtpHost.Length > 0)
-				{
-					SmtpMail.SmtpServer = m_smtpHost;
-				}
+        if (m_smtpHost != null && m_smtpHost.Length > 0)
+        {
+          SmtpMail.SmtpServer = m_smtpHost;
+        }
 
-				SmtpMail.Send(mailMessage);
+        SmtpMail.Send(mailMessage);
 #endif // if NET_2_0
-		}
+    }
 
-		#endregion // Protected Methods
+    #endregion // Protected Methods
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private string m_to;
-		private string m_cc;
-		private string m_bcc;
-		private string m_from;
-		private string m_subject;
-		private string m_smtpHost;
-		private Encoding m_subjectEncoding = Encoding.UTF8;
-		private Encoding m_bodyEncoding = Encoding.UTF8;
+    private string m_to;
+    private string m_cc;
+    private string m_bcc;
+    private string m_from;
+    private string m_subject;
+    private string m_smtpHost;
+    private Encoding m_subjectEncoding = Encoding.UTF8;
+    private Encoding m_bodyEncoding = Encoding.UTF8;
 
-		// authentication fields
-		private SmtpAuthentication m_authentication = SmtpAuthentication.None;
-		private string m_username;
-		private string m_password;
+    // authentication fields
+    private SmtpAuthentication m_authentication = SmtpAuthentication.None;
+    private string m_username;
+    private string m_password;
 
-		// server port, default port 25
-		private int m_port = 25;
+    // server port, default port 25
+    private int m_port = 25;
 
-		private MailPriority m_mailPriority = MailPriority.Normal;
+    private MailPriority m_mailPriority = MailPriority.Normal;
 
 #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0
-		private bool m_enableSsl = false;
-		private string m_replyTo;
+    private bool m_enableSsl = false;
+    private string m_replyTo;
 #endif
 
-		#endregion // Private Instance Fields
+    #endregion // Private Instance Fields
 
-		#region SmtpAuthentication Enum
+    #region SmtpAuthentication Enum
 
-		/// <summary>
-		/// Values for the <see cref="SmtpAppender.Authentication"/> property.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// SMTP authentication modes.
-		/// </para>
-		/// </remarks>
-		public enum SmtpAuthentication
-		{
-			/// <summary>
-			/// No authentication
-			/// </summary>
-			None,
+    /// <summary>
+    /// Values for the <see cref="SmtpAppender.Authentication"/> property.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// SMTP authentication modes.
+    /// </para>
+    /// </remarks>
+    public enum SmtpAuthentication
+    {
+      /// <summary>
+      /// No authentication
+      /// </summary>
+      None,
 
-			/// <summary>
-			/// Basic authentication.
-			/// </summary>
-			/// <remarks>
-			/// Requires a username and password to be supplied
-			/// </remarks>
-			Basic,
+      /// <summary>
+      /// Basic authentication.
+      /// </summary>
+      /// <remarks>
+      /// Requires a username and password to be supplied
+      /// </remarks>
+      Basic,
 
-			/// <summary>
-			/// Integrated authentication
-			/// </summary>
-			/// <remarks>
-			/// Uses the Windows credentials from the current thread or process to authenticate.
-			/// </remarks>
-			Ntlm
-		}
+      /// <summary>
+      /// Integrated authentication
+      /// </summary>
+      /// <remarks>
+      /// Uses the Windows credentials from the current thread or process to authenticate.
+      /// </remarks>
+      Ntlm
+    }
 
-		#endregion // SmtpAuthentication Enum
+    #endregion // SmtpAuthentication Enum
 
-			private static readonly char[] ADDRESS_DELIMITERS = new char[] { ',', ';' };
-			
-			/// <summary>
-			///   trims leading and trailing commas or semicolons
-			/// </summary>
-			private static string MaybeTrimSeparators(string s) {
+    private static readonly char[] ADDRESS_DELIMITERS = new char[] { ',', ';' };
+
+    /// <summary>
+    ///   trims leading and trailing commas or semicolons
+    /// </summary>
+    private static string MaybeTrimSeparators(string s)
+    {
 #if NET_2_0 || MONO_2_0 || NETSTANDARD2_0
-				return string.IsNullOrEmpty(s) ? s : s.Trim(ADDRESS_DELIMITERS);
+      return string.IsNullOrEmpty(s) ? s : s.Trim(ADDRESS_DELIMITERS);
 #else
-				return s != null && s.Length > 0 ? s : s.Trim(ADDRESS_DELIMITERS);
+        return s != null && s.Length > 0 ? s : s.Trim(ADDRESS_DELIMITERS);
 #endif
-			}
-		}
+    }
+  }
 }
 
 #endif // !NETCF && !SSCLI
diff --git a/src/log4net/Appender/SmtpPickupDirAppender.cs b/src/log4net/Appender/SmtpPickupDirAppender.cs
index 17a6af4..8a0fab0 100644
--- a/src/log4net/Appender/SmtpPickupDirAppender.cs
+++ b/src/log4net/Appender/SmtpPickupDirAppender.cs
@@ -25,327 +25,327 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Send an email when a specific logging event occurs, typically on errors 
-	/// or fatal errors. Rather than sending via smtp it writes a file into the
-	/// directory specified by <see cref="PickupDir"/>. This allows services such
-	/// as the IIS SMTP agent to manage sending the messages.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The configuration for this appender is identical to that of the <c>SMTPAppender</c>,
-	/// except that instead of specifying the <c>SMTPAppender.SMTPHost</c> you specify
-	/// <see cref="PickupDir"/>.
-	/// </para>
-	/// <para>
-	/// The number of logging events delivered in this e-mail depend on
-	/// the value of <see cref="BufferingAppenderSkeleton.BufferSize"/> option. The
-	/// <see cref="SmtpPickupDirAppender"/> keeps only the last
-	/// <see cref="BufferingAppenderSkeleton.BufferSize"/> logging events in its 
-	/// cyclic buffer. This keeps memory requirements at a reasonable level while 
-	/// still delivering useful application context.
-	/// </para>
-	/// </remarks>
-	/// <author>Niall Daley</author>
-	/// <author>Nicko Cadell</author>
-	public class SmtpPickupDirAppender : BufferingAppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Send an email when a specific logging event occurs, typically on errors 
+  /// or fatal errors. Rather than sending via smtp it writes a file into the
+  /// directory specified by <see cref="PickupDir"/>. This allows services such
+  /// as the IIS SMTP agent to manage sending the messages.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The configuration for this appender is identical to that of the <c>SMTPAppender</c>,
+  /// except that instead of specifying the <c>SMTPAppender.SMTPHost</c> you specify
+  /// <see cref="PickupDir"/>.
+  /// </para>
+  /// <para>
+  /// The number of logging events delivered in this e-mail depend on
+  /// the value of <see cref="BufferingAppenderSkeleton.BufferSize"/> option. The
+  /// <see cref="SmtpPickupDirAppender"/> keeps only the last
+  /// <see cref="BufferingAppenderSkeleton.BufferSize"/> logging events in its 
+  /// cyclic buffer. This keeps memory requirements at a reasonable level while 
+  /// still delivering useful application context.
+  /// </para>
+  /// </remarks>
+  /// <author>Niall Daley</author>
+  /// <author>Nicko Cadell</author>
+  public class SmtpPickupDirAppender : BufferingAppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public SmtpPickupDirAppender()
-		{
-			m_fileExtension = string.Empty; // Default to empty string, not null
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public SmtpPickupDirAppender()
+    {
+      m_fileExtension = string.Empty; // Default to empty string, not null
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets a semicolon-delimited list of recipient e-mail addresses.
-		/// </summary>
-		/// <value>
-		/// A semicolon-delimited list of e-mail addresses.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// A semicolon-delimited list of e-mail addresses.
-		/// </para>
-		/// </remarks>
-		public string To 
-		{
-			get { return m_to; }
-			set { m_to = value; }
-		}
+    /// <summary>
+    /// Gets or sets a semicolon-delimited list of recipient e-mail addresses.
+    /// </summary>
+    /// <value>
+    /// A semicolon-delimited list of e-mail addresses.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// A semicolon-delimited list of e-mail addresses.
+    /// </para>
+    /// </remarks>
+    public string To
+    {
+      get { return m_to; }
+      set { m_to = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the e-mail address of the sender.
-		/// </summary>
-		/// <value>
-		/// The e-mail address of the sender.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The e-mail address of the sender.
-		/// </para>
-		/// </remarks>
-		public string From 
-		{
-			get { return m_from; }
-			set { m_from = value; }
-		}
+    /// <summary>
+    /// Gets or sets the e-mail address of the sender.
+    /// </summary>
+    /// <value>
+    /// The e-mail address of the sender.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The e-mail address of the sender.
+    /// </para>
+    /// </remarks>
+    public string From
+    {
+      get { return m_from; }
+      set { m_from = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the subject line of the e-mail message.
-		/// </summary>
-		/// <value>
-		/// The subject line of the e-mail message.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The subject line of the e-mail message.
-		/// </para>
-		/// </remarks>
-		public string Subject 
-		{
-			get { return m_subject; }
-			set { m_subject = value; }
-		}
-  
-		/// <summary>
-		/// Gets or sets the path to write the messages to.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the path to write the messages to. This should be the same
-		/// as that used by the agent sending the messages.
-		/// </para>
-		/// </remarks>
-		public string PickupDir
-		{
-			get { return m_pickupDir; }
-			set { m_pickupDir = value; }
-		}
+    /// <summary>
+    /// Gets or sets the subject line of the e-mail message.
+    /// </summary>
+    /// <value>
+    /// The subject line of the e-mail message.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The subject line of the e-mail message.
+    /// </para>
+    /// </remarks>
+    public string Subject
+    {
+      get { return m_subject; }
+      set { m_subject = value; }
+    }
 
- 		/// <summary>
-		/// Gets or sets the file extension for the generated files
-		/// </summary>
-		/// <value>
-		/// The file extension for the generated files
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The file extension for the generated files
-		/// </para>
-		/// </remarks>
-		public string FileExtension
-		{
-			get { return m_fileExtension; }
-			set
-			{
-				m_fileExtension = value;
-				if (m_fileExtension == null)
-				{
-					m_fileExtension = string.Empty;
-				}
-				// Make sure any non empty extension starts with a dot
+    /// <summary>
+    /// Gets or sets the path to write the messages to.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the path to write the messages to. This should be the same
+    /// as that used by the agent sending the messages.
+    /// </para>
+    /// </remarks>
+    public string PickupDir
+    {
+      get { return m_pickupDir; }
+      set { m_pickupDir = value; }
+    }
+
+    /// <summary>
+    /// Gets or sets the file extension for the generated files
+    /// </summary>
+    /// <value>
+    /// The file extension for the generated files
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The file extension for the generated files
+    /// </para>
+    /// </remarks>
+    public string FileExtension
+    {
+      get { return m_fileExtension; }
+      set
+      {
+        m_fileExtension = value;
+        if (m_fileExtension == null)
+        {
+          m_fileExtension = string.Empty;
+        }
+        // Make sure any non empty extension starts with a dot
 #if NET_2_0 || MONO_2_0 || NETSTANDARD
-				if (!string.IsNullOrEmpty(m_fileExtension) && !m_fileExtension.StartsWith("."))
+        if (!string.IsNullOrEmpty(m_fileExtension) && !m_fileExtension.StartsWith("."))
 #else
-				if (m_fileExtension != null && m_fileExtension.Length > 0 && !m_fileExtension.StartsWith("."))
+        if (m_fileExtension != null && m_fileExtension.Length > 0 && !m_fileExtension.StartsWith("."))
 #endif
-				{
-					m_fileExtension = "." + m_fileExtension;
-				}
-			}
-		}
+        {
+          m_fileExtension = "." + m_fileExtension;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="SecurityContext"/> used to write to the pickup directory.
-		/// </summary>
-		/// <value>
-		/// The <see cref="SecurityContext"/> used to write to the pickup directory.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Unless a <see cref="SecurityContext"/> specified here for this appender
-		/// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
-		/// security context to use. The default behavior is to use the security context
-		/// of the current thread.
-		/// </para>
-		/// </remarks>
-		public SecurityContext SecurityContext 
-		{
-			get { return m_securityContext; }
-			set { m_securityContext = value; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="SecurityContext"/> used to write to the pickup directory.
+    /// </summary>
+    /// <value>
+    /// The <see cref="SecurityContext"/> used to write to the pickup directory.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Unless a <see cref="SecurityContext"/> specified here for this appender
+    /// the <see cref="SecurityContextProvider.DefaultProvider"/> is queried for the
+    /// security context to use. The default behavior is to use the security context
+    /// of the current thread.
+    /// </para>
+    /// </remarks>
+    public SecurityContext SecurityContext
+    {
+      get { return m_securityContext; }
+      set { m_securityContext = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override implementation of BufferingAppenderSkeleton
+    #region Override implementation of BufferingAppenderSkeleton
 
-		/// <summary>
-		/// Sends the contents of the cyclic buffer as an e-mail message.
-		/// </summary>
-		/// <param name="events">The logging events to send.</param>
-		/// <remarks>
-		/// <para>
-		/// Sends the contents of the cyclic buffer as an e-mail message.
-		/// </para>
-		/// </remarks>
-		protected override void SendBuffer(LoggingEvent[] events) 
-		{
-			// Note: this code already owns the monitor for this
-			// appender. This frees us from needing to synchronize again.
-			try 
-			{
-				string filePath = null;
-				StreamWriter writer = null;
+    /// <summary>
+    /// Sends the contents of the cyclic buffer as an e-mail message.
+    /// </summary>
+    /// <param name="events">The logging events to send.</param>
+    /// <remarks>
+    /// <para>
+    /// Sends the contents of the cyclic buffer as an e-mail message.
+    /// </para>
+    /// </remarks>
+    protected override void SendBuffer(LoggingEvent[] events)
+    {
+      // Note: this code already owns the monitor for this
+      // appender. This frees us from needing to synchronize again.
+      try
+      {
+        string filePath = null;
+        StreamWriter writer = null;
 
-				// Impersonate to open the file
-				using(SecurityContext.Impersonate(this))
-				{
-					filePath = Path.Combine(m_pickupDir, SystemInfo.NewGuid().ToString("N") + m_fileExtension);
-					writer = File.CreateText(filePath);
-				}
+        // Impersonate to open the file
+        using (SecurityContext.Impersonate(this))
+        {
+          filePath = Path.Combine(m_pickupDir, SystemInfo.NewGuid().ToString("N") + m_fileExtension);
+          writer = File.CreateText(filePath);
+        }
 
-				if (writer == null)
-				{
-					ErrorHandler.Error("Failed to create output file for writing ["+filePath+"]", null, ErrorCode.FileOpenFailure);
-				}
-				else
-				{
-					using(writer)
-					{
-						writer.WriteLine("To: " + m_to);
-						writer.WriteLine("From: " + m_from);
-						writer.WriteLine("Subject: " + m_subject);
-						writer.WriteLine("Date: " + DateTime.UtcNow.ToString("r"));
-						writer.WriteLine("");
+        if (writer == null)
+        {
+          ErrorHandler.Error("Failed to create output file for writing [" + filePath + "]", null, ErrorCode.FileOpenFailure);
+        }
+        else
+        {
+          using (writer)
+          {
+            writer.WriteLine("To: " + m_to);
+            writer.WriteLine("From: " + m_from);
+            writer.WriteLine("Subject: " + m_subject);
+            writer.WriteLine("Date: " + DateTime.UtcNow.ToString("r"));
+            writer.WriteLine("");
 
-						string t = Layout.Header;
-						if (t != null)
-						{
-							writer.Write(t);
-						}
+            string t = Layout.Header;
+            if (t != null)
+            {
+              writer.Write(t);
+            }
 
-						for(int i = 0; i < events.Length; i++) 
-						{
-							// Render the event and append the text to the buffer
-							RenderLoggingEvent(writer, events[i]);
-						}
+            for (int i = 0; i < events.Length; i++)
+            {
+              // Render the event and append the text to the buffer
+              RenderLoggingEvent(writer, events[i]);
+            }
 
-						t = Layout.Footer;
-						if (t != null)
-						{
-							writer.Write(t);
-						}
+            t = Layout.Footer;
+            if (t != null)
+            {
+              writer.Write(t);
+            }
 
-						writer.WriteLine("");
-						writer.WriteLine(".");
-					}
-				}
-			} 
-			catch(Exception e) 
-			{
-				ErrorHandler.Error("Error occurred while sending e-mail notification.", e);
-			}
-		}
+            writer.WriteLine("");
+            writer.WriteLine(".");
+          }
+        }
+      }
+      catch (Exception e)
+      {
+        ErrorHandler.Error("Error occurred while sending e-mail notification.", e);
+      }
+    }
 
-		#endregion Override implementation of BufferingAppenderSkeleton
+    #endregion Override implementation of BufferingAppenderSkeleton
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Activate the options on this appender. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{	
-			base.ActivateOptions();
+    /// <summary>
+    /// Activate the options on this appender. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-			if (m_securityContext == null)
-			{
-				m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
-			}
+      if (m_securityContext == null)
+      {
+        m_securityContext = SecurityContextProvider.DefaultProvider.CreateSecurityContext(this);
+      }
 
-			using(SecurityContext.Impersonate(this))
-			{
-				m_pickupDir = ConvertToFullPath(m_pickupDir.Trim());
-			}
-		}
+      using (SecurityContext.Impersonate(this))
+      {
+        m_pickupDir = ConvertToFullPath(m_pickupDir.Trim());
+      }
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Protected Static Methods
+    #region Protected Static Methods
 
-		/// <summary>
-		/// Convert a path into a fully qualified path.
-		/// </summary>
-		/// <param name="path">The path to convert.</param>
-		/// <returns>The fully qualified path.</returns>
-		/// <remarks>
-		/// <para>
-		/// Converts the path specified to a fully
-		/// qualified path. If the path is relative it is
-		/// taken as relative from the application base 
-		/// directory.
-		/// </para>
-		/// </remarks>
-		protected static string ConvertToFullPath(string path)
-		{
-			return SystemInfo.ConvertToFullPath(path);
-		}
+    /// <summary>
+    /// Convert a path into a fully qualified path.
+    /// </summary>
+    /// <param name="path">The path to convert.</param>
+    /// <returns>The fully qualified path.</returns>
+    /// <remarks>
+    /// <para>
+    /// Converts the path specified to a fully
+    /// qualified path. If the path is relative it is
+    /// taken as relative from the application base 
+    /// directory.
+    /// </para>
+    /// </remarks>
+    protected static string ConvertToFullPath(string path)
+    {
+      return SystemInfo.ConvertToFullPath(path);
+    }
 
-		#endregion Protected Static Methods
+    #endregion Protected Static Methods
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private string m_to;
-		private string m_from;
-		private string m_subject;
-		private string m_pickupDir;
-		private string m_fileExtension;
+    private string m_to;
+    private string m_from;
+    private string m_subject;
+    private string m_pickupDir;
+    private string m_fileExtension;
 
-		/// <summary>
-		/// The security context to use for privileged calls
-		/// </summary>
-		private SecurityContext m_securityContext;
+    /// <summary>
+    /// The security context to use for privileged calls
+    /// </summary>
+    private SecurityContext m_securityContext;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Appender/TelnetAppender.cs b/src/log4net/Appender/TelnetAppender.cs
index 0d61a00..b0e2130 100644
--- a/src/log4net/Appender/TelnetAppender.cs
+++ b/src/log4net/Appender/TelnetAppender.cs
@@ -30,513 +30,513 @@
 using log4net.Core;
 using log4net.Util;
 
-namespace log4net.Appender 
+namespace log4net.Appender
 {
-	/// <summary>
-	/// Appender that allows clients to connect via Telnet to receive log messages
-	/// </summary>
-	/// <remarks>	
-	/// <para>
-	/// The TelnetAppender accepts socket connections and streams logging messages
-	/// back to the client.  
-	/// The output is provided in a telnet-friendly way so that a log can be monitored 
-	/// over a TCP/IP socket.
-	/// This allows simple remote monitoring of application logging.
-	/// </para>
-	/// <para>
-	/// The default <see cref="Port"/> is 23 (the telnet port).
-	/// </para>
-	/// </remarks>
-	/// <author>Keith Long</author>
-	/// <author>Nicko Cadell</author>
-	public class TelnetAppender : AppenderSkeleton 
-	{
-		private SocketHandler m_handler;
-		private int m_listeningPort = 23;
+  /// <summary>
+  /// Appender that allows clients to connect via Telnet to receive log messages
+  /// </summary>
+  /// <remarks>  
+  /// <para>
+  /// The TelnetAppender accepts socket connections and streams logging messages
+  /// back to the client.  
+  /// The output is provided in a telnet-friendly way so that a log can be monitored 
+  /// over a TCP/IP socket.
+  /// This allows simple remote monitoring of application logging.
+  /// </para>
+  /// <para>
+  /// The default <see cref="Port"/> is 23 (the telnet port).
+  /// </para>
+  /// </remarks>
+  /// <author>Keith Long</author>
+  /// <author>Nicko Cadell</author>
+  public class TelnetAppender : AppenderSkeleton
+  {
+    private SocketHandler m_handler;
+    private int m_listeningPort = 23;
 
-		#region Constructor
+    #region Constructor
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public TelnetAppender()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public TelnetAppender()
+    {
+    }
 
-		#endregion
+    #endregion
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the TelnetAppender class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(TelnetAppender);
+    /// <summary>
+    /// The fully qualified type of the TelnetAppender class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(TelnetAppender);
 
-	    #endregion Private Static Fields
+    #endregion Private Static Fields
 
-		/// <summary>
-		/// Gets or sets the TCP port number on which this <see cref="TelnetAppender"/> will listen for connections.
-		/// </summary>
-		/// <value>
-		/// An integer value in the range <see cref="IPEndPoint.MinPort" /> to <see cref="IPEndPoint.MaxPort" /> 
-		/// indicating the TCP port number on which this <see cref="TelnetAppender"/> will listen for connections.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The default value is 23 (the telnet port).
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentOutOfRangeException">The value specified is less than <see cref="IPEndPoint.MinPort" /> 
-		/// or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
-		public int Port
-		{
-			get
-			{
-				return m_listeningPort;
-			}
-			set
-			{
-				if (value < IPEndPoint.MinPort || value > IPEndPoint.MaxPort)
-				{
-					throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("value", (object)value,
-						"The value specified for Port is less than " + 
-						IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) + 
-						" or greater than " + 
-						IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
-				}
-				else
-				{
-					m_listeningPort = value;
-				}
-			}
-		}
+    /// <summary>
+    /// Gets or sets the TCP port number on which this <see cref="TelnetAppender"/> will listen for connections.
+    /// </summary>
+    /// <value>
+    /// An integer value in the range <see cref="IPEndPoint.MinPort" /> to <see cref="IPEndPoint.MaxPort" /> 
+    /// indicating the TCP port number on which this <see cref="TelnetAppender"/> will listen for connections.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The default value is 23 (the telnet port).
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentOutOfRangeException">The value specified is less than <see cref="IPEndPoint.MinPort" /> 
+    /// or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
+    public int Port
+    {
+      get
+      {
+        return m_listeningPort;
+      }
+      set
+      {
+        if (value < IPEndPoint.MinPort || value > IPEndPoint.MaxPort)
+        {
+          throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("value", (object)value,
+            "The value specified for Port is less than " +
+            IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) +
+            " or greater than " +
+            IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
+        }
+        else
+        {
+          m_listeningPort = value;
+        }
+      }
+    }
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// Overrides the parent method to close the socket handler
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Closes all the outstanding connections.
-		/// </para>
-		/// </remarks>
-		protected override void OnClose()  
-		{
-			base.OnClose();
+    /// <summary>
+    /// Overrides the parent method to close the socket handler
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Closes all the outstanding connections.
+    /// </para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      base.OnClose();
 
-			if (m_handler != null)
-			{
-				m_handler.Dispose();
-				m_handler = null;
-			}
-		}
+      if (m_handler != null)
+      {
+        m_handler.Dispose();
+        m_handler = null;
+      }
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Initialize the appender based on the options set.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// Create the socket handler and wait for connections
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			base.ActivateOptions();
-			try 
-			{
-				LogLog.Debug(declaringType, "Creating SocketHandler to listen on port ["+m_listeningPort+"]");
-				m_handler = new SocketHandler(m_listeningPort);
-			}
-			catch(Exception ex) 
-			{
-				LogLog.Error(declaringType, "Failed to create SocketHandler", ex);
-				throw;
-			}
-		}
+    /// <summary>
+    /// Initialize the appender based on the options set.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// Create the socket handler and wait for connections
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
+      try
+      {
+        LogLog.Debug(declaringType, "Creating SocketHandler to listen on port [" + m_listeningPort + "]");
+        m_handler = new SocketHandler(m_listeningPort);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Failed to create SocketHandler", ex);
+        throw;
+      }
+    }
 
-		/// <summary>
-		/// Writes the logging event to each connected client.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the logging event to each connected client.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			if (m_handler != null && m_handler.HasConnections)
-			{
-				m_handler.Send(RenderLoggingEvent(loggingEvent));
-			}
-		}
+    /// <summary>
+    /// Writes the logging event to each connected client.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the logging event to each connected client.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      if (m_handler != null && m_handler.HasConnections)
+      {
+        m_handler.Send(RenderLoggingEvent(loggingEvent));
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region SocketHandler helper class
+    #region SocketHandler helper class
 
-		/// <summary>
-		/// Helper class to manage connected clients
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The SocketHandler class is used to accept connections from
-		/// clients.  It is threaded so that clients can connect/disconnect
-		/// asynchronously.
-		/// </para>
-		/// </remarks>
-		protected class SocketHandler : IDisposable
-		{			
-			private const int MAX_CONNECTIONS = 20;
+    /// <summary>
+    /// Helper class to manage connected clients
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The SocketHandler class is used to accept connections from
+    /// clients.  It is threaded so that clients can connect/disconnect
+    /// asynchronously.
+    /// </para>
+    /// </remarks>
+    protected class SocketHandler : IDisposable
+    {
+      private const int MAX_CONNECTIONS = 20;
 
-			private Socket m_serverSocket;
-			private ArrayList m_clients = new ArrayList();
+      private Socket m_serverSocket;
+      private ArrayList m_clients = new ArrayList();
 
-			/// <summary>
-			/// Class that represents a client connected to this handler
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Class that represents a client connected to this handler
-			/// </para>
-			/// </remarks>
-			protected class SocketClient : IDisposable
-			{
-				private Socket m_socket;
-				private StreamWriter m_writer;
+      /// <summary>
+      /// Class that represents a client connected to this handler
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Class that represents a client connected to this handler
+      /// </para>
+      /// </remarks>
+      protected class SocketClient : IDisposable
+      {
+        private Socket m_socket;
+        private StreamWriter m_writer;
 
-				/// <summary>
-				/// Create this <see cref="SocketClient"/> for the specified <see cref="Socket"/>
-				/// </summary>
-				/// <param name="socket">the client's socket</param>
-				/// <remarks>
-				/// <para>
-				/// Opens a stream writer on the socket.
-				/// </para>
-				/// </remarks>
-				public SocketClient(Socket socket)
-				{
-					m_socket = socket;
+        /// <summary>
+        /// Create this <see cref="SocketClient"/> for the specified <see cref="Socket"/>
+        /// </summary>
+        /// <param name="socket">the client's socket</param>
+        /// <remarks>
+        /// <para>
+        /// Opens a stream writer on the socket.
+        /// </para>
+        /// </remarks>
+        public SocketClient(Socket socket)
+        {
+          m_socket = socket;
 
-					try
-					{
-						m_writer = new StreamWriter(new NetworkStream(socket));
-					}
-					catch
-					{
-						Dispose();
-						throw;
-					}
-				}
+          try
+          {
+            m_writer = new StreamWriter(new NetworkStream(socket));
+          }
+          catch
+          {
+            Dispose();
+            throw;
+          }
+        }
 
-				/// <summary>
-				/// Write a string to the client
-				/// </summary>
-				/// <param name="message">string to send</param>
-				/// <remarks>
-				/// <para>
-				/// Write a string to the client
-				/// </para>
-				/// </remarks>
-				public void Send(String message)
-				{
-					m_writer.Write(message);
-					m_writer.Flush();
-				}
+        /// <summary>
+        /// Write a string to the client
+        /// </summary>
+        /// <param name="message">string to send</param>
+        /// <remarks>
+        /// <para>
+        /// Write a string to the client
+        /// </para>
+        /// </remarks>
+        public void Send(String message)
+        {
+          m_writer.Write(message);
+          m_writer.Flush();
+        }
 
-				#region IDisposable Members
+        #region IDisposable Members
 
-				/// <summary>
-				/// Cleanup the clients connection
-				/// </summary>
-				/// <remarks>
-				/// <para>
-				/// Close the socket connection.
-				/// </para>
-				/// </remarks>
-				public void Dispose()
-				{
-					try
-					{
-						if (m_writer != null)
-						{
-							m_writer.Dispose();
-							m_writer = null;
-						}
-					}
-					catch { }
+        /// <summary>
+        /// Cleanup the clients connection
+        /// </summary>
+        /// <remarks>
+        /// <para>
+        /// Close the socket connection.
+        /// </para>
+        /// </remarks>
+        public void Dispose()
+        {
+          try
+          {
+            if (m_writer != null)
+            {
+              m_writer.Dispose();
+              m_writer = null;
+            }
+          }
+          catch { }
 
-					if (m_socket != null)
-					{
-						try
-						{
-							m_socket.Shutdown(SocketShutdown.Both);
-						}
-						catch { }
+          if (m_socket != null)
+          {
+            try
+            {
+              m_socket.Shutdown(SocketShutdown.Both);
+            }
+            catch { }
 
-						try
-						{
+            try
+            {
 #if NET_4_0 || NETSTANDARD
-							m_socket.Dispose();
+              m_socket.Dispose();
 #else
-							m_socket.Close();
+              m_socket.Close();
 #endif
-						}
-						catch { }
+            }
+            catch { }
 
-						m_socket = null;
-					}
-				}
+            m_socket = null;
+          }
+        }
 
-				#endregion
-			}
-		
-			/// <summary>
-			/// Opens a new server port on <paramref ref="port"/>
-			/// </summary>
-			/// <param name="port">the local port to listen on for connections</param>
-			/// <remarks>
-			/// <para>
-			/// Creates a socket handler on the specified local server port.
-			/// </para>
-			/// </remarks>
-			public SocketHandler(int port)
-			{
-				m_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+        #endregion
+      }
 
-				m_serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
-				m_serverSocket.Listen(5);
-				AcceptConnection();
-			}
+      /// <summary>
+      /// Opens a new server port on <paramref ref="port"/>
+      /// </summary>
+      /// <param name="port">the local port to listen on for connections</param>
+      /// <remarks>
+      /// <para>
+      /// Creates a socket handler on the specified local server port.
+      /// </para>
+      /// </remarks>
+      public SocketHandler(int port)
+      {
+        m_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 
-			private void AcceptConnection()
-			{
+        m_serverSocket.Bind(new IPEndPoint(IPAddress.Any, port));
+        m_serverSocket.Listen(5);
+        AcceptConnection();
+      }
+
+      private void AcceptConnection()
+      {
 #if NETSTANDARD
-				m_serverSocket.AcceptAsync().ContinueWith(OnConnect, TaskScheduler.Default);
+        m_serverSocket.AcceptAsync().ContinueWith(OnConnect, TaskScheduler.Default);
 #else
-				m_serverSocket.BeginAccept(new AsyncCallback(OnConnect), null);
+        m_serverSocket.BeginAccept(new AsyncCallback(OnConnect), null);
 #endif
-			}
+      }
 
-			/// <summary>
-			/// Sends a string message to each of the connected clients
-			/// </summary>
-			/// <param name="message">the text to send</param>
-			/// <remarks>
-			/// <para>
-			/// Sends a string message to each of the connected clients
-			/// </para>
-			/// </remarks>
-			public void Send(String message)
-			{
-				ArrayList localClients = m_clients;
+      /// <summary>
+      /// Sends a string message to each of the connected clients
+      /// </summary>
+      /// <param name="message">the text to send</param>
+      /// <remarks>
+      /// <para>
+      /// Sends a string message to each of the connected clients
+      /// </para>
+      /// </remarks>
+      public void Send(String message)
+      {
+        ArrayList localClients = m_clients;
 
-				foreach (SocketClient client in localClients)
-				{
-					try
-					{
-						client.Send(message);
-					}
-					catch (Exception)
-					{
-						// The client has closed the connection, remove it from our list
-						client.Dispose();
-						RemoveClient(client);
-					}
-				}
-			}
+        foreach (SocketClient client in localClients)
+        {
+          try
+          {
+            client.Send(message);
+          }
+          catch (Exception)
+          {
+            // The client has closed the connection, remove it from our list
+            client.Dispose();
+            RemoveClient(client);
+          }
+        }
+      }
 
-			/// <summary>
-			/// Add a client to the internal clients list
-			/// </summary>
-			/// <param name="client">client to add</param>
-			private void AddClient(SocketClient client)
-			{
-				lock(this)
-				{
-					ArrayList clientsCopy = (ArrayList)m_clients.Clone();
-					clientsCopy.Add(client);
-					m_clients = clientsCopy;
-				}
-			}
+      /// <summary>
+      /// Add a client to the internal clients list
+      /// </summary>
+      /// <param name="client">client to add</param>
+      private void AddClient(SocketClient client)
+      {
+        lock (this)
+        {
+          ArrayList clientsCopy = (ArrayList)m_clients.Clone();
+          clientsCopy.Add(client);
+          m_clients = clientsCopy;
+        }
+      }
 
-			/// <summary>
-			/// Remove a client from the internal clients list
-			/// </summary>
-			/// <param name="client">client to remove</param>
-			private void RemoveClient(SocketClient client)
-			{
-				lock(this)
-				{
-					ArrayList clientsCopy = (ArrayList)m_clients.Clone();
-					clientsCopy.Remove(client);
-					m_clients = clientsCopy;
-				}
-			}
+      /// <summary>
+      /// Remove a client from the internal clients list
+      /// </summary>
+      /// <param name="client">client to remove</param>
+      private void RemoveClient(SocketClient client)
+      {
+        lock (this)
+        {
+          ArrayList clientsCopy = (ArrayList)m_clients.Clone();
+          clientsCopy.Remove(client);
+          m_clients = clientsCopy;
+        }
+      }
 
-			/// <summary>
-			/// Test if this handler has active connections
-			/// </summary>
-			/// <value>
-			/// <c>true</c> if this handler has active connections
-			/// </value>
-			/// <remarks>
-			/// <para>
-			/// This property will be <c>true</c> while this handler has
-			/// active connections, that is at least one connection that 
-			/// the handler will attempt to send a message to.
-			/// </para>
-			/// </remarks>
-			public bool HasConnections
-			{
-				get
-				{
-					ArrayList localClients = m_clients;
+      /// <summary>
+      /// Test if this handler has active connections
+      /// </summary>
+      /// <value>
+      /// <c>true</c> if this handler has active connections
+      /// </value>
+      /// <remarks>
+      /// <para>
+      /// This property will be <c>true</c> while this handler has
+      /// active connections, that is at least one connection that 
+      /// the handler will attempt to send a message to.
+      /// </para>
+      /// </remarks>
+      public bool HasConnections
+      {
+        get
+        {
+          ArrayList localClients = m_clients;
 
-					return (localClients != null && localClients.Count > 0);
-				}
-			}
-			
+          return (localClients != null && localClients.Count > 0);
+        }
+      }
+
 
 #if NETSTANDARD
-			private void OnConnect(Task<Socket> acceptTask)
+      private void OnConnect(Task<Socket> acceptTask)
 #else
-			/// <summary>
-			/// Callback used to accept a connection on the server socket
-			/// </summary>
-			/// <param name="asyncResult">The result of the asynchronous operation</param>
-			/// <remarks>
-			/// <para>
-			/// On connection adds to the list of connections 
-			/// if there are two many open connections you will be disconnected
-			/// </para>
-			/// </remarks>
-			private void OnConnect(IAsyncResult asyncResult)
+      /// <summary>
+      /// Callback used to accept a connection on the server socket
+      /// </summary>
+      /// <param name="asyncResult">The result of the asynchronous operation</param>
+      /// <remarks>
+      /// <para>
+      /// On connection adds to the list of connections 
+      /// if there are two many open connections you will be disconnected
+      /// </para>
+      /// </remarks>
+      private void OnConnect(IAsyncResult asyncResult)
 #endif
-			{
-				try
-				{
+      {
+        try
+        {
 #if NETSTANDARD
-					Socket socket = acceptTask.GetAwaiter().GetResult();
+          Socket socket = acceptTask.GetAwaiter().GetResult();
 #else
-					// Block until a client connects
-					Socket socket = m_serverSocket.EndAccept(asyncResult);
+          // Block until a client connects
+          Socket socket = m_serverSocket.EndAccept(asyncResult);
 #endif
-					LogLog.Debug(declaringType, "Accepting connection from ["+socket.RemoteEndPoint.ToString()+"]");
-					SocketClient client = new SocketClient(socket);
+          LogLog.Debug(declaringType, "Accepting connection from [" + socket.RemoteEndPoint.ToString() + "]");
+          SocketClient client = new SocketClient(socket);
 
-					int currentActiveConnectionsCount = m_clients.Count;
-					if (currentActiveConnectionsCount < MAX_CONNECTIONS) 
-					{
-						try
-						{
-							client.Send("TelnetAppender v1.0 (" + (currentActiveConnectionsCount + 1) + " active connections)\r\n\r\n");
-							AddClient(client);
-						}
-						catch
-						{
-							client.Dispose();
-						}
-					}
-					else 
-					{
-						client.Send("Sorry - Too many connections.\r\n");
-						client.Dispose();
-					}
-				}
-				catch
-				{
-				}
-				finally
-				{
-					if (m_serverSocket != null)
-					{
-						AcceptConnection();
-					}
-				}
-			}
+          int currentActiveConnectionsCount = m_clients.Count;
+          if (currentActiveConnectionsCount < MAX_CONNECTIONS)
+          {
+            try
+            {
+              client.Send("TelnetAppender v1.0 (" + (currentActiveConnectionsCount + 1) + " active connections)\r\n\r\n");
+              AddClient(client);
+            }
+            catch
+            {
+              client.Dispose();
+            }
+          }
+          else
+          {
+            client.Send("Sorry - Too many connections.\r\n");
+            client.Dispose();
+          }
+        }
+        catch
+        {
+        }
+        finally
+        {
+          if (m_serverSocket != null)
+          {
+            AcceptConnection();
+          }
+        }
+      }
 
-			#region IDisposable Members
+      #region IDisposable Members
 
-			/// <summary>
-			/// Close all network connections
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Make sure we close all network connections
-			/// </para>
-			/// </remarks>
-			public void Dispose()
-			{
-				ArrayList localClients = m_clients;
+      /// <summary>
+      /// Close all network connections
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Make sure we close all network connections
+      /// </para>
+      /// </remarks>
+      public void Dispose()
+      {
+        ArrayList localClients = m_clients;
 
-				foreach (SocketClient client in localClients)
-				{
-					client.Dispose();
-				}
-				m_clients.Clear();
+        foreach (SocketClient client in localClients)
+        {
+          client.Dispose();
+        }
+        m_clients.Clear();
 
-				Socket localSocket = m_serverSocket;
-				m_serverSocket = null;
-				try 
-				{
-					localSocket.Shutdown(SocketShutdown.Both);
-				} 
-				catch 
-				{ 
-				}
+        Socket localSocket = m_serverSocket;
+        m_serverSocket = null;
+        try
+        {
+          localSocket.Shutdown(SocketShutdown.Both);
+        }
+        catch
+        {
+        }
 
-				try
-				{
+        try
+        {
 #if NET_2_0
-					localSocket.Close();
+          localSocket.Close();
 #else
-					localSocket.Dispose();
+          localSocket.Dispose();
 #endif
-				}
-				catch 
-				{ 
-				}			
-			}
+        }
+        catch
+        {
+        }
+      }
 
-			#endregion
-		}
+      #endregion
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Appender/TextWriterAppender.cs b/src/log4net/Appender/TextWriterAppender.cs
index 6eb943c..41b9dc5 100644
--- a/src/log4net/Appender/TextWriterAppender.cs
+++ b/src/log4net/Appender/TextWriterAppender.cs
@@ -26,479 +26,479 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Sends logging events to a <see cref="TextWriter"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// An Appender that writes to a <see cref="TextWriter"/>.
-	/// </para>
-	/// <para>
-	/// This appender may be used stand alone if initialized with an appropriate
-	/// writer, however it is typically used as a base class for an appender that
-	/// can open a <see cref="TextWriter"/> to write to.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Douglas de la Torre</author>
-    public class TextWriterAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Sends logging events to a <see cref="TextWriter"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// An Appender that writes to a <see cref="TextWriter"/>.
+  /// </para>
+  /// <para>
+  /// This appender may be used stand alone if initialized with an appropriate
+  /// writer, however it is typically used as a base class for an appender that
+  /// can open a <see cref="TextWriter"/> to write to.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Douglas de la Torre</author>
+  public class TextWriterAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="TextWriterAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public TextWriterAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="TextWriterAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public TextWriterAppender()
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="TextWriterAppender" /> class and
-		/// sets the output destination to a new <see cref="StreamWriter"/> initialized 
-		/// with the specified <see cref="Stream"/>.
-		/// </summary>
-		/// <param name="layout">The layout to use with this appender.</param>
-		/// <param name="os">The <see cref="Stream"/> to output to.</param>
-		/// <remarks>
-		/// <para>
-		/// Obsolete constructor.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout & Writer properties")]
-		public TextWriterAppender(ILayout layout, Stream os) : this(layout, new StreamWriter(os))
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="TextWriterAppender" /> class and
+    /// sets the output destination to a new <see cref="StreamWriter"/> initialized 
+    /// with the specified <see cref="Stream"/>.
+    /// </summary>
+    /// <param name="layout">The layout to use with this appender.</param>
+    /// <param name="os">The <see cref="Stream"/> to output to.</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout & Writer properties")]
+    public TextWriterAppender(ILayout layout, Stream os) : this(layout, new StreamWriter(os))
+    {
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="TextWriterAppender" /> class and sets
-		/// the output destination to the specified <see cref="StreamWriter" />.
-		/// </summary>
-		/// <param name="layout">The layout to use with this appender</param>
-		/// <param name="writer">The <see cref="TextWriter" /> to output to</param>
-		/// <remarks>
-		/// The <see cref="TextWriter" /> must have been previously opened.
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// Obsolete constructor.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Instead use the default constructor and set the Layout & Writer properties")]
-		public TextWriterAppender(ILayout layout, TextWriter writer) 
-		{
-			Layout = layout;
-			Writer = writer;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="TextWriterAppender" /> class and sets
+    /// the output destination to the specified <see cref="StreamWriter" />.
+    /// </summary>
+    /// <param name="layout">The layout to use with this appender</param>
+    /// <param name="writer">The <see cref="TextWriter" /> to output to</param>
+    /// <remarks>
+    /// The <see cref="TextWriter" /> must have been previously opened.
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Instead use the default constructor and set the Layout & Writer properties")]
+    public TextWriterAppender(ILayout layout, TextWriter writer)
+    {
+      Layout = layout;
+      Writer = writer;
+    }
 
-		#endregion
+    #endregion
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or set whether the appender will flush at the end 
-		/// of each append operation.
-		/// </summary>
-		/// <value>
-		/// <para>
-		/// The default behavior is to flush at the end of each 
-		/// append operation.
-		/// </para>
-		/// <para>
-		/// If this option is set to <c>false</c>, then the underlying 
-		/// stream can defer persisting the logging event to a later 
-		/// time.
-		/// </para>
-		/// </value>
-		/// <remarks>
-		/// Avoiding the flush operation at the end of each append results in
-		/// a performance gain of 10 to 20 percent. However, there is safety
-		/// trade-off involved in skipping flushing. Indeed, when flushing is
-		/// skipped, then it is likely that the last few log events will not
-		/// be recorded on disk when the application exits. This is a high
-		/// price to pay even for a 20% performance gain.
-		/// </remarks>
-		public bool ImmediateFlush 
-		{
-			get { return m_immediateFlush; }
-			set { m_immediateFlush = value; }
-		}
+    /// <summary>
+    /// Gets or set whether the appender will flush at the end 
+    /// of each append operation.
+    /// </summary>
+    /// <value>
+    /// <para>
+    /// The default behavior is to flush at the end of each 
+    /// append operation.
+    /// </para>
+    /// <para>
+    /// If this option is set to <c>false</c>, then the underlying 
+    /// stream can defer persisting the logging event to a later 
+    /// time.
+    /// </para>
+    /// </value>
+    /// <remarks>
+    /// Avoiding the flush operation at the end of each append results in
+    /// a performance gain of 10 to 20 percent. However, there is safety
+    /// trade-off involved in skipping flushing. Indeed, when flushing is
+    /// skipped, then it is likely that the last few log events will not
+    /// be recorded on disk when the application exits. This is a high
+    /// price to pay even for a 20% performance gain.
+    /// </remarks>
+    public bool ImmediateFlush
+    {
+      get { return m_immediateFlush; }
+      set { m_immediateFlush = value; }
+    }
 
-		/// <summary>
-		/// Sets the <see cref="TextWriter"/> where the log output will go.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The specified <see cref="TextWriter"/> must be open and writable.
-		/// </para>
-		/// <para>
-		/// The <see cref="TextWriter"/> will be closed when the appender 
-		/// instance is closed.
-		/// </para>
-		/// <para>
-		/// <b>Note:</b> Logging to an unopened <see cref="TextWriter"/> will fail.
-		/// </para>
-		/// </remarks>
-		public virtual TextWriter Writer 
-		{
-			get { return m_qtw; }
-			set 
-			{
-				lock(this) 
-				{
-					Reset();
-					if (value != null)
-					{
-						m_qtw = new QuietTextWriter(value, ErrorHandler);
-						WriteHeader();
-					}
-				}
-			}
-		}
-
-		#endregion Public Instance Properties
-
-		#region Override implementation of AppenderSkeleton
-
-		/// <summary>
-		/// This method determines if there is a sense in attempting to append.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method checks if an output target has been set and if a
-		/// layout has been set. 
-		/// </para>
-		/// </remarks>
-		/// <returns><c>false</c> if any of the preconditions fail.</returns>
-		protected override bool PreAppendCheck() 
-		{
-			if (!base.PreAppendCheck()) 
-			{
-				return false;
-			}
-
-			if (m_qtw == null) 
-			{
-				// Allow subclass to lazily create the writer
-				PrepareWriter();
-
-				if (m_qtw == null) 
-				{
-					ErrorHandler.Error("No output stream or file set for the appender named ["+ Name +"].");
-					return false;
-				}
-			}
-			if (m_qtw.Closed) 
-			{
-				ErrorHandler.Error("Output stream for appender named ["+ Name +"] has been closed.");
-				return false;
-			}
-
-			return true;
-		}
-
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/>
-		/// method. 
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a log statement to the output stream if the output stream exists 
-		/// and is writable.  
-		/// </para>
-		/// <para>
-		/// The format of the output will depend on the appender's layout.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			RenderLoggingEvent(m_qtw, loggingEvent);
-
-			if (m_immediateFlush) 
-			{
-				m_qtw.Flush();
-			} 
-		}
-
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent[])"/>
-		/// method. 
-		/// </summary>
-		/// <param name="loggingEvents">The array of events to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method writes all the bulk logged events to the output writer
-		/// before flushing the stream.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent[] loggingEvents) 
-		{
-			foreach(LoggingEvent loggingEvent in loggingEvents)
-			{
-				RenderLoggingEvent(m_qtw, loggingEvent);
-			}
-
-			if (m_immediateFlush) 
-			{
-				m_qtw.Flush();
-			} 
-		}
-
-		/// <summary>
-		/// Close this appender instance. The underlying stream or writer is also closed.
-		/// </summary>
-		/// <remarks>
-		/// Closed appenders cannot be reused.
-		/// </remarks>
-		protected override void OnClose() 
-		{
-			lock(this)
-			{
-				Reset();
-			}
-		}
-
-		/// <summary>
-		/// Gets or set the <see cref="IErrorHandler"/> and the underlying 
-		/// <see cref="QuietTextWriter"/>, if any, for this appender. 
-		/// </summary>
-		/// <value>
-		/// The <see cref="IErrorHandler"/> for this appender.
-		/// </value>
-		public override IErrorHandler ErrorHandler
-		{
-			get { return base.ErrorHandler; }
-			set
-			{
-				lock(this)
-				{
-					if (value == null) 
-					{
-						LogLog.Warn(declaringType, "TextWriterAppender: You have tried to set a null error-handler.");
-					} 
-					else 
-					{
-						base.ErrorHandler = value;
-						if (m_qtw != null) 
-						{
-							m_qtw.ErrorHandler = value;
-						}
-					}	
-				}
-			}
-		}
-
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
-
-		#endregion Override implementation of AppenderSkeleton
-
-		#region Protected Instance Methods
-
-		/// <summary>
-		/// Writes the footer and closes the underlying <see cref="TextWriter"/>.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Writes the footer and closes the underlying <see cref="TextWriter"/>.
-		/// </para>
-		/// </remarks>
-		protected virtual void WriteFooterAndCloseWriter()
-		{
-			WriteFooter();
-			CloseWriter();
-		}
-
-		/// <summary>
-		/// Closes the underlying <see cref="TextWriter"/>.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Closes the underlying <see cref="TextWriter"/>.
-		/// </para>
-		/// </remarks>
-		protected virtual void CloseWriter() 
-		{
-			if (m_qtw != null) 
-			{
-				try 
-				{
-					m_qtw.Close();
-				} 
-				catch(Exception e) 
-				{
-					ErrorHandler.Error("Could not close writer ["+m_qtw+"]", e); 
-					// do need to invoke an error handler
-					// at this late stage
-				}
-			}
-		}
-
-		/// <summary>
-		/// Clears internal references to the underlying <see cref="TextWriter" /> 
-		/// and other variables.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Subclasses can override this method for an alternate closing behavior.
-		/// </para>
-		/// </remarks>
-		protected virtual void Reset() 
-		{
-			WriteFooterAndCloseWriter();
-			m_qtw = null;
-		}
-
-		/// <summary>
-		/// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
-		/// </para>
-		/// </remarks>
-		protected virtual void WriteFooter() 
-		{
-			if (Layout != null && m_qtw != null && !m_qtw.Closed) 
-			{
-				string f = Layout.Footer;
-				if (f != null)
-				{
-					m_qtw.Write(f);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
-		/// </para>
-		/// </remarks>
-		protected virtual void WriteHeader() 
-		{
-			if (Layout != null && m_qtw != null && !m_qtw.Closed) 
-			{
-				string h = Layout.Header;
-				if (h != null)
-				{
-					m_qtw.Write(h);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Called to allow a subclass to lazily initialize the writer
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method is called when an event is logged and the <see cref="Writer"/> or
-		/// <see cref="QuietWriter"/> have not been set. This allows a subclass to
-		/// attempt to initialize the writer multiple times.
-		/// </para>
-		/// </remarks>
-		protected virtual void PrepareWriter()
-		{
-		}
-
-		/// <summary>
-		/// Gets or sets the <see cref="log4net.Util.QuietTextWriter"/> where logging events
-		/// will be written to. 
-		/// </summary>
-		/// <value>
-		/// The <see cref="log4net.Util.QuietTextWriter"/> where logging events are written.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This is the <see cref="log4net.Util.QuietTextWriter"/> where logging events
-		/// will be written to. 
-		/// </para>
-		/// </remarks>
-		protected QuietTextWriter QuietWriter
-		{
-			get { return m_qtw; }
-			set { m_qtw = value; }
+    /// <summary>
+    /// Sets the <see cref="TextWriter"/> where the log output will go.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The specified <see cref="TextWriter"/> must be open and writable.
+    /// </para>
+    /// <para>
+    /// The <see cref="TextWriter"/> will be closed when the appender 
+    /// instance is closed.
+    /// </para>
+    /// <para>
+    /// <b>Note:</b> Logging to an unopened <see cref="TextWriter"/> will fail.
+    /// </para>
+    /// </remarks>
+    public virtual TextWriter Writer
+    {
+      get { return m_qtw; }
+      set
+      {
+        lock (this)
+        {
+          Reset();
+          if (value != null)
+          {
+            m_qtw = new QuietTextWriter(value, ErrorHandler);
+            WriteHeader();
+          }
         }
+      }
+    }
 
-        #endregion Protected Instance Methods
+    #endregion Public Instance Properties
 
-        #region Private Instance Fields
+    #region Override implementation of AppenderSkeleton
 
-        /// <summary>
-		/// This is the <see cref="log4net.Util.QuietTextWriter"/> where logging events
-		/// will be written to. 
-		/// </summary>
-		private QuietTextWriter m_qtw;
+    /// <summary>
+    /// This method determines if there is a sense in attempting to append.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method checks if an output target has been set and if a
+    /// layout has been set. 
+    /// </para>
+    /// </remarks>
+    /// <returns><c>false</c> if any of the preconditions fail.</returns>
+    protected override bool PreAppendCheck()
+    {
+      if (!base.PreAppendCheck())
+      {
+        return false;
+      }
 
-		/// <summary>
-		/// Immediate flush means that the underlying <see cref="TextWriter" /> 
-		/// or output stream will be flushed at the end of each append operation.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Immediate flush is slower but ensures that each append request is 
-		/// actually written. If <see cref="ImmediateFlush"/> is set to
-		/// <c>false</c>, then there is a good chance that the last few
-		/// logging events are not actually persisted if and when the application 
-		/// crashes.
-		/// </para>
-		/// <para>
-		/// The default value is <c>true</c>.
-		/// </para>
-		/// </remarks>
-		private bool m_immediateFlush = true;
+      if (m_qtw == null)
+      {
+        // Allow subclass to lazily create the writer
+        PrepareWriter();
 
-		#endregion Private Instance Fields
+        if (m_qtw == null)
+        {
+          ErrorHandler.Error("No output stream or file set for the appender named [" + Name + "].");
+          return false;
+        }
+      }
+      if (m_qtw.Closed)
+      {
+        ErrorHandler.Error("Output stream for appender named [" + Name + "] has been closed.");
+        return false;
+      }
 
-	    #region Private Static Fields
+      return true;
+    }
 
-	    /// <summary>
-	    /// The fully qualified type of the TextWriterAppender class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(TextWriterAppender);
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/>
+    /// method. 
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a log statement to the output stream if the output stream exists 
+    /// and is writable.  
+    /// </para>
+    /// <para>
+    /// The format of the output will depend on the appender's layout.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      RenderLoggingEvent(m_qtw, loggingEvent);
 
-	    #endregion Private Static Fields
+      if (m_immediateFlush)
+      {
+        m_qtw.Flush();
+      }
+    }
 
-            /// <summary>
-            /// Flushes any buffered log data.
-            /// </summary>
-            /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
-            /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-            public override bool Flush(int millisecondsTimeout)
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent[])"/>
+    /// method. 
+    /// </summary>
+    /// <param name="loggingEvents">The array of events to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method writes all the bulk logged events to the output writer
+    /// before flushing the stream.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent[] loggingEvents)
+    {
+      foreach (LoggingEvent loggingEvent in loggingEvents)
+      {
+        RenderLoggingEvent(m_qtw, loggingEvent);
+      }
+
+      if (m_immediateFlush)
+      {
+        m_qtw.Flush();
+      }
+    }
+
+    /// <summary>
+    /// Close this appender instance. The underlying stream or writer is also closed.
+    /// </summary>
+    /// <remarks>
+    /// Closed appenders cannot be reused.
+    /// </remarks>
+    protected override void OnClose()
+    {
+      lock (this)
+      {
+        Reset();
+      }
+    }
+
+    /// <summary>
+    /// Gets or set the <see cref="IErrorHandler"/> and the underlying 
+    /// <see cref="QuietTextWriter"/>, if any, for this appender. 
+    /// </summary>
+    /// <value>
+    /// The <see cref="IErrorHandler"/> for this appender.
+    /// </value>
+    public override IErrorHandler ErrorHandler
+    {
+      get { return base.ErrorHandler; }
+      set
+      {
+        lock (this)
+        {
+          if (value == null)
+          {
+            LogLog.Warn(declaringType, "TextWriterAppender: You have tried to set a null error-handler.");
+          }
+          else
+          {
+            base.ErrorHandler = value;
+            if (m_qtw != null)
             {
-                // Nothing to do if ImmediateFlush is true
-                if (m_immediateFlush) return true;
-
-                // lock(this) will block any Appends while the buffer is flushed.
-                lock (this)
-                {
-                    m_qtw.Flush();
-                }
-
-                return true;
+              m_qtw.ErrorHandler = value;
             }
-	}
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
+
+    #endregion Override implementation of AppenderSkeleton
+
+    #region Protected Instance Methods
+
+    /// <summary>
+    /// Writes the footer and closes the underlying <see cref="TextWriter"/>.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Writes the footer and closes the underlying <see cref="TextWriter"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual void WriteFooterAndCloseWriter()
+    {
+      WriteFooter();
+      CloseWriter();
+    }
+
+    /// <summary>
+    /// Closes the underlying <see cref="TextWriter"/>.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Closes the underlying <see cref="TextWriter"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual void CloseWriter()
+    {
+      if (m_qtw != null)
+      {
+        try
+        {
+          m_qtw.Close();
+        }
+        catch (Exception e)
+        {
+          ErrorHandler.Error("Could not close writer [" + m_qtw + "]", e);
+          // do need to invoke an error handler
+          // at this late stage
+        }
+      }
+    }
+
+    /// <summary>
+    /// Clears internal references to the underlying <see cref="TextWriter" /> 
+    /// and other variables.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Subclasses can override this method for an alternate closing behavior.
+    /// </para>
+    /// </remarks>
+    protected virtual void Reset()
+    {
+      WriteFooterAndCloseWriter();
+      m_qtw = null;
+    }
+
+    /// <summary>
+    /// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Writes a footer as produced by the embedded layout's <see cref="ILayout.Footer"/> property.
+    /// </para>
+    /// </remarks>
+    protected virtual void WriteFooter()
+    {
+      if (Layout != null && m_qtw != null && !m_qtw.Closed)
+      {
+        string f = Layout.Footer;
+        if (f != null)
+        {
+          m_qtw.Write(f);
+        }
+      }
+    }
+
+    /// <summary>
+    /// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Writes a header produced by the embedded layout's <see cref="ILayout.Header"/> property.
+    /// </para>
+    /// </remarks>
+    protected virtual void WriteHeader()
+    {
+      if (Layout != null && m_qtw != null && !m_qtw.Closed)
+      {
+        string h = Layout.Header;
+        if (h != null)
+        {
+          m_qtw.Write(h);
+        }
+      }
+    }
+
+    /// <summary>
+    /// Called to allow a subclass to lazily initialize the writer
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method is called when an event is logged and the <see cref="Writer"/> or
+    /// <see cref="QuietWriter"/> have not been set. This allows a subclass to
+    /// attempt to initialize the writer multiple times.
+    /// </para>
+    /// </remarks>
+    protected virtual void PrepareWriter()
+    {
+    }
+
+    /// <summary>
+    /// Gets or sets the <see cref="log4net.Util.QuietTextWriter"/> where logging events
+    /// will be written to. 
+    /// </summary>
+    /// <value>
+    /// The <see cref="log4net.Util.QuietTextWriter"/> where logging events are written.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This is the <see cref="log4net.Util.QuietTextWriter"/> where logging events
+    /// will be written to. 
+    /// </para>
+    /// </remarks>
+    protected QuietTextWriter QuietWriter
+    {
+      get { return m_qtw; }
+      set { m_qtw = value; }
+    }
+
+    #endregion Protected Instance Methods
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// This is the <see cref="log4net.Util.QuietTextWriter"/> where logging events
+    /// will be written to. 
+    /// </summary>
+    private QuietTextWriter m_qtw;
+
+    /// <summary>
+    /// Immediate flush means that the underlying <see cref="TextWriter" /> 
+    /// or output stream will be flushed at the end of each append operation.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Immediate flush is slower but ensures that each append request is 
+    /// actually written. If <see cref="ImmediateFlush"/> is set to
+    /// <c>false</c>, then there is a good chance that the last few
+    /// logging events are not actually persisted if and when the application 
+    /// crashes.
+    /// </para>
+    /// <para>
+    /// The default value is <c>true</c>.
+    /// </para>
+    /// </remarks>
+    private bool m_immediateFlush = true;
+
+    #endregion Private Instance Fields
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the TextWriterAppender class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(TextWriterAppender);
+
+    #endregion Private Static Fields
+
+    /// <summary>
+    /// Flushes any buffered log data.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public override bool Flush(int millisecondsTimeout)
+    {
+      // Nothing to do if ImmediateFlush is true
+      if (m_immediateFlush) return true;
+
+      // lock(this) will block any Appends while the buffer is flushed.
+      lock (this)
+      {
+        m_qtw.Flush();
+      }
+
+      return true;
+    }
+  }
 }
diff --git a/src/log4net/Appender/TraceAppender.cs b/src/log4net/Appender/TraceAppender.cs
index 8e6cb7f..e495336 100644
--- a/src/log4net/Appender/TraceAppender.cs
+++ b/src/log4net/Appender/TraceAppender.cs
@@ -24,206 +24,206 @@
 
 namespace log4net.Appender
 {
-	/// <summary>
-	/// Appends log events to the <see cref="System.Diagnostics.Trace"/> system.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The application configuration file can be used to control what listeners 
-	/// are actually used. See the MSDN documentation for the 
-	/// <see cref="System.Diagnostics.Trace"/> class for details on configuring the
-	/// trace system.
-	/// </para>
-	/// <para>
-	/// Events are written using the <c>System.Diagnostics.Trace.Write(string,string)</c>
-	/// method. The event's logger name is the default value for the category parameter 
-    /// of the Write method. 
-	/// </para>
-	/// <para>
-	/// <b>Compact Framework</b><br />
-	/// The Compact Framework does not support the <see cref="System.Diagnostics.Trace"/>
-	/// class for any operation except <c>Assert</c>. When using the Compact Framework this
-	/// appender will write to the <see cref="System.Diagnostics.Debug"/> system rather than
-	/// the Trace system. This appender will therefore behave like the <see cref="DebugAppender"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Douglas de la Torre</author>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-    /// <author>Ron Grabowski</author>
-	public class TraceAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Appends log events to the <see cref="System.Diagnostics.Trace"/> system.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The application configuration file can be used to control what listeners 
+  /// are actually used. See the MSDN documentation for the 
+  /// <see cref="System.Diagnostics.Trace"/> class for details on configuring the
+  /// trace system.
+  /// </para>
+  /// <para>
+  /// Events are written using the <c>System.Diagnostics.Trace.Write(string,string)</c>
+  /// method. The event's logger name is the default value for the category parameter 
+  /// of the Write method. 
+  /// </para>
+  /// <para>
+  /// <b>Compact Framework</b><br />
+  /// The Compact Framework does not support the <see cref="System.Diagnostics.Trace"/>
+  /// class for any operation except <c>Assert</c>. When using the Compact Framework this
+  /// appender will write to the <see cref="System.Diagnostics.Debug"/> system rather than
+  /// the Trace system. This appender will therefore behave like the <see cref="DebugAppender"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Ron Grabowski</author>
+  public class TraceAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="TraceAppender" />.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public TraceAppender()
-		{
-		}
-
-		/// <summary>
-		/// Initializes a new instance of the <see cref="TraceAppender" /> 
-		/// with a specified layout.
-		/// </summary>
-		/// <param name="layout">The layout to use with this appender.</param>
-		/// <remarks>
-		/// <para>
-		/// Obsolete constructor.
-		/// </para>
-		/// </remarks>
-		[System.Obsolete("Instead use the default constructor and set the Layout property")]
-		public TraceAppender(ILayout layout)
-		{
-			Layout = layout;
-		}
-
-		#endregion Public Instance Constructors
-
-		#region Public Instance Properties
-
-		/// <summary>
-		/// Gets or sets a value that indicates whether the appender will 
-		/// flush at the end of each write.
-		/// </summary>
-		/// <remarks>
-		/// <para>The default behavior is to flush at the end of each 
-		/// write. If the option is set to<c>false</c>, then the underlying 
-		/// stream can defer writing to physical medium to a later time. 
-		/// </para>
-		/// <para>
-		/// Avoiding the flush operation at the end of each append results 
-		/// in a performance gain of 10 to 20 percent. However, there is safety
-		/// trade-off involved in skipping flushing. Indeed, when flushing is
-		/// skipped, then it is likely that the last few log events will not
-		/// be recorded on disk when the application exits. This is a high
-		/// price to pay even for a 20% performance gain.
-		/// </para>
-		/// </remarks>
-		public bool ImmediateFlush
-		{
-			get { return m_immediateFlush; }
-			set { m_immediateFlush = value; }
-		}
-
-        /// <summary>
-        /// The category parameter sent to the Trace method.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Defaults to %logger which will use the logger name of the current 
-        /// <see cref="LoggingEvent"/> as the category parameter.
-        /// </para>
-        /// <para>
-        /// </para> 
-        /// </remarks>
-	    public PatternLayout Category
-	    {
-	        get { return m_category; }
-	        set { m_category = value; }
-	    }
-
-	    #endregion Public Instance Properties
-
-		#region Override implementation of AppenderSkeleton
-
-		/// <summary>
-		/// Writes the logging event to the <see cref="System.Diagnostics.Trace"/> system.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the logging event to the <see cref="System.Diagnostics.Trace"/> system.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			//
-			// Write the string to the Trace system
-			//
-#if NETCF
-			System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), m_category.Format(loggingEvent));
-#else
-            System.Diagnostics.Trace.Write(RenderLoggingEvent(loggingEvent), m_category.Format(loggingEvent));
-#endif
-	 
-			//
-			// Flush the Trace system if needed
-			//
-			if (m_immediateFlush) 
-			{
-#if NETCF
-				System.Diagnostics.Debug.Flush();
-#else
-				System.Diagnostics.Trace.Flush();
-#endif
-			} 
-		}
-
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
-
-		#endregion Override implementation of AppenderSkeleton
-
-		#region Private Instance Fields
-
-		/// <summary>
-		/// Immediate flush means that the underlying writer or output stream
-		/// will be flushed at the end of each append operation.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Immediate flush is slower but ensures that each append request is 
-		/// actually written. If <see cref="ImmediateFlush"/> is set to
-		/// <c>false</c>, then there is a good chance that the last few
-		/// logs events are not actually written to persistent media if and
-		/// when the application crashes.
-		/// </para>
-		/// <para>
-		/// The default value is <c>true</c>.</para>
-		/// </remarks>
-		private bool m_immediateFlush = true;
-
-        /// <summary>
-        /// Defaults to %logger
-        /// </summary>
-        private PatternLayout m_category = new PatternLayout("%logger");
-
-		#endregion Private Instance Fields
-
-        /// <summary>
-        /// Flushes any buffered log data.
-        /// </summary>
-        /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
-        /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-        public override bool Flush(int millisecondsTimeout)
-        {
-            // Nothing to do if ImmediateFlush is true
-            if (m_immediateFlush) return true;
-
-            // System.Diagnostics.Trace and System.Diagnostics.Debug are thread-safe, so no need for lock(this).
-#if NETCF
-			System.Diagnostics.Debug.Flush();
-#else
-            System.Diagnostics.Trace.Flush();
-#endif
-            return true;
-        }
+    /// <summary>
+    /// Initializes a new instance of the <see cref="TraceAppender" />.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public TraceAppender()
+    {
     }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="TraceAppender" /> 
+    /// with a specified layout.
+    /// </summary>
+    /// <param name="layout">The layout to use with this appender.</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete constructor.
+    /// </para>
+    /// </remarks>
+    [System.Obsolete("Instead use the default constructor and set the Layout property")]
+    public TraceAppender(ILayout layout)
+    {
+      Layout = layout;
+    }
+
+    #endregion Public Instance Constructors
+
+    #region Public Instance Properties
+
+    /// <summary>
+    /// Gets or sets a value that indicates whether the appender will 
+    /// flush at the end of each write.
+    /// </summary>
+    /// <remarks>
+    /// <para>The default behavior is to flush at the end of each 
+    /// write. If the option is set to<c>false</c>, then the underlying 
+    /// stream can defer writing to physical medium to a later time. 
+    /// </para>
+    /// <para>
+    /// Avoiding the flush operation at the end of each append results 
+    /// in a performance gain of 10 to 20 percent. However, there is safety
+    /// trade-off involved in skipping flushing. Indeed, when flushing is
+    /// skipped, then it is likely that the last few log events will not
+    /// be recorded on disk when the application exits. This is a high
+    /// price to pay even for a 20% performance gain.
+    /// </para>
+    /// </remarks>
+    public bool ImmediateFlush
+    {
+      get { return m_immediateFlush; }
+      set { m_immediateFlush = value; }
+    }
+
+    /// <summary>
+    /// The category parameter sent to the Trace method.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defaults to %logger which will use the logger name of the current 
+    /// <see cref="LoggingEvent"/> as the category parameter.
+    /// </para>
+    /// <para>
+    /// </para> 
+    /// </remarks>
+    public PatternLayout Category
+    {
+      get { return m_category; }
+      set { m_category = value; }
+    }
+
+    #endregion Public Instance Properties
+
+    #region Override implementation of AppenderSkeleton
+
+    /// <summary>
+    /// Writes the logging event to the <see cref="System.Diagnostics.Trace"/> system.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the logging event to the <see cref="System.Diagnostics.Trace"/> system.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      //
+      // Write the string to the Trace system
+      //
+#if NETCF
+      System.Diagnostics.Debug.Write(RenderLoggingEvent(loggingEvent), m_category.Format(loggingEvent));
+#else
+      System.Diagnostics.Trace.Write(RenderLoggingEvent(loggingEvent), m_category.Format(loggingEvent));
+#endif
+
+      //
+      // Flush the Trace system if needed
+      //
+      if (m_immediateFlush)
+      {
+#if NETCF
+        System.Diagnostics.Debug.Flush();
+#else
+        System.Diagnostics.Trace.Flush();
+#endif
+      }
+    }
+
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
+
+    #endregion Override implementation of AppenderSkeleton
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// Immediate flush means that the underlying writer or output stream
+    /// will be flushed at the end of each append operation.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Immediate flush is slower but ensures that each append request is 
+    /// actually written. If <see cref="ImmediateFlush"/> is set to
+    /// <c>false</c>, then there is a good chance that the last few
+    /// logs events are not actually written to persistent media if and
+    /// when the application crashes.
+    /// </para>
+    /// <para>
+    /// The default value is <c>true</c>.</para>
+    /// </remarks>
+    private bool m_immediateFlush = true;
+
+    /// <summary>
+    /// Defaults to %logger
+    /// </summary>
+    private PatternLayout m_category = new PatternLayout("%logger");
+
+    #endregion Private Instance Fields
+
+    /// <summary>
+    /// Flushes any buffered log data.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time to wait for logging events to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public override bool Flush(int millisecondsTimeout)
+    {
+      // Nothing to do if ImmediateFlush is true
+      if (m_immediateFlush) return true;
+
+      // System.Diagnostics.Trace and System.Diagnostics.Debug are thread-safe, so no need for lock(this).
+#if NETCF
+      System.Diagnostics.Debug.Flush();
+#else
+      System.Diagnostics.Trace.Flush();
+#endif
+      return true;
+    }
+  }
 }
diff --git a/src/log4net/Appender/UdpAppender.cs b/src/log4net/Appender/UdpAppender.cs
index e2cafe4..b0d4f68 100644
--- a/src/log4net/Appender/UdpAppender.cs
+++ b/src/log4net/Appender/UdpAppender.cs
@@ -25,524 +25,524 @@
 
 using log4net.Core;
 
-namespace log4net.Appender 
+namespace log4net.Appender
 {
-	/// <summary>
-	/// Sends logging events as connectionless UDP datagrams to a remote host or a 
-	/// multicast group using an <see cref="UdpClient" />.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// UDP guarantees neither that messages arrive, nor that they arrive in the correct order.
-	/// </para>
-	/// <para>
-	/// To view the logging results, a custom application can be developed that listens for logging 
-	/// events.
-	/// </para>
-	/// <para>
-	/// When decoding events send via this appender remember to use the same encoding
-	/// to decode the events as was used to send the events. See the <see cref="Encoding"/>
-	/// property to specify the encoding to use.
-	/// </para>
-	/// </remarks>
-	/// <example>
-	/// This example shows how to log receive logging events that are sent 
-	/// on IP address 244.0.0.1 and port 8080 to the console. The event is 
-	/// encoded in the packet as a unicode string and it is decoded as such. 
-	/// <code lang="C#">
-	/// IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
-	/// UdpClient udpClient;
-	/// byte[] buffer;
-	/// string loggingEvent;
-	/// 
-	/// try 
-	/// {
-	///     udpClient = new UdpClient(8080);
-	///     
-	///     while(true) 
-	///     {
-	///         buffer = udpClient.Receive(ref remoteEndPoint);
-	///         loggingEvent = System.Text.Encoding.Unicode.GetString(buffer);
-	///         Console.WriteLine(loggingEvent);
-	///     }
-	/// } 
-	/// catch(Exception e) 
-	/// {
-	///     Console.WriteLine(e.ToString());
-	/// }
-	/// </code>
-	/// <code lang="Visual Basic">
-	/// Dim remoteEndPoint as IPEndPoint
-	/// Dim udpClient as UdpClient
-	/// Dim buffer as Byte()
-	/// Dim loggingEvent as String
-	/// 
-	/// Try 
-	///     remoteEndPoint = new IPEndPoint(IPAddress.Any, 0)
-	///     udpClient = new UdpClient(8080)
-	///
-	///     While True
-	///         buffer = udpClient.Receive(ByRef remoteEndPoint)
-	///         loggingEvent = System.Text.Encoding.Unicode.GetString(buffer)
-	///         Console.WriteLine(loggingEvent)
-	///     Wend
-	/// Catch e As Exception
-	///     Console.WriteLine(e.ToString())
-	/// End Try
-	/// </code>
-	/// <para>
-	/// An example configuration section to log information using this appender to the 
-	/// IP 224.0.0.1 on port 8080:
-	/// </para>
-	/// <code lang="XML" escaped="true">
-	/// <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
-	///     <remoteAddress value="224.0.0.1" />
-	///     <remotePort value="8080" />
-	///     <layout type="log4net.Layout.PatternLayout" value="%-5level %logger [%ndc] - %message%newline" />
-	/// </appender>
-	/// </code>
-	/// </example>
-	/// <author>Gert Driesen</author>
-	/// <author>Nicko Cadell</author>
-	public class UdpAppender : AppenderSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Sends logging events as connectionless UDP datagrams to a remote host or a 
+  /// multicast group using an <see cref="UdpClient" />.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// UDP guarantees neither that messages arrive, nor that they arrive in the correct order.
+  /// </para>
+  /// <para>
+  /// To view the logging results, a custom application can be developed that listens for logging 
+  /// events.
+  /// </para>
+  /// <para>
+  /// When decoding events send via this appender remember to use the same encoding
+  /// to decode the events as was used to send the events. See the <see cref="Encoding"/>
+  /// property to specify the encoding to use.
+  /// </para>
+  /// </remarks>
+  /// <example>
+  /// This example shows how to log receive logging events that are sent 
+  /// on IP address 244.0.0.1 and port 8080 to the console. The event is 
+  /// encoded in the packet as a unicode string and it is decoded as such. 
+  /// <code lang="C#">
+  /// IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
+  /// UdpClient udpClient;
+  /// byte[] buffer;
+  /// string loggingEvent;
+  /// 
+  /// try 
+  /// {
+  ///     udpClient = new UdpClient(8080);
+  ///     
+  ///     while(true) 
+  ///     {
+  ///         buffer = udpClient.Receive(ref remoteEndPoint);
+  ///         loggingEvent = System.Text.Encoding.Unicode.GetString(buffer);
+  ///         Console.WriteLine(loggingEvent);
+  ///     }
+  /// } 
+  /// catch(Exception e) 
+  /// {
+  ///     Console.WriteLine(e.ToString());
+  /// }
+  /// </code>
+  /// <code lang="Visual Basic">
+  /// Dim remoteEndPoint as IPEndPoint
+  /// Dim udpClient as UdpClient
+  /// Dim buffer as Byte()
+  /// Dim loggingEvent as String
+  /// 
+  /// Try 
+  ///     remoteEndPoint = new IPEndPoint(IPAddress.Any, 0)
+  ///     udpClient = new UdpClient(8080)
+  ///
+  ///     While True
+  ///         buffer = udpClient.Receive(ByRef remoteEndPoint)
+  ///         loggingEvent = System.Text.Encoding.Unicode.GetString(buffer)
+  ///         Console.WriteLine(loggingEvent)
+  ///     Wend
+  /// Catch e As Exception
+  ///     Console.WriteLine(e.ToString())
+  /// End Try
+  /// </code>
+  /// <para>
+  /// An example configuration section to log information using this appender to the 
+  /// IP 224.0.0.1 on port 8080:
+  /// </para>
+  /// <code lang="XML" escaped="true">
+  /// <appender name="UdpAppender" type="log4net.Appender.UdpAppender">
+  ///     <remoteAddress value="224.0.0.1" />
+  ///     <remotePort value="8080" />
+  ///     <layout type="log4net.Layout.PatternLayout" value="%-5level %logger [%ndc] - %message%newline" />
+  /// </appender>
+  /// </code>
+  /// </example>
+  /// <author>Gert Driesen</author>
+  /// <author>Nicko Cadell</author>
+  public class UdpAppender : AppenderSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="UdpAppender" /> class.
-		/// </summary>
-		/// <remarks>
-		/// The default constructor initializes all fields to their default values.
-		/// </remarks>
-		public UdpAppender() 
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="UdpAppender" /> class.
+    /// </summary>
+    /// <remarks>
+    /// The default constructor initializes all fields to their default values.
+    /// </remarks>
+    public UdpAppender()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the IP address of the remote host or multicast group to which
-		/// the underlying <see cref="UdpClient" /> should sent the logging event.
-		/// </summary>
-		/// <value>
-		/// The IP address of the remote host or multicast group to which the logging event 
-		/// will be sent.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Multicast addresses are identified by IP class <b>D</b> addresses (in the range 224.0.0.0 to
-		/// 239.255.255.255).  Multicast packets can pass across different networks through routers, so
-		/// it is possible to use multicasts in an Internet scenario as long as your network provider 
-		/// supports multicasting.
-		/// </para>
-		/// <para>
-		/// Hosts that want to receive particular multicast messages must register their interest by joining
-		/// the multicast group.  Multicast messages are not sent to networks where no host has joined
-		/// the multicast group.  Class <b>D</b> IP addresses are used for multicast groups, to differentiate
-		/// them from normal host addresses, allowing nodes to easily detect if a message is of interest.
-		/// </para>
-		/// <para>
-		/// Static multicast addresses that are needed globally are assigned by IANA.  A few examples are listed in the table below:
-		/// </para>
-		/// <para>
-		/// <list type="table">
-		///     <listheader>
-		///         <term>IP Address</term>
-		///         <description>Description</description>
-		///     </listheader>
-		///     <item>
-		///         <term>224.0.0.1</term>
-		///         <description>
-		///             <para>
-		///             Sends a message to all system on the subnet.
-		///             </para>
-		///         </description>
-		///     </item>
-		///     <item>
-		///         <term>224.0.0.2</term>
-		///         <description>
-		///             <para>
-		///             Sends a message to all routers on the subnet.
-		///             </para>
-		///         </description>
-		///     </item>
-		///     <item>
-		///         <term>224.0.0.12</term>
-		///         <description>
-		///             <para>
-		///             The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet.
-		///             </para>
-		///         </description>
-		///     </item>
-		/// </list>
-		/// </para>
-		/// <para>
-		/// A complete list of actually reserved multicast addresses and their owners in the ranges
-		/// defined by RFC 3171 can be found at the <A href="http://www.iana.org/assignments/multicast-addresses">IANA web site</A>. 
-		/// </para>
-		/// <para>
-		/// The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative 
-		/// addresses.  These addresses can be reused with other local groups.  Routers are typically 
-		/// configured with filters to prevent multicast traffic in this range from flowing outside
-		/// of the local network.
-		/// </para>
-		/// </remarks>
-		public IPAddress RemoteAddress
-		{
-			get { return m_remoteAddress; }
-			set { m_remoteAddress = value; }
-		}
+    /// <summary>
+    /// Gets or sets the IP address of the remote host or multicast group to which
+    /// the underlying <see cref="UdpClient" /> should sent the logging event.
+    /// </summary>
+    /// <value>
+    /// The IP address of the remote host or multicast group to which the logging event 
+    /// will be sent.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Multicast addresses are identified by IP class <b>D</b> addresses (in the range 224.0.0.0 to
+    /// 239.255.255.255).  Multicast packets can pass across different networks through routers, so
+    /// it is possible to use multicasts in an Internet scenario as long as your network provider 
+    /// supports multicasting.
+    /// </para>
+    /// <para>
+    /// Hosts that want to receive particular multicast messages must register their interest by joining
+    /// the multicast group.  Multicast messages are not sent to networks where no host has joined
+    /// the multicast group.  Class <b>D</b> IP addresses are used for multicast groups, to differentiate
+    /// them from normal host addresses, allowing nodes to easily detect if a message is of interest.
+    /// </para>
+    /// <para>
+    /// Static multicast addresses that are needed globally are assigned by IANA.  A few examples are listed in the table below:
+    /// </para>
+    /// <para>
+    /// <list type="table">
+    ///     <listheader>
+    ///         <term>IP Address</term>
+    ///         <description>Description</description>
+    ///     </listheader>
+    ///     <item>
+    ///         <term>224.0.0.1</term>
+    ///         <description>
+    ///             <para>
+    ///             Sends a message to all system on the subnet.
+    ///             </para>
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>224.0.0.2</term>
+    ///         <description>
+    ///             <para>
+    ///             Sends a message to all routers on the subnet.
+    ///             </para>
+    ///         </description>
+    ///     </item>
+    ///     <item>
+    ///         <term>224.0.0.12</term>
+    ///         <description>
+    ///             <para>
+    ///             The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet.
+    ///             </para>
+    ///         </description>
+    ///     </item>
+    /// </list>
+    /// </para>
+    /// <para>
+    /// A complete list of actually reserved multicast addresses and their owners in the ranges
+    /// defined by RFC 3171 can be found at the <A href="http://www.iana.org/assignments/multicast-addresses">IANA web site</A>. 
+    /// </para>
+    /// <para>
+    /// The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative 
+    /// addresses.  These addresses can be reused with other local groups.  Routers are typically 
+    /// configured with filters to prevent multicast traffic in this range from flowing outside
+    /// of the local network.
+    /// </para>
+    /// </remarks>
+    public IPAddress RemoteAddress
+    {
+      get { return m_remoteAddress; }
+      set { m_remoteAddress = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the TCP port number of the remote host or multicast group to which 
-		/// the underlying <see cref="UdpClient" /> should sent the logging event.
-		/// </summary>
-		/// <value>
-		/// An integer value in the range <see cref="IPEndPoint.MinPort" /> to <see cref="IPEndPoint.MaxPort" /> 
-		/// indicating the TCP port number of the remote host or multicast group to which the logging event 
-		/// will be sent.
-		/// </value>
-		/// <remarks>
-		/// The underlying <see cref="UdpClient" /> will send messages to this TCP port number
-		/// on the remote host or multicast group.
-		/// </remarks>
-		/// <exception cref="ArgumentOutOfRangeException">The value specified is less than <see cref="IPEndPoint.MinPort" /> or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
-		public int RemotePort
-		{
-			get { return m_remotePort; }
-			set 
-			{
-				if (value < IPEndPoint.MinPort || value > IPEndPoint.MaxPort) 
-				{
-					throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("value", (object)value,
-						"The value specified is less than " + 
-						IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) + 
-						" or greater than " + 
-						IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
-				} 
-				else 
-				{
-					m_remotePort = value;
-				}
-			}
-		}
+    /// <summary>
+    /// Gets or sets the TCP port number of the remote host or multicast group to which 
+    /// the underlying <see cref="UdpClient" /> should sent the logging event.
+    /// </summary>
+    /// <value>
+    /// An integer value in the range <see cref="IPEndPoint.MinPort" /> to <see cref="IPEndPoint.MaxPort" /> 
+    /// indicating the TCP port number of the remote host or multicast group to which the logging event 
+    /// will be sent.
+    /// </value>
+    /// <remarks>
+    /// The underlying <see cref="UdpClient" /> will send messages to this TCP port number
+    /// on the remote host or multicast group.
+    /// </remarks>
+    /// <exception cref="ArgumentOutOfRangeException">The value specified is less than <see cref="IPEndPoint.MinPort" /> or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
+    public int RemotePort
+    {
+      get { return m_remotePort; }
+      set
+      {
+        if (value < IPEndPoint.MinPort || value > IPEndPoint.MaxPort)
+        {
+          throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("value", (object)value,
+            "The value specified is less than " +
+            IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) +
+            " or greater than " +
+            IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
+        }
+        else
+        {
+          m_remotePort = value;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets the TCP port number from which the underlying <see cref="UdpClient" /> will communicate.
-		/// </summary>
-		/// <value>
-		/// An integer value in the range <see cref="IPEndPoint.MinPort" /> to <see cref="IPEndPoint.MaxPort" /> 
-		/// indicating the TCP port number from which the underlying <see cref="UdpClient" /> will communicate.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The underlying <see cref="UdpClient" /> will bind to this port for sending messages.
-		/// </para>
-		/// <para>
-		/// Setting the value to 0 (the default) will cause the udp client not to bind to
-		/// a local port.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentOutOfRangeException">The value specified is less than <see cref="IPEndPoint.MinPort" /> or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
-		public int LocalPort
-		{
-			get { return m_localPort; }
-			set 
-			{
-				if (value != 0 && (value < IPEndPoint.MinPort || value > IPEndPoint.MaxPort))
-				{
-					throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("value", (object)value,
-						"The value specified is less than " + 
-						IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) + 
-						" or greater than " + 
-						IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
-				} 
-				else 
-				{
-					m_localPort = value;
-				}
-			}
-		}
+    /// <summary>
+    /// Gets or sets the TCP port number from which the underlying <see cref="UdpClient" /> will communicate.
+    /// </summary>
+    /// <value>
+    /// An integer value in the range <see cref="IPEndPoint.MinPort" /> to <see cref="IPEndPoint.MaxPort" /> 
+    /// indicating the TCP port number from which the underlying <see cref="UdpClient" /> will communicate.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The underlying <see cref="UdpClient" /> will bind to this port for sending messages.
+    /// </para>
+    /// <para>
+    /// Setting the value to 0 (the default) will cause the udp client not to bind to
+    /// a local port.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentOutOfRangeException">The value specified is less than <see cref="IPEndPoint.MinPort" /> or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
+    public int LocalPort
+    {
+      get { return m_localPort; }
+      set
+      {
+        if (value != 0 && (value < IPEndPoint.MinPort || value > IPEndPoint.MaxPort))
+        {
+          throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("value", (object)value,
+            "The value specified is less than " +
+            IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) +
+            " or greater than " +
+            IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
+        }
+        else
+        {
+          m_localPort = value;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets <see cref="Encoding"/> used to write the packets.
-		/// </summary>
-		/// <value>
-		/// The <see cref="Encoding"/> used to write the packets.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="Encoding"/> used to write the packets.
-		/// </para>
-		/// </remarks>
-		public Encoding Encoding
-		{
-			get { return m_encoding; }
-			set { m_encoding = value; }
-		}
+    /// <summary>
+    /// Gets or sets <see cref="Encoding"/> used to write the packets.
+    /// </summary>
+    /// <value>
+    /// The <see cref="Encoding"/> used to write the packets.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="Encoding"/> used to write the packets.
+    /// </para>
+    /// </remarks>
+    public Encoding Encoding
+    {
+      get { return m_encoding; }
+      set { m_encoding = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Protected Instance Properties
+    #region Protected Instance Properties
 
-		/// <summary>
-		/// Gets or sets the underlying <see cref="UdpClient" />.
-		/// </summary>
-		/// <value>
-		/// The underlying <see cref="UdpClient" />.
-		/// </value>
-		/// <remarks>
-		/// <see cref="UdpAppender" /> creates a <see cref="UdpClient" /> to send logging events 
-		/// over a network.  Classes deriving from <see cref="UdpAppender" /> can use this
-		/// property to get or set this <see cref="UdpClient" />.  Use the underlying <see cref="UdpClient" />
-		/// returned from <see cref="Client" /> if you require access beyond that which 
-		/// <see cref="UdpAppender" /> provides.
-		/// </remarks>
-		protected UdpClient Client
-		{
-			get { return this.m_client; }
-			set { this.m_client = value; }
-		}
+    /// <summary>
+    /// Gets or sets the underlying <see cref="UdpClient" />.
+    /// </summary>
+    /// <value>
+    /// The underlying <see cref="UdpClient" />.
+    /// </value>
+    /// <remarks>
+    /// <see cref="UdpAppender" /> creates a <see cref="UdpClient" /> to send logging events 
+    /// over a network.  Classes deriving from <see cref="UdpAppender" /> can use this
+    /// property to get or set this <see cref="UdpClient" />.  Use the underlying <see cref="UdpClient" />
+    /// returned from <see cref="Client" /> if you require access beyond that which 
+    /// <see cref="UdpAppender" /> provides.
+    /// </remarks>
+    protected UdpClient Client
+    {
+      get { return this.m_client; }
+      set { this.m_client = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the cached remote endpoint to which the logging events should be sent.
-		/// </summary>
-		/// <value>
-		/// The cached remote endpoint to which the logging events will be sent.
-		/// </value>
-		/// <remarks>
-		/// The <see cref="ActivateOptions" /> method will initialize the remote endpoint 
-		/// with the values of the <see cref="RemoteAddress" /> and <see cref="RemotePort"/>
-		/// properties.
-		/// </remarks>
-		protected IPEndPoint RemoteEndPoint
-		{
-			get { return this.m_remoteEndPoint; }
-			set { this.m_remoteEndPoint = value; }
-		}
+    /// <summary>
+    /// Gets or sets the cached remote endpoint to which the logging events should be sent.
+    /// </summary>
+    /// <value>
+    /// The cached remote endpoint to which the logging events will be sent.
+    /// </value>
+    /// <remarks>
+    /// The <see cref="ActivateOptions" /> method will initialize the remote endpoint 
+    /// with the values of the <see cref="RemoteAddress" /> and <see cref="RemotePort"/>
+    /// properties.
+    /// </remarks>
+    protected IPEndPoint RemoteEndPoint
+    {
+      get { return this.m_remoteEndPoint; }
+      set { this.m_remoteEndPoint = value; }
+    }
 
-		#endregion Protected Instance Properties
+    #endregion Protected Instance Properties
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the appender based on the options set.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// The appender will be ignored if no <see cref="RemoteAddress" /> was specified or 
-		/// an invalid remote or local TCP port number was specified.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">The required property <see cref="RemoteAddress" /> was not specified.</exception>
-		/// <exception cref="ArgumentOutOfRangeException">The TCP port number assigned to <see cref="LocalPort" /> or <see cref="RemotePort" /> is less than <see cref="IPEndPoint.MinPort" /> or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
-		public override void ActivateOptions()
-		{
-			base.ActivateOptions();
+    /// <summary>
+    /// Initialize the appender based on the options set.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// The appender will be ignored if no <see cref="RemoteAddress" /> was specified or 
+    /// an invalid remote or local TCP port number was specified.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">The required property <see cref="RemoteAddress" /> was not specified.</exception>
+    /// <exception cref="ArgumentOutOfRangeException">The TCP port number assigned to <see cref="LocalPort" /> or <see cref="RemotePort" /> is less than <see cref="IPEndPoint.MinPort" /> or greater than <see cref="IPEndPoint.MaxPort" />.</exception>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-			if (this.RemoteAddress == null) 
-			{
-				throw new ArgumentNullException("The required property 'Address' was not specified.");
-			} 
-			else if (this.RemotePort < IPEndPoint.MinPort || this.RemotePort > IPEndPoint.MaxPort) 
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("this.RemotePort", (object)this.RemotePort,
-					"The RemotePort is less than " + 
-					IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) + 
-					" or greater than " + 
-					IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
-			} 
-			else if (this.LocalPort != 0 && (this.LocalPort < IPEndPoint.MinPort || this.LocalPort > IPEndPoint.MaxPort))
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("this.LocalPort", (object)this.LocalPort,
-					"The LocalPort is less than " + 
-					IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) + 
-					" or greater than " + 
-					IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
-			} 
-			else 
-			{
-				this.RemoteEndPoint = new IPEndPoint(this.RemoteAddress, this.RemotePort);
-				this.InitializeClientConnection();
-			}
-		}
+      if (this.RemoteAddress == null)
+      {
+        throw new ArgumentNullException("The required property 'Address' was not specified.");
+      }
+      else if (this.RemotePort < IPEndPoint.MinPort || this.RemotePort > IPEndPoint.MaxPort)
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("this.RemotePort", (object)this.RemotePort,
+          "The RemotePort is less than " +
+          IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) +
+          " or greater than " +
+          IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
+      }
+      else if (this.LocalPort != 0 && (this.LocalPort < IPEndPoint.MinPort || this.LocalPort > IPEndPoint.MaxPort))
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("this.LocalPort", (object)this.LocalPort,
+          "The LocalPort is less than " +
+          IPEndPoint.MinPort.ToString(NumberFormatInfo.InvariantInfo) +
+          " or greater than " +
+          IPEndPoint.MaxPort.ToString(NumberFormatInfo.InvariantInfo) + ".");
+      }
+      else
+      {
+        this.RemoteEndPoint = new IPEndPoint(this.RemoteAddress, this.RemotePort);
+        this.InitializeClientConnection();
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region Override implementation of AppenderSkeleton
+    #region Override implementation of AppenderSkeleton
 
-		/// <summary>
-		/// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Sends the event using an UDP datagram.
-		/// </para>
-		/// <para>
-		/// Exceptions are passed to the <see cref="AppenderSkeleton.ErrorHandler"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Append(LoggingEvent loggingEvent) 
-		{
-			try 
-			{
-				Byte [] buffer = m_encoding.GetBytes(RenderLoggingEvent(loggingEvent).ToCharArray());
+    /// <summary>
+    /// This method is called by the <see cref="M:AppenderSkeleton.DoAppend(LoggingEvent)"/> method.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Sends the event using an UDP datagram.
+    /// </para>
+    /// <para>
+    /// Exceptions are passed to the <see cref="AppenderSkeleton.ErrorHandler"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Append(LoggingEvent loggingEvent)
+    {
+      try
+      {
+        Byte[] buffer = m_encoding.GetBytes(RenderLoggingEvent(loggingEvent).ToCharArray());
 #if NETSTANDARD
-				Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait();
+        Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait();
 #else
-				this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint);
+        this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint);
 #endif
-			} 
-			catch (Exception ex) 
-			{
-				ErrorHandler.Error(
-					"Unable to send logging event to remote host " + 
-					this.RemoteAddress.ToString() + 
-					" on port " + 
-					this.RemotePort + ".", 
-					ex, 
-					ErrorCode.WriteFailure);
-			}
-		}
+      }
+      catch (Exception ex)
+      {
+        ErrorHandler.Error(
+          "Unable to send logging event to remote host " +
+          this.RemoteAddress.ToString() +
+          " on port " +
+          this.RemotePort + ".",
+          ex,
+          ErrorCode.WriteFailure);
+      }
+    }
 
-		/// <summary>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// This appender requires a <see cref="Layout"/> to be set.
-		/// </para>
-		/// </remarks>
-		protected override bool RequiresLayout
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// This appender requires a <see cref="Layout"/> to be set.
+    /// </para>
+    /// </remarks>
+    protected override bool RequiresLayout
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Closes the UDP connection and releases all resources associated with 
-		/// this <see cref="UdpAppender" /> instance.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Disables the underlying <see cref="UdpClient" /> and releases all managed 
-		/// and unmanaged resources associated with the <see cref="UdpAppender" />.
-		/// </para>
-		/// </remarks>
-		protected override void OnClose() 
-		{
-			base.OnClose();
+    /// <summary>
+    /// Closes the UDP connection and releases all resources associated with 
+    /// this <see cref="UdpAppender" /> instance.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Disables the underlying <see cref="UdpClient" /> and releases all managed 
+    /// and unmanaged resources associated with the <see cref="UdpAppender" />.
+    /// </para>
+    /// </remarks>
+    protected override void OnClose()
+    {
+      base.OnClose();
 
-			if (this.Client != null) 
-			{
-				this.Client.Close();
-			}
-		}
+      if (this.Client != null)
+      {
+        this.Client.Close();
+      }
+    }
 
-		#endregion Override implementation of AppenderSkeleton
+    #endregion Override implementation of AppenderSkeleton
 
-		#region Protected Instance Methods
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Initializes the underlying  <see cref="UdpClient" /> connection.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The underlying <see cref="UdpClient"/> is initialized and binds to the 
-		/// port number from which you intend to communicate.
-		/// </para>
-		/// <para>
-		/// Exceptions are passed to the <see cref="AppenderSkeleton.ErrorHandler"/>.
-		/// </para>
-		/// </remarks>
-		protected virtual void InitializeClientConnection() 
-		{
-			try 
-			{
-				if (this.LocalPort == 0)
-				{
+    /// <summary>
+    /// Initializes the underlying  <see cref="UdpClient" /> connection.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The underlying <see cref="UdpClient"/> is initialized and binds to the 
+    /// port number from which you intend to communicate.
+    /// </para>
+    /// <para>
+    /// Exceptions are passed to the <see cref="AppenderSkeleton.ErrorHandler"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual void InitializeClientConnection()
+    {
+      try
+      {
+        if (this.LocalPort == 0)
+        {
 #if NETCF || NET_1_0 || SSCLI_1_0 || CLI_1_0
-					this.Client = new UdpClient();
+          this.Client = new UdpClient();
 #else
-					this.Client = new UdpClient(RemoteAddress.AddressFamily);
+          this.Client = new UdpClient(RemoteAddress.AddressFamily);
 #endif
-				}
-				else
-				{
+        }
+        else
+        {
 #if NETCF || NET_1_0 || SSCLI_1_0 || CLI_1_0
-					this.Client = new UdpClient(this.LocalPort);
+          this.Client = new UdpClient(this.LocalPort);
 #else
-					this.Client = new UdpClient(this.LocalPort, RemoteAddress.AddressFamily);
+          this.Client = new UdpClient(this.LocalPort, RemoteAddress.AddressFamily);
 #endif
-				}
-			} 
-			catch (Exception ex) 
-			{
-				ErrorHandler.Error(
-					"Could not initialize the UdpClient connection on port " + 
-					this.LocalPort.ToString(NumberFormatInfo.InvariantInfo) + ".", 
-					ex, 
-					ErrorCode.GenericFailure);
+        }
+      }
+      catch (Exception ex)
+      {
+        ErrorHandler.Error(
+          "Could not initialize the UdpClient connection on port " +
+          this.LocalPort.ToString(NumberFormatInfo.InvariantInfo) + ".",
+          ex,
+          ErrorCode.GenericFailure);
 
-				this.Client = null;
-			}
-		}
+        this.Client = null;
+      }
+    }
 
-		#endregion Protected Instance Methods
+    #endregion Protected Instance Methods
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The IP address of the remote host or multicast group to which 
-		/// the logging event will be sent.
-		/// </summary>
-		private IPAddress m_remoteAddress;
-		
-		/// <summary>
-		/// The TCP port number of the remote host or multicast group to 
-		/// which the logging event will be sent.
-		/// </summary>
-		private int m_remotePort;
+    /// <summary>
+    /// The IP address of the remote host or multicast group to which 
+    /// the logging event will be sent.
+    /// </summary>
+    private IPAddress m_remoteAddress;
 
-		/// <summary>
-		/// The cached remote endpoint to which the logging events will be sent.
-		/// </summary>
-		private IPEndPoint m_remoteEndPoint;
+    /// <summary>
+    /// The TCP port number of the remote host or multicast group to 
+    /// which the logging event will be sent.
+    /// </summary>
+    private int m_remotePort;
 
-		/// <summary>
-		/// The TCP port number from which the <see cref="UdpClient" /> will communicate.
-		/// </summary>
-		private int m_localPort;
+    /// <summary>
+    /// The cached remote endpoint to which the logging events will be sent.
+    /// </summary>
+    private IPEndPoint m_remoteEndPoint;
 
-		/// <summary>
-		/// The <see cref="UdpClient" /> instance that will be used for sending the 
-		/// logging events.
-		/// </summary>
-		private UdpClient m_client;
+    /// <summary>
+    /// The TCP port number from which the <see cref="UdpClient" /> will communicate.
+    /// </summary>
+    private int m_localPort;
 
-		/// <summary>
-		/// The encoding to use for the packet.
-		/// </summary>
+    /// <summary>
+    /// The <see cref="UdpClient" /> instance that will be used for sending the 
+    /// logging events.
+    /// </summary>
+    private UdpClient m_client;
+
+    /// <summary>
+    /// The encoding to use for the packet.
+    /// </summary>
 #if NETSTANDARD
-		private Encoding m_encoding = Encoding.Unicode;
+    private Encoding m_encoding = Encoding.Unicode;
 #else
-		private Encoding m_encoding = Encoding.Default;
+    private Encoding m_encoding = Encoding.Default;
 #endif
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/AssemblyInfo.cs b/src/log4net/AssemblyInfo.cs
index 2cae3b9..3c55f6b 100644
--- a/src/log4net/AssemblyInfo.cs
+++ b/src/log4net/AssemblyInfo.cs
@@ -137,8 +137,8 @@
 
 [assembly: AssemblyProduct("log4net")]
 [assembly: AssemblyDefaultAlias("log4net")]
-[assembly: AssemblyCulture("")]		
-		
+[assembly: AssemblyCulture("")]
+
 //
 // In order to sign your assembly you must specify a key to use. Refer to the 
 // Microsoft .NET Framework documentation for more information on assembly signing.
diff --git a/src/log4net/Config/AliasDomainAttribute.cs b/src/log4net/Config/AliasDomainAttribute.cs
index 11906f6..c1da999 100644
--- a/src/log4net/Config/AliasDomainAttribute.cs
+++ b/src/log4net/Config/AliasDomainAttribute.cs
@@ -24,51 +24,51 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute that specifies a domain to alias to this assembly's repository.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <b>AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute.</b>
-	/// </para>
-	/// <para>
-	/// An assembly's logger repository is defined by its <see cref="DomainAttribute"/>,
-	/// however this can be overridden by an assembly loaded before the target assembly.
-	/// </para>
-	/// <para>
-	/// An assembly can alias another assembly's domain to its repository by
-	/// specifying this attribute with the name of the target domain.
-	/// </para>
-	/// <para>
-	/// This attribute can only be specified on the assembly and may be used
-	/// as many times as necessary to alias all the required domains.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true)]
-	[Serializable]
-	[Obsolete("Use AliasRepositoryAttribute instead of AliasDomainAttribute")]
-	public sealed class AliasDomainAttribute : AliasRepositoryAttribute
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Assembly level attribute that specifies a domain to alias to this assembly's repository.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <b>AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute.</b>
+  /// </para>
+  /// <para>
+  /// An assembly's logger repository is defined by its <see cref="DomainAttribute"/>,
+  /// however this can be overridden by an assembly loaded before the target assembly.
+  /// </para>
+  /// <para>
+  /// An assembly can alias another assembly's domain to its repository by
+  /// specifying this attribute with the name of the target domain.
+  /// </para>
+  /// <para>
+  /// This attribute can only be specified on the assembly and may be used
+  /// as many times as necessary to alias all the required domains.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
+  [Serializable]
+  [Obsolete("Use AliasRepositoryAttribute instead of AliasDomainAttribute")]
+  public sealed class AliasDomainAttribute : AliasRepositoryAttribute
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="AliasDomainAttribute" /> class with 
-		/// the specified domain to alias to this assembly's repository.
-		/// </summary>
-		/// <param name="name">The domain to alias to this assemby's repository.</param>
-		/// <remarks>
-		/// <para>
-		/// Obsolete. Use <see cref="AliasRepositoryAttribute"/> instead of <see cref="AliasDomainAttribute"/>.
-		/// </para>
-		/// </remarks>
-		public AliasDomainAttribute(string name) : base(name)
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AliasDomainAttribute" /> class with 
+    /// the specified domain to alias to this assembly's repository.
+    /// </summary>
+    /// <param name="name">The domain to alias to this assemby's repository.</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete. Use <see cref="AliasRepositoryAttribute"/> instead of <see cref="AliasDomainAttribute"/>.
+    /// </para>
+    /// </remarks>
+    public AliasDomainAttribute(string name) : base(name)
+    {
+    }
 
-		#endregion Public Instance Constructors
-	}
+    #endregion Public Instance Constructors
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/AliasRepositoryAttribute.cs b/src/log4net/Config/AliasRepositoryAttribute.cs
index da83b77..29b4a8f 100644
--- a/src/log4net/Config/AliasRepositoryAttribute.cs
+++ b/src/log4net/Config/AliasRepositoryAttribute.cs
@@ -24,80 +24,80 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute that specifies a repository to alias to this assembly's repository.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// An assembly's logger repository is defined by its <see cref="RepositoryAttribute"/>,
-	/// however this can be overridden by an assembly loaded before the target assembly.
-	/// </para>
-	/// <para>
-	/// An assembly can alias another assembly's repository to its repository by
-	/// specifying this attribute with the name of the target repository.
-	/// </para>
-	/// <para>
-	/// This attribute can only be specified on the assembly and may be used
-	/// as many times as necessary to alias all the required repositories.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true)]
-	[Serializable]
-	public /*sealed*/ class AliasRepositoryAttribute : Attribute
-	{
-		//
-		// Class is not sealed because AliasDomainAttribute extends it while it is obsoleted
-		// 
+  /// <summary>
+  /// Assembly level attribute that specifies a repository to alias to this assembly's repository.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// An assembly's logger repository is defined by its <see cref="RepositoryAttribute"/>,
+  /// however this can be overridden by an assembly loaded before the target assembly.
+  /// </para>
+  /// <para>
+  /// An assembly can alias another assembly's repository to its repository by
+  /// specifying this attribute with the name of the target repository.
+  /// </para>
+  /// <para>
+  /// This attribute can only be specified on the assembly and may be used
+  /// as many times as necessary to alias all the required repositories.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
+  [Serializable]
+  public /*sealed*/ class AliasRepositoryAttribute : Attribute
+  {
+    //
+    // Class is not sealed because AliasDomainAttribute extends it while it is obsoleted
+    // 
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="AliasRepositoryAttribute" /> class with 
-		/// the specified repository to alias to this assembly's repository.
-		/// </summary>
-		/// <param name="name">The repository to alias to this assemby's repository.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="AliasRepositoryAttribute" /> class with 
-		/// the specified repository to alias to this assembly's repository.
-		/// </para>
-		/// </remarks>
-		public AliasRepositoryAttribute(string name)
-		{
-			Name = name;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="AliasRepositoryAttribute" /> class with 
+    /// the specified repository to alias to this assembly's repository.
+    /// </summary>
+    /// <param name="name">The repository to alias to this assemby's repository.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="AliasRepositoryAttribute" /> class with 
+    /// the specified repository to alias to this assembly's repository.
+    /// </para>
+    /// </remarks>
+    public AliasRepositoryAttribute(string name)
+    {
+      Name = name;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the repository to alias to this assemby's repository.
-		/// </summary>
-		/// <value>
-		/// The repository to alias to this assemby's repository.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of the repository to alias to this assemby's repository.
-		/// </para>
-		/// </remarks>
-		public string Name
-		{
-			get { return m_name; }
-			set { m_name = value ; }
-		}
+    /// <summary>
+    /// Gets or sets the repository to alias to this assemby's repository.
+    /// </summary>
+    /// <value>
+    /// The repository to alias to this assemby's repository.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of the repository to alias to this assemby's repository.
+    /// </para>
+    /// </remarks>
+    public string Name
+    {
+      get { return m_name; }
+      set { m_name = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private string m_name = null;
+    private string m_name = null;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/BasicConfigurator.cs b/src/log4net/Config/BasicConfigurator.cs
index 374cf72..53afeae 100644
--- a/src/log4net/Config/BasicConfigurator.cs
+++ b/src/log4net/Config/BasicConfigurator.cs
@@ -31,206 +31,206 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Use this class to quickly configure a <see cref="Hierarchy"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Allows very simple programmatic configuration of log4net.
-	/// </para>
-	/// <para>
-	/// Only one appender can be configured using this configurator.
-	/// The appender is set at the root of the hierarchy and all logging
-	/// events will be delivered to that appender.
-	/// </para>
-	/// <para>
-	/// Appenders can also implement the <see cref="log4net.Core.IOptionHandler"/> interface. Therefore
-	/// they would require that the <see cref="M:log4net.Core.IOptionHandler.ActivateOptions()"/> method
-	/// be called after the appenders properties have been configured.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class BasicConfigurator
+  /// <summary>
+  /// Use this class to quickly configure a <see cref="Hierarchy"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Allows very simple programmatic configuration of log4net.
+  /// </para>
+  /// <para>
+  /// Only one appender can be configured using this configurator.
+  /// The appender is set at the root of the hierarchy and all logging
+  /// events will be delivered to that appender.
+  /// </para>
+  /// <para>
+  /// Appenders can also implement the <see cref="log4net.Core.IOptionHandler"/> interface. Therefore
+  /// they would require that the <see cref="M:log4net.Core.IOptionHandler.ActivateOptions()"/> method
+  /// be called after the appenders properties have been configured.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class BasicConfigurator
+  {
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the BasicConfigurator class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(BasicConfigurator);
+
+    #endregion Private Static Fields
+
+    #region Private Instance Constructors
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="BasicConfigurator" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </para>
+    /// </remarks>
+    private BasicConfigurator()
     {
-	    #region Private Static Fields
+    }
 
-	    /// <summary>
-	    /// The fully qualified type of the BasicConfigurator class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(BasicConfigurator);
+    #endregion Private Instance Constructors
 
-	    #endregion Private Static Fields
-
-        #region Private Instance Constructors
-
-        /// <summary>
-		/// Initializes a new instance of the <see cref="BasicConfigurator" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </para>
-		/// </remarks>
-		private BasicConfigurator()
-		{
-		}
-
-		#endregion Private Instance Constructors
-
-		#region Public Static Methods
+    #region Public Static Methods
 
 #if !NETSTANDARD1_3
-		/// <summary>
-		/// Initializes the log4net system with a default configuration.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes the log4net logging system using a <see cref="ConsoleAppender"/>
-		/// that will write to <c>Console.Out</c>. The log messages are
-		/// formatted using the <see cref="PatternLayout"/> layout object
-		/// with the <see cref="PatternLayout.DetailConversionPattern"/>
-		/// layout style.
-		/// </para>
-		/// </remarks>
-        public static ICollection Configure()
-		{
-            return BasicConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));
-        }
+    /// <summary>
+    /// Initializes the log4net system with a default configuration.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes the log4net logging system using a <see cref="ConsoleAppender"/>
+    /// that will write to <c>Console.Out</c>. The log messages are
+    /// formatted using the <see cref="PatternLayout"/> layout object
+    /// with the <see cref="PatternLayout.DetailConversionPattern"/>
+    /// layout style.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure()
+    {
+      return BasicConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));
+    }
 
-        /// <summary>
-        /// Initializes the log4net system using the specified appenders.
-        /// </summary>
-        /// <param name="appenders">The appenders to use to log all logging events.</param>
-        /// <remarks>
-        /// <para>
-        /// Initializes the log4net system using the specified appenders.
-        /// </para>
-        /// </remarks>
-        public static ICollection Configure(params IAppender[] appenders)
-        {
-            ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Initializes the log4net system using the specified appenders.
+    /// </summary>
+    /// <param name="appenders">The appenders to use to log all logging events.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes the log4net system using the specified appenders.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(params IAppender[] appenders)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-            ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
+      ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
 
-            using (new LogLog.LogReceivedAdapter(configurationMessages))
-            {
-                InternalConfigure(repository, appenders);
-            }
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, appenders);
+      }
 
-            repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-            return configurationMessages;
-        }
+      return configurationMessages;
+    }
 
-	    /// <summary>
-		/// Initializes the log4net system using the specified appender.
-		/// </summary>
-		/// <param name="appender">The appender to use to log all logging events.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes the log4net system using the specified appender.
-		/// </para>
-		/// </remarks>
-		public static ICollection Configure(IAppender appender) 
-		{
-            return Configure(new IAppender[] { appender });
-		}
+    /// <summary>
+    /// Initializes the log4net system using the specified appender.
+    /// </summary>
+    /// <param name="appender">The appender to use to log all logging events.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes the log4net system using the specified appender.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(IAppender appender)
+    {
+      return Configure(new IAppender[] { appender });
+    }
 #endif // !NETSTANDARD1_3
 
-		/// <summary>
-		/// Initializes the <see cref="ILoggerRepository"/> with a default configuration.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes the specified repository using a <see cref="ConsoleAppender"/>
-		/// that will write to <c>Console.Out</c>. The log messages are
-		/// formatted using the <see cref="PatternLayout"/> layout object
-		/// with the <see cref="PatternLayout.DetailConversionPattern"/>
-		/// layout style.
-		/// </para>
-		/// </remarks>
-        public static ICollection Configure(ILoggerRepository repository) 
-		{
-            ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Initializes the <see cref="ILoggerRepository"/> with a default configuration.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes the specified repository using a <see cref="ConsoleAppender"/>
+    /// that will write to <c>Console.Out</c>. The log messages are
+    /// formatted using the <see cref="PatternLayout"/> layout object
+    /// with the <see cref="PatternLayout.DetailConversionPattern"/>
+    /// layout style.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(ILoggerRepository repository)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-            using (new LogLog.LogReceivedAdapter(configurationMessages))
-            {
-                // Create the layout
-                PatternLayout layout = new PatternLayout();
-                layout.ConversionPattern = PatternLayout.DetailConversionPattern;
-                layout.ActivateOptions();
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        // Create the layout
+        PatternLayout layout = new PatternLayout();
+        layout.ConversionPattern = PatternLayout.DetailConversionPattern;
+        layout.ActivateOptions();
 
-                // Create the appender
-                ConsoleAppender appender = new ConsoleAppender();
-                appender.Layout = layout;
-                appender.ActivateOptions();
+        // Create the appender
+        ConsoleAppender appender = new ConsoleAppender();
+        appender.Layout = layout;
+        appender.ActivateOptions();
 
-                InternalConfigure(repository, appender);
-            }
+        InternalConfigure(repository, appender);
+      }
 
-            repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-            return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-        /// <summary>
-        /// Initializes the <see cref="ILoggerRepository"/> using the specified appender.
-        /// </summary>
-        /// <param name="repository">The repository to configure.</param>
-        /// <param name="appender">The appender to use to log all logging events.</param>
-        /// <remarks>
-        /// <para>
-        /// Initializes the <see cref="ILoggerRepository"/> using the specified appender.
-        /// </para>
-        /// </remarks>
-        public static ICollection Configure(ILoggerRepository repository, IAppender appender)
-        {
-            return Configure(repository, new IAppender[] { appender });
-        }
+    /// <summary>
+    /// Initializes the <see cref="ILoggerRepository"/> using the specified appender.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="appender">The appender to use to log all logging events.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes the <see cref="ILoggerRepository"/> using the specified appender.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(ILoggerRepository repository, IAppender appender)
+    {
+      return Configure(repository, new IAppender[] { appender });
+    }
 
-        /// <summary>
-        /// Initializes the <see cref="ILoggerRepository"/> using the specified appenders.
-        /// </summary>
-        /// <param name="repository">The repository to configure.</param>
-        /// <param name="appenders">The appenders to use to log all logging events.</param>
-        /// <remarks>
-        /// <para>
-        /// Initializes the <see cref="ILoggerRepository"/> using the specified appender.
-        /// </para>
-        /// </remarks>
-        public static ICollection Configure(ILoggerRepository repository, params IAppender[] appenders)
-        {
-            ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Initializes the <see cref="ILoggerRepository"/> using the specified appenders.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="appenders">The appenders to use to log all logging events.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes the <see cref="ILoggerRepository"/> using the specified appender.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(ILoggerRepository repository, params IAppender[] appenders)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-            using (new LogLog.LogReceivedAdapter(configurationMessages))
-            {
-                InternalConfigure(repository, appenders);
-            }
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, appenders);
+      }
 
-            repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-            return configurationMessages;
-        }
-	    
-		private static void InternalConfigure(ILoggerRepository repository, params IAppender[] appenders) 
-		{
-            IBasicRepositoryConfigurator configurableRepository = repository as IBasicRepositoryConfigurator;
-            if (configurableRepository != null)
-            {
-                configurableRepository.Configure(appenders);
-            }
-            else
-            {
-                LogLog.Warn(declaringType, "BasicConfigurator: Repository [" + repository + "] does not support the BasicConfigurator");
-            }
-		}
+      return configurationMessages;
+    }
 
-		#endregion Public Static Methods
-	}
+    private static void InternalConfigure(ILoggerRepository repository, params IAppender[] appenders)
+    {
+      IBasicRepositoryConfigurator configurableRepository = repository as IBasicRepositoryConfigurator;
+      if (configurableRepository != null)
+      {
+        configurableRepository.Configure(appenders);
+      }
+      else
+      {
+        LogLog.Warn(declaringType, "BasicConfigurator: Repository [" + repository + "] does not support the BasicConfigurator");
+      }
+    }
+
+    #endregion Public Static Methods
+  }
 }
diff --git a/src/log4net/Config/ConfiguratorAttribute.cs b/src/log4net/Config/ConfiguratorAttribute.cs
index e3da674..c884736 100644
--- a/src/log4net/Config/ConfiguratorAttribute.cs
+++ b/src/log4net/Config/ConfiguratorAttribute.cs
@@ -27,87 +27,87 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Base class for all log4net configuration attributes.
-	/// </summary>
-	/// <remarks>
-	/// This is an abstract class that must be extended by 
-	/// specific configurators. This attribute allows the
-	/// configurator to be parameterized by an assembly level
-	/// attribute.
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly)]
-	public abstract class ConfiguratorAttribute : Attribute, IComparable
-	{
-		private int m_priority = 0;
+  /// <summary>
+  /// Base class for all log4net configuration attributes.
+  /// </summary>
+  /// <remarks>
+  /// This is an abstract class that must be extended by 
+  /// specific configurators. This attribute allows the
+  /// configurator to be parameterized by an assembly level
+  /// attribute.
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly)]
+  public abstract class ConfiguratorAttribute : Attribute, IComparable
+  {
+    private int m_priority = 0;
 
-		/// <summary>
-		/// Constructor used by subclasses.
-		/// </summary>
-		/// <param name="priority">the ordering priority for this configurator</param>
-		/// <remarks>
-		/// <para>
-		/// The <paramref name="priority"/> is used to order the configurator
-		/// attributes before they are invoked. Higher priority configurators are executed
-		/// before lower priority ones.
-		/// </para>
-		/// </remarks>
-		protected ConfiguratorAttribute(int priority)
-		{
-			m_priority = priority;
-		}
+    /// <summary>
+    /// Constructor used by subclasses.
+    /// </summary>
+    /// <param name="priority">the ordering priority for this configurator</param>
+    /// <remarks>
+    /// <para>
+    /// The <paramref name="priority"/> is used to order the configurator
+    /// attributes before they are invoked. Higher priority configurators are executed
+    /// before lower priority ones.
+    /// </para>
+    /// </remarks>
+    protected ConfiguratorAttribute(int priority)
+    {
+      m_priority = priority;
+    }
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> for the specified assembly.
-		/// </summary>
-		/// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
-		/// <param name="targetRepository">The repository to configure.</param>
-		/// <remarks>
-		/// <para>
-		/// Abstract method implemented by a subclass. When this method is called
-		/// the subclass should configure the <paramref name="targetRepository"/>.
-		/// </para>
-		/// </remarks>
-		public abstract void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository);
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> for the specified assembly.
+    /// </summary>
+    /// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+    /// <param name="targetRepository">The repository to configure.</param>
+    /// <remarks>
+    /// <para>
+    /// Abstract method implemented by a subclass. When this method is called
+    /// the subclass should configure the <paramref name="targetRepository"/>.
+    /// </para>
+    /// </remarks>
+    public abstract void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository);
 
-		/// <summary>
-		/// Compare this instance to another ConfiguratorAttribute
-		/// </summary>
-		/// <param name="obj">the object to compare to</param>
-		/// <returns>see <see cref="IComparable.CompareTo"/></returns>
-		/// <remarks>
-		/// <para>
-		/// Compares the priorities of the two <see cref="ConfiguratorAttribute"/> instances.
-		/// Sorts by priority in descending order. Objects with the same priority are
-		/// randomly ordered.
-		/// </para>
-		/// </remarks>
-		public int CompareTo(object obj)
-		{
-			// Reference equals
-			if ((object)this == obj)
-			{
-				return 0;
-			}
+    /// <summary>
+    /// Compare this instance to another ConfiguratorAttribute
+    /// </summary>
+    /// <param name="obj">the object to compare to</param>
+    /// <returns>see <see cref="IComparable.CompareTo"/></returns>
+    /// <remarks>
+    /// <para>
+    /// Compares the priorities of the two <see cref="ConfiguratorAttribute"/> instances.
+    /// Sorts by priority in descending order. Objects with the same priority are
+    /// randomly ordered.
+    /// </para>
+    /// </remarks>
+    public int CompareTo(object obj)
+    {
+      // Reference equals
+      if ((object)this == obj)
+      {
+        return 0;
+      }
 
-			int result = -1;
+      int result = -1;
 
-			ConfiguratorAttribute target = obj as ConfiguratorAttribute;
-			if (target != null)
-			{
-				// Compare the priorities
-				result = target.m_priority.CompareTo(m_priority);
-				if (result == 0)
-				{
-					// Same priority, so have to provide some ordering
-					result = -1;
-				}
-			}
-			return result;
-		}
-	}
+      ConfiguratorAttribute target = obj as ConfiguratorAttribute;
+      if (target != null)
+      {
+        // Compare the priorities
+        result = target.m_priority.CompareTo(m_priority);
+        if (result == 0)
+        {
+          // Same priority, so have to provide some ordering
+          result = -1;
+        }
+      }
+      return result;
+    }
+  }
 }
 
 #endif //!NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/DOMConfigurator.cs b/src/log4net/Config/DOMConfigurator.cs
index 2dd16d8..b7c1563 100644
--- a/src/log4net/Config/DOMConfigurator.cs
+++ b/src/log4net/Config/DOMConfigurator.cs
@@ -31,329 +31,329 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Use this class to initialize the log4net environment using an Xml tree.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-	/// </para>
-	/// <para>
-	/// Configures a <see cref="ILoggerRepository"/> using an Xml tree.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[Obsolete("Use XmlConfigurator instead of DOMConfigurator")]
-	public sealed class DOMConfigurator
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// Use this class to initialize the log4net environment using an Xml tree.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+  /// </para>
+  /// <para>
+  /// Configures a <see cref="ILoggerRepository"/> using an Xml tree.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [Obsolete("Use XmlConfigurator instead of DOMConfigurator")]
+  public sealed class DOMConfigurator
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private constructor
-		/// </summary>
-		private DOMConfigurator() 
-		{ 
-		}
+    /// <summary>
+    /// Private constructor
+    /// </summary>
+    private DOMConfigurator()
+    {
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Configure static methods
+    #region Configure static methods
 
-		/// <summary>
-		/// Automatically configures the log4net system based on the 
-		/// application's configuration settings.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// Each application has a configuration file. This has the
-		/// same name as the application with '.config' appended.
-		/// This file is XML and calling this function prompts the
-		/// configurator to look in that file for a section called
-		/// <c>log4net</c> that contains the configuration data.
-		/// </remarks>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure() 
-		{
-			XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));
-		}
+    /// <summary>
+    /// Automatically configures the log4net system based on the 
+    /// application's configuration settings.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// Each application has a configuration file. This has the
+    /// same name as the application with '.config' appended.
+    /// This file is XML and calling this function prompts the
+    /// configurator to look in that file for a section called
+    /// <c>log4net</c> that contains the configuration data.
+    /// </remarks>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure()
+    {
+      XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));
+    }
 
-		/// <summary>
-		/// Automatically configures the <see cref="ILoggerRepository"/> using settings
-		/// stored in the application's configuration file.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// Each application has a configuration file. This has the
-		/// same name as the application with '.config' appended.
-		/// This file is XML and calling this function prompts the
-		/// configurator to look in that file for a section called
-		/// <c>log4net</c> that contains the configuration data.
-		/// </remarks>
-		/// <param name="repository">The repository to configure.</param>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(ILoggerRepository repository) 
-		{
-			XmlConfigurator.Configure(repository);
-		}
+    /// <summary>
+    /// Automatically configures the <see cref="ILoggerRepository"/> using settings
+    /// stored in the application's configuration file.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// Each application has a configuration file. This has the
+    /// same name as the application with '.config' appended.
+    /// This file is XML and calling this function prompts the
+    /// configurator to look in that file for a section called
+    /// <c>log4net</c> that contains the configuration data.
+    /// </remarks>
+    /// <param name="repository">The repository to configure.</param>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(ILoggerRepository repository)
+    {
+      XmlConfigurator.Configure(repository);
+    }
 
-		/// <summary>
-		/// Configures log4net using a <c>log4net</c> element
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// Loads the log4net configuration from the XML element
-		/// supplied as <paramref name="element"/>.
-		/// </remarks>
-		/// <param name="element">The element to parse.</param>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(XmlElement element) 
-		{
-			XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), element);
-		}
+    /// <summary>
+    /// Configures log4net using a <c>log4net</c> element
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// Loads the log4net configuration from the XML element
+    /// supplied as <paramref name="element"/>.
+    /// </remarks>
+    /// <param name="element">The element to parse.</param>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(XmlElement element)
+    {
+      XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), element);
+    }
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified XML 
-		/// element.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// Loads the log4net configuration from the XML element
-		/// supplied as <paramref name="element"/>.
-		/// </remarks>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="element">The element to parse.</param>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(ILoggerRepository repository, XmlElement element) 
-		{
-			XmlConfigurator.Configure(repository, element);
-		}
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified XML 
+    /// element.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// Loads the log4net configuration from the XML element
+    /// supplied as <paramref name="element"/>.
+    /// </remarks>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="element">The element to parse.</param>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(ILoggerRepository repository, XmlElement element)
+    {
+      XmlConfigurator.Configure(repository, element);
+    }
 
-		/// <summary>
-		/// Configures log4net using the specified configuration file.
-		/// </summary>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the log4net configuration data.
-		/// </para>
-		/// <para>
-		/// The log4net configuration file can possible be specified in the application's
-		/// configuration file (either <c>MyAppName.exe.config</c> for a
-		/// normal application on <c>Web.config</c> for an ASP.NET application).
-		/// </para>
-		/// <example>
-		/// The following example configures log4net using a configuration file, of which the 
-		/// location is stored in the application's configuration file :
-		/// </example>
-		/// <code lang="C#">
-		/// using log4net.Config;
-		/// using System.IO;
-		/// using System.Configuration;
-		/// 
-		/// ...
-		/// 
-		/// DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
-		/// </code>
-		/// <para>
-		/// In the <c>.config</c> file, the path to the log4net can be specified like this :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net-config-file" value="log.config"/>
-		///		</appSettings>
-		///	</configuration>
-		/// </code>
-		/// </remarks>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(FileInfo configFile)
-		{
-			XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
-		}
+    /// <summary>
+    /// Configures log4net using the specified configuration file.
+    /// </summary>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the log4net configuration data.
+    /// </para>
+    /// <para>
+    /// The log4net configuration file can possible be specified in the application's
+    /// configuration file (either <c>MyAppName.exe.config</c> for a
+    /// normal application on <c>Web.config</c> for an ASP.NET application).
+    /// </para>
+    /// <example>
+    /// The following example configures log4net using a configuration file, of which the 
+    /// location is stored in the application's configuration file :
+    /// </example>
+    /// <code lang="C#">
+    /// using log4net.Config;
+    /// using System.IO;
+    /// using System.Configuration;
+    /// 
+    /// ...
+    /// 
+    /// DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+    /// </code>
+    /// <para>
+    /// In the <c>.config</c> file, the path to the log4net can be specified like this :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net-config-file" value="log.config"/>
+    ///    </appSettings>
+    ///  </configuration>
+    /// </code>
+    /// </remarks>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(FileInfo configFile)
+    {
+      XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
+    }
 
-		/// <summary>
-		/// Configures log4net using the specified configuration file.
-		/// </summary>
-		/// <param name="configStream">A stream to load the XML configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// <para>
-		/// The configuration data must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the log4net configuration data.
-		/// </para>
-		/// <para>
-		/// Note that this method will NOT close the stream parameter.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(Stream configStream)
-		{
-			XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configStream);
-		}
+    /// <summary>
+    /// Configures log4net using the specified configuration file.
+    /// </summary>
+    /// <param name="configStream">A stream to load the XML configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// <para>
+    /// The configuration data must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the log4net configuration data.
+    /// </para>
+    /// <para>
+    /// Note that this method will NOT close the stream parameter.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(Stream configStream)
+    {
+      XmlConfigurator.Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configStream);
+    }
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
-		/// file.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The log4net configuration file can possible be specified in the application's
-		/// configuration file (either <c>MyAppName.exe.config</c> for a
-		/// normal application on <c>Web.config</c> for an ASP.NET application).
-		/// </para>
-		/// <example>
-		/// The following example configures log4net using a configuration file, of which the 
-		/// location is stored in the application's configuration file :
-		/// </example>
-		/// <code lang="C#">
-		/// using log4net.Config;
-		/// using System.IO;
-		/// using System.Configuration;
-		/// 
-		/// ...
-		/// 
-		/// DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
-		/// </code>
-		/// <para>
-		/// In the <c>.config</c> file, the path to the log4net can be specified like this :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net-config-file" value="log.config"/>
-		///		</appSettings>
-		///	</configuration>
-		/// </code>
-		/// </remarks>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(ILoggerRepository repository, FileInfo configFile)
-		{
-			XmlConfigurator.Configure(repository, configFile);
-		}
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
+    /// file.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The log4net configuration file can possible be specified in the application's
+    /// configuration file (either <c>MyAppName.exe.config</c> for a
+    /// normal application on <c>Web.config</c> for an ASP.NET application).
+    /// </para>
+    /// <example>
+    /// The following example configures log4net using a configuration file, of which the 
+    /// location is stored in the application's configuration file :
+    /// </example>
+    /// <code lang="C#">
+    /// using log4net.Config;
+    /// using System.IO;
+    /// using System.Configuration;
+    /// 
+    /// ...
+    /// 
+    /// DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+    /// </code>
+    /// <para>
+    /// In the <c>.config</c> file, the path to the log4net can be specified like this :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net-config-file" value="log.config"/>
+    ///    </appSettings>
+    ///  </configuration>
+    /// </code>
+    /// </remarks>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(ILoggerRepository repository, FileInfo configFile)
+    {
+      XmlConfigurator.Configure(repository, configFile);
+    }
 
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
-		/// file.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configStream">The stream to load the XML configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// <para>
-		/// The configuration data must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// Note that this method will NOT close the stream parameter.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
-		public static void Configure(ILoggerRepository repository, Stream configStream)
-		{
-			XmlConfigurator.Configure(repository, configStream);
-		}
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
+    /// file.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configStream">The stream to load the XML configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// <para>
+    /// The configuration data must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// Note that this method will NOT close the stream parameter.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use XmlConfigurator.Configure instead of DOMConfigurator.Configure")]
+    public static void Configure(ILoggerRepository repository, Stream configStream)
+    {
+      XmlConfigurator.Configure(repository, configStream);
+    }
 
-		#endregion Configure static methods
+    #endregion Configure static methods
 
-		#region ConfigureAndWatch static methods
+    #region ConfigureAndWatch static methods
 
 #if (!NETCF && !SSCLI)
 
-		/// <summary>
-		/// Configures log4net using the file specified, monitors the file for changes 
-		/// and reloads the configuration if a change is detected.
-		/// </summary>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
-		/// and depends on the behavior of that class.
-		/// </para>
-		/// <para>
-		/// For more information on how to configure log4net using
-		/// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Configure(FileInfo)"/>
-		[Obsolete("Use XmlConfigurator.ConfigureAndWatch instead of DOMConfigurator.ConfigureAndWatch")]
-		public static void ConfigureAndWatch(FileInfo configFile)
-		{
-			XmlConfigurator.ConfigureAndWatch(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
-		}
+    /// <summary>
+    /// Configures log4net using the file specified, monitors the file for changes 
+    /// and reloads the configuration if a change is detected.
+    /// </summary>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
+    /// and depends on the behavior of that class.
+    /// </para>
+    /// <para>
+    /// For more information on how to configure log4net using
+    /// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Configure(FileInfo)"/>
+    [Obsolete("Use XmlConfigurator.ConfigureAndWatch instead of DOMConfigurator.ConfigureAndWatch")]
+    public static void ConfigureAndWatch(FileInfo configFile)
+    {
+      XmlConfigurator.ConfigureAndWatch(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
+    }
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the file specified, 
-		/// monitors the file for changes and reloads the configuration if a change 
-		/// is detected.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
-		/// </para>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
-		/// and depends on the behavior of that class.
-		/// </para>
-		/// <para>
-		/// For more information on how to configure log4net using
-		/// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Configure(FileInfo)"/>
-		[Obsolete("Use XmlConfigurator.ConfigureAndWatch instead of DOMConfigurator.ConfigureAndWatch")]
-		public static void ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile)
-		{
-			XmlConfigurator.ConfigureAndWatch(repository, configFile);
-		}
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the file specified, 
+    /// monitors the file for changes and reloads the configuration if a change 
+    /// is detected.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// <b>DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator.</b>
+    /// </para>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
+    /// and depends on the behavior of that class.
+    /// </para>
+    /// <para>
+    /// For more information on how to configure log4net using
+    /// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Configure(FileInfo)"/>
+    [Obsolete("Use XmlConfigurator.ConfigureAndWatch instead of DOMConfigurator.ConfigureAndWatch")]
+    public static void ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile)
+    {
+      XmlConfigurator.ConfigureAndWatch(repository, configFile);
+    }
 #endif
 
-		#endregion ConfigureAndWatch static methods
-	}
+    #endregion ConfigureAndWatch static methods
+  }
 }
 #endif // NET_2_0
diff --git a/src/log4net/Config/DOMConfiguratorAttribute.cs b/src/log4net/Config/DOMConfiguratorAttribute.cs
index e996b0e..4a2c2b5 100644
--- a/src/log4net/Config/DOMConfiguratorAttribute.cs
+++ b/src/log4net/Config/DOMConfiguratorAttribute.cs
@@ -30,31 +30,31 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute to configure the <see cref="XmlConfigurator"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <b>AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute.</b>
-	/// </para>
-	/// <para>
-	/// This attribute may only be used at the assembly scope and can only
-	/// be used once per assembly.
-	/// </para>
-	/// <para>
-	/// Use this attribute to configure the <see cref="XmlConfigurator"/>
-	/// without calling one of the <see cref="M:XmlConfigurator.Configure()"/>
-	/// methods.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly)]
-	[Serializable]
-	[Obsolete("Use XmlConfiguratorAttribute instead of DOMConfiguratorAttribute")]
-	public sealed class DOMConfiguratorAttribute : XmlConfiguratorAttribute
-	{
-	}
+  /// <summary>
+  /// Assembly level attribute to configure the <see cref="XmlConfigurator"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <b>AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute.</b>
+  /// </para>
+  /// <para>
+  /// This attribute may only be used at the assembly scope and can only
+  /// be used once per assembly.
+  /// </para>
+  /// <para>
+  /// Use this attribute to configure the <see cref="XmlConfigurator"/>
+  /// without calling one of the <see cref="M:XmlConfigurator.Configure()"/>
+  /// methods.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly)]
+  [Serializable]
+  [Obsolete("Use XmlConfiguratorAttribute instead of DOMConfiguratorAttribute")]
+  public sealed class DOMConfiguratorAttribute : XmlConfiguratorAttribute
+  {
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/DomainAttribute.cs b/src/log4net/Config/DomainAttribute.cs
index 8e49ff7..1aeab43 100644
--- a/src/log4net/Config/DomainAttribute.cs
+++ b/src/log4net/Config/DomainAttribute.cs
@@ -24,64 +24,64 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute that specifies the logging domain for the assembly.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <b>DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute.</b>
-	/// </para>
-	/// <para>
-	/// Assemblies are mapped to logging domains. Each domain has its own
-	/// logging repository. This attribute specified on the assembly controls
-	/// the configuration of the domain. The <see cref="RepositoryAttribute.Name"/> property specifies the name
-	/// of the domain that this assembly is a part of. The <see cref="RepositoryAttribute.RepositoryType"/>
-	/// specifies the type of the repository objects to create for the domain. If 
-	/// this attribute is not specified and a <see cref="RepositoryAttribute.Name"/> is not specified
-	/// then the assembly will be part of the default shared logging domain.
-	/// </para>
-	/// <para>
-	/// This attribute can only be specified on the assembly and may only be used
-	/// once per assembly.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly)]
-	[Serializable]
-	[Obsolete("Use RepositoryAttribute instead of DomainAttribute")]
-	public sealed class DomainAttribute : RepositoryAttribute
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Assembly level attribute that specifies the logging domain for the assembly.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <b>DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute.</b>
+  /// </para>
+  /// <para>
+  /// Assemblies are mapped to logging domains. Each domain has its own
+  /// logging repository. This attribute specified on the assembly controls
+  /// the configuration of the domain. The <see cref="RepositoryAttribute.Name"/> property specifies the name
+  /// of the domain that this assembly is a part of. The <see cref="RepositoryAttribute.RepositoryType"/>
+  /// specifies the type of the repository objects to create for the domain. If 
+  /// this attribute is not specified and a <see cref="RepositoryAttribute.Name"/> is not specified
+  /// then the assembly will be part of the default shared logging domain.
+  /// </para>
+  /// <para>
+  /// This attribute can only be specified on the assembly and may only be used
+  /// once per assembly.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly)]
+  [Serializable]
+  [Obsolete("Use RepositoryAttribute instead of DomainAttribute")]
+  public sealed class DomainAttribute : RepositoryAttribute
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="DomainAttribute" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Obsolete. Use RepositoryAttribute instead of DomainAttribute.
-		/// </para>
-		/// </remarks>
-		public DomainAttribute() : base()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="DomainAttribute" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Obsolete. Use RepositoryAttribute instead of DomainAttribute.
+    /// </para>
+    /// </remarks>
+    public DomainAttribute() : base()
+    {
+    }
 
-		/// <summary>
-		/// Initialize a new instance of the <see cref="DomainAttribute" /> class 
-		/// with the name of the domain.
-		/// </summary>
-		/// <param name="name">The name of the domain.</param>
-		/// <remarks>
-		/// <para>
-		/// Obsolete. Use RepositoryAttribute instead of DomainAttribute.
-		/// </para>
-		/// </remarks>
-		public DomainAttribute(string name) : base(name)
-		{
-		}
+    /// <summary>
+    /// Initialize a new instance of the <see cref="DomainAttribute" /> class 
+    /// with the name of the domain.
+    /// </summary>
+    /// <param name="name">The name of the domain.</param>
+    /// <remarks>
+    /// <para>
+    /// Obsolete. Use RepositoryAttribute instead of DomainAttribute.
+    /// </para>
+    /// </remarks>
+    public DomainAttribute(string name) : base(name)
+    {
+    }
 
-		#endregion Public Instance Constructors
-	}
+    #endregion Public Instance Constructors
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/Log4NetConfigurationSectionHandler.cs b/src/log4net/Config/Log4NetConfigurationSectionHandler.cs
index d5d4723..be34c8c 100644
--- a/src/log4net/Config/Log4NetConfigurationSectionHandler.cs
+++ b/src/log4net/Config/Log4NetConfigurationSectionHandler.cs
@@ -26,68 +26,68 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Class to register for the log4net section of the configuration file
-	/// </summary>
-	/// <remarks>
-	/// The log4net section of the configuration file needs to have a section
-	/// handler registered. This is the section handler used. It simply returns
-	/// the XML element that is the root of the section.
-	/// </remarks>
-	/// <example>
-	/// Example of registering the log4net section handler :
-	/// <code lang="XML" escaped="true">
-	/// <configuration>
-	///		<configSections>
-	///			<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
-	///		</configSections>
-	///		<log4net>
-	///			log4net configuration XML goes here
-	///		</log4net>
-	/// </configuration>
-	/// </code>
-	/// </example>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class Log4NetConfigurationSectionHandler : IConfigurationSectionHandler
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Class to register for the log4net section of the configuration file
+  /// </summary>
+  /// <remarks>
+  /// The log4net section of the configuration file needs to have a section
+  /// handler registered. This is the section handler used. It simply returns
+  /// the XML element that is the root of the section.
+  /// </remarks>
+  /// <example>
+  /// Example of registering the log4net section handler :
+  /// <code lang="XML" escaped="true">
+  /// <configuration>
+  ///    <configSections>
+  ///      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
+  ///    </configSections>
+  ///    <log4net>
+  ///      log4net configuration XML goes here
+  ///    </log4net>
+  /// </configuration>
+  /// </code>
+  /// </example>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class Log4NetConfigurationSectionHandler : IConfigurationSectionHandler
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="Log4NetConfigurationSectionHandler"/> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public Log4NetConfigurationSectionHandler()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="Log4NetConfigurationSectionHandler"/> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public Log4NetConfigurationSectionHandler()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Implementation of IConfigurationSectionHandler
+    #region Implementation of IConfigurationSectionHandler
 
-		/// <summary>
-		/// Parses the configuration section.
-		/// </summary>
-		/// <param name="parent">The configuration settings in a corresponding parent configuration section.</param>
-		/// <param name="configContext">The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference.</param>
-		/// <param name="section">The <see cref="XmlNode" /> for the log4net section.</param>
-		/// <returns>The <see cref="XmlNode" /> for the log4net section.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the <see cref="XmlNode"/> containing the configuration data,
-		/// </para>
-		/// </remarks>
-		public object Create(object parent, object configContext, XmlNode section)
-		{
-			return section;
-		}
+    /// <summary>
+    /// Parses the configuration section.
+    /// </summary>
+    /// <param name="parent">The configuration settings in a corresponding parent configuration section.</param>
+    /// <param name="configContext">The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference.</param>
+    /// <param name="section">The <see cref="XmlNode" /> for the log4net section.</param>
+    /// <returns>The <see cref="XmlNode" /> for the log4net section.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the <see cref="XmlNode"/> containing the configuration data,
+    /// </para>
+    /// </remarks>
+    public object Create(object parent, object configContext, XmlNode section)
+    {
+      return section;
+    }
 
-		#endregion Implementation of IConfigurationSectionHandler
-	}
+    #endregion Implementation of IConfigurationSectionHandler
+  }
 }
 
 #endif // !NETCF
diff --git a/src/log4net/Config/PluginAttribute.cs b/src/log4net/Config/PluginAttribute.cs
index b662972..21bbad7 100644
--- a/src/log4net/Config/PluginAttribute.cs
+++ b/src/log4net/Config/PluginAttribute.cs
@@ -30,169 +30,169 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute that specifies a plugin to attach to 
-	/// the repository.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Specifies the type of a plugin to create and attach to the
-	/// assembly's repository. The plugin type must implement the
-	/// <see cref="IPlugin"/> interface.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly,AllowMultiple=true)]
-	[Serializable]
-	public sealed class PluginAttribute : Attribute, IPluginFactory
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Assembly level attribute that specifies a plugin to attach to 
+  /// the repository.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Specifies the type of a plugin to create and attach to the
+  /// assembly's repository. The plugin type must implement the
+  /// <see cref="IPlugin"/> interface.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
+  [Serializable]
+  public sealed class PluginAttribute : Attribute, IPluginFactory
+  {
+    #region Public Instance Constructors
 
 #if !NETSTANDARD1_3 // Excluded because GetCallingAssembly() is not available in CoreFX (https://github.com/dotnet/corefx/issues/2221).
-		/// <summary>
-		/// Initializes a new instance of the <see cref="PluginAttribute" /> class
-		/// with the specified type.
-		/// </summary>
-		/// <param name="typeName">The type name of plugin to create.</param>
-		/// <remarks>
-		/// <para>
-		/// Create the attribute with the plugin type specified.
-		/// </para>
-		/// <para>
-		/// Where possible use the constructor that takes a <see cref="System.Type"/>.
-		/// </para>
-		/// </remarks>
-		public PluginAttribute(string typeName)
-		{
-			m_typeName = typeName;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="PluginAttribute" /> class
+    /// with the specified type.
+    /// </summary>
+    /// <param name="typeName">The type name of plugin to create.</param>
+    /// <remarks>
+    /// <para>
+    /// Create the attribute with the plugin type specified.
+    /// </para>
+    /// <para>
+    /// Where possible use the constructor that takes a <see cref="System.Type"/>.
+    /// </para>
+    /// </remarks>
+    public PluginAttribute(string typeName)
+    {
+      m_typeName = typeName;
+    }
 #endif
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="PluginAttribute" /> class
-		/// with the specified type.
-		/// </summary>
-		/// <param name="type">The type of plugin to create.</param>
-		/// <remarks>
-		/// <para>
-		/// Create the attribute with the plugin type specified.
-		/// </para>
-		/// </remarks>
-		public PluginAttribute(Type type)
-		{
-			m_type = type;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="PluginAttribute" /> class
+    /// with the specified type.
+    /// </summary>
+    /// <param name="type">The type of plugin to create.</param>
+    /// <remarks>
+    /// <para>
+    /// Create the attribute with the plugin type specified.
+    /// </para>
+    /// </remarks>
+    public PluginAttribute(Type type)
+    {
+      m_type = type;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the type for the plugin.
-		/// </summary>
-		/// <value>
-		/// The type for the plugin.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The type for the plugin.
-		/// </para>
-		/// </remarks>
-		public Type Type
-		{
-			get { return m_type; }
-			set { m_type = value ; }
-		}
+    /// <summary>
+    /// Gets or sets the type for the plugin.
+    /// </summary>
+    /// <value>
+    /// The type for the plugin.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The type for the plugin.
+    /// </para>
+    /// </remarks>
+    public Type Type
+    {
+      get { return m_type; }
+      set { m_type = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the type name for the plugin.
-		/// </summary>
-		/// <value>
-		/// The type name for the plugin.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The type name for the plugin.
-		/// </para>
-		/// <para>
-		/// Where possible use the <see cref="Type"/> property instead.
-		/// </para>
-		/// </remarks>
-		public string TypeName
-		{
-			get { return m_typeName; }
-			set { m_typeName = value ; }
-		}
+    /// <summary>
+    /// Gets or sets the type name for the plugin.
+    /// </summary>
+    /// <value>
+    /// The type name for the plugin.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The type name for the plugin.
+    /// </para>
+    /// <para>
+    /// Where possible use the <see cref="Type"/> property instead.
+    /// </para>
+    /// </remarks>
+    public string TypeName
+    {
+      get { return m_typeName; }
+      set { m_typeName = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Implementation of IPluginFactory
+    #region Implementation of IPluginFactory
 
-		/// <summary>
-		/// Creates the plugin object defined by this attribute.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Creates the instance of the <see cref="IPlugin"/> object as 
-		/// specified by this attribute.
-		/// </para>
-		/// </remarks>
-		/// <returns>The plugin object.</returns>
-		public IPlugin CreatePlugin()
-		{
-			Type pluginType = m_type;
+    /// <summary>
+    /// Creates the plugin object defined by this attribute.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Creates the instance of the <see cref="IPlugin"/> object as 
+    /// specified by this attribute.
+    /// </para>
+    /// </remarks>
+    /// <returns>The plugin object.</returns>
+    public IPlugin CreatePlugin()
+    {
+      Type pluginType = m_type;
 #if !NETSTANDARD1_3
-			if (m_type == null)
-			{
-				// Get the plugin object type from the string type name
-				pluginType = SystemInfo.GetTypeFromString(m_typeName, true, true);
-			}
+      if (m_type == null)
+      {
+        // Get the plugin object type from the string type name
+        pluginType = SystemInfo.GetTypeFromString(m_typeName, true, true);
+      }
 #endif
-			// Check that the type is a plugin
-			if (!(typeof(IPlugin).IsAssignableFrom(pluginType)))
-			{
-				throw new LogException("Plugin type [" + pluginType.FullName + "] does not implement the log4net.IPlugin interface");
-			}
+      // Check that the type is a plugin
+      if (!(typeof(IPlugin).IsAssignableFrom(pluginType)))
+      {
+        throw new LogException("Plugin type [" + pluginType.FullName + "] does not implement the log4net.IPlugin interface");
+      }
 
-			// Create an instance of the plugin using the default constructor
-			IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);
+      // Create an instance of the plugin using the default constructor
+      IPlugin plugin = (IPlugin)Activator.CreateInstance(pluginType);
 
-			return plugin;
-		}
+      return plugin;
+    }
 
-		#endregion Implementation of IPluginFactory
+    #endregion Implementation of IPluginFactory
 
-		#region Override implementation of Object
+    #region Override implementation of Object
 
-		/// <summary>
-		/// Returns a representation of the properties of this object.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Overrides base class <see cref="M:Object.ToString()" /> method to 
-		/// return a representation of the properties of this object.
-		/// </para>
-		/// </remarks>
-		/// <returns>A representation of the properties of this object</returns>
-		public override string ToString()
-		{
-			if (m_type != null)
-			{
-				return "PluginAttribute[Type=" + m_type.FullName + "]";
-			}
-			return "PluginAttribute[Type=" + m_typeName + "]";
-		}
+    /// <summary>
+    /// Returns a representation of the properties of this object.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Overrides base class <see cref="M:Object.ToString()" /> method to 
+    /// return a representation of the properties of this object.
+    /// </para>
+    /// </remarks>
+    /// <returns>A representation of the properties of this object</returns>
+    public override string ToString()
+    {
+      if (m_type != null)
+      {
+        return "PluginAttribute[Type=" + m_type.FullName + "]";
+      }
+      return "PluginAttribute[Type=" + m_typeName + "]";
+    }
 
-		#endregion Override implementation of Object
+    #endregion Override implementation of Object
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private string m_typeName = null;
-		private Type m_type = null;
+    private string m_typeName = null;
+    private Type m_type = null;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/RepositoryAttribute.cs b/src/log4net/Config/RepositoryAttribute.cs
index 56dd982..9f3b723 100644
--- a/src/log4net/Config/RepositoryAttribute.cs
+++ b/src/log4net/Config/RepositoryAttribute.cs
@@ -24,121 +24,121 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute that specifies the logging repository for the assembly.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Assemblies are mapped to logging repository. This attribute specified 
-	/// on the assembly controls
-	/// the configuration of the repository. The <see cref="Name"/> property specifies the name
-	/// of the repository that this assembly is a part of. The <see cref="RepositoryType"/>
-	/// specifies the type of the <see cref="log4net.Repository.ILoggerRepository"/> object 
-	/// to create for the assembly. If this attribute is not specified or a <see cref="Name"/> 
-	/// is not specified then the assembly will be part of the default shared logging repository.
-	/// </para>
-	/// <para>
-	/// This attribute can only be specified on the assembly and may only be used
-	/// once per assembly.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly)]
-	[Serializable]
-	public /*sealed*/ class RepositoryAttribute : Attribute
-	{
-		//
-		// Class is not sealed because DomainAttribute extends it while it is obsoleted
-		// 
+  /// <summary>
+  /// Assembly level attribute that specifies the logging repository for the assembly.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Assemblies are mapped to logging repository. This attribute specified 
+  /// on the assembly controls
+  /// the configuration of the repository. The <see cref="Name"/> property specifies the name
+  /// of the repository that this assembly is a part of. The <see cref="RepositoryType"/>
+  /// specifies the type of the <see cref="log4net.Repository.ILoggerRepository"/> object 
+  /// to create for the assembly. If this attribute is not specified or a <see cref="Name"/> 
+  /// is not specified then the assembly will be part of the default shared logging repository.
+  /// </para>
+  /// <para>
+  /// This attribute can only be specified on the assembly and may only be used
+  /// once per assembly.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly)]
+  [Serializable]
+  public /*sealed*/ class RepositoryAttribute : Attribute
+  {
+    //
+    // Class is not sealed because DomainAttribute extends it while it is obsoleted
+    // 
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="RepositoryAttribute" /> class.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor.
-		/// </para>
-		/// </remarks>
-		public RepositoryAttribute()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="RepositoryAttribute" /> class.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor.
+    /// </para>
+    /// </remarks>
+    public RepositoryAttribute()
+    {
+    }
 
-		/// <summary>
-		/// Initialize a new instance of the <see cref="RepositoryAttribute" /> class 
-		/// with the name of the repository.
-		/// </summary>
-		/// <param name="name">The name of the repository.</param>
-		/// <remarks>
-		/// <para>
-		/// Initialize the attribute with the name for the assembly's repository.
-		/// </para>
-		/// </remarks>
-		public RepositoryAttribute(string name)
-		{
-			m_name = name;
-		}
+    /// <summary>
+    /// Initialize a new instance of the <see cref="RepositoryAttribute" /> class 
+    /// with the name of the repository.
+    /// </summary>
+    /// <param name="name">The name of the repository.</param>
+    /// <remarks>
+    /// <para>
+    /// Initialize the attribute with the name for the assembly's repository.
+    /// </para>
+    /// </remarks>
+    public RepositoryAttribute(string name)
+    {
+      m_name = name;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the name of the logging repository.
-		/// </summary>
-		/// <value>
-		/// The string name to use as the name of the repository associated with this
-		/// assembly.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This value does not have to be unique. Several assemblies can share the
-		/// same repository. They will share the logging configuration of the repository.
-		/// </para>
-		/// </remarks>
-		public string Name
-		{
-			get { return m_name; }
-			set { m_name = value ; }
-		}
+    /// <summary>
+    /// Gets or sets the name of the logging repository.
+    /// </summary>
+    /// <value>
+    /// The string name to use as the name of the repository associated with this
+    /// assembly.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This value does not have to be unique. Several assemblies can share the
+    /// same repository. They will share the logging configuration of the repository.
+    /// </para>
+    /// </remarks>
+    public string Name
+    {
+      get { return m_name; }
+      set { m_name = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the type of repository to create for this assembly.
-		/// </summary>
-		/// <value>
-		/// The type of repository to create for this assembly.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The type of the repository to create for the assembly.
-		/// The type must implement the <see cref="log4net.Repository.ILoggerRepository"/>
-		/// interface.
-		/// </para>
-		/// <para>
-		/// This will be the type of repository created when 
-		/// the repository is created. If multiple assemblies reference the
-		/// same repository then the repository is only created once using the
-		/// <see cref="RepositoryType" /> of the first assembly to call into the 
-		/// repository.
-		/// </para>
-		/// </remarks>
-		public Type RepositoryType
-		{
-			get { return m_repositoryType; }
-			set { m_repositoryType = value ; }
-		}
+    /// <summary>
+    /// Gets or sets the type of repository to create for this assembly.
+    /// </summary>
+    /// <value>
+    /// The type of repository to create for this assembly.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The type of the repository to create for the assembly.
+    /// The type must implement the <see cref="log4net.Repository.ILoggerRepository"/>
+    /// interface.
+    /// </para>
+    /// <para>
+    /// This will be the type of repository created when 
+    /// the repository is created. If multiple assemblies reference the
+    /// same repository then the repository is only created once using the
+    /// <see cref="RepositoryType" /> of the first assembly to call into the 
+    /// repository.
+    /// </para>
+    /// </remarks>
+    public Type RepositoryType
+    {
+      get { return m_repositoryType; }
+      set { m_repositoryType = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private string m_name = null;
-		private Type m_repositoryType = null;
+    private string m_name = null;
+    private Type m_repositoryType = null;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/SecurityContextProviderAttribute.cs b/src/log4net/Config/SecurityContextProviderAttribute.cs
index 7698c1b..5e76c1f 100644
--- a/src/log4net/Config/SecurityContextProviderAttribute.cs
+++ b/src/log4net/Config/SecurityContextProviderAttribute.cs
@@ -29,123 +29,123 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute to configure the <see cref="SecurityContextProvider"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This attribute may only be used at the assembly scope and can only
-	/// be used once per assembly.
-	/// </para>
-	/// <para>
-	/// Use this attribute to configure the <see cref="XmlConfigurator"/>
-	/// without calling one of the <see cref="M:XmlConfigurator.Configure()"/>
-	/// methods.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	[AttributeUsage(AttributeTargets.Assembly)]
-	[Serializable]
-	public sealed class SecurityContextProviderAttribute : ConfiguratorAttribute
-	{
-		#region Constructor
+  /// <summary>
+  /// Assembly level attribute to configure the <see cref="SecurityContextProvider"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This attribute may only be used at the assembly scope and can only
+  /// be used once per assembly.
+  /// </para>
+  /// <para>
+  /// Use this attribute to configure the <see cref="XmlConfigurator"/>
+  /// without calling one of the <see cref="M:XmlConfigurator.Configure()"/>
+  /// methods.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  [AttributeUsage(AttributeTargets.Assembly)]
+  [Serializable]
+  public sealed class SecurityContextProviderAttribute : ConfiguratorAttribute
+  {
+    #region Constructor
 
-		/// <summary>
-		/// Construct provider attribute with type specified
-		/// </summary>
-		/// <param name="providerType">the type of the provider to use</param>
-		/// <remarks>
-		/// <para>
-		/// The provider specified must subclass the <see cref="SecurityContextProvider"/>
-		/// class.
-		/// </para>
-		/// </remarks>
-		public SecurityContextProviderAttribute(Type providerType) : base(100) /* configurator priority 100 to execute before the XmlConfigurator */
-		{
-			m_providerType = providerType;
-		}
+    /// <summary>
+    /// Construct provider attribute with type specified
+    /// </summary>
+    /// <param name="providerType">the type of the provider to use</param>
+    /// <remarks>
+    /// <para>
+    /// The provider specified must subclass the <see cref="SecurityContextProvider"/>
+    /// class.
+    /// </para>
+    /// </remarks>
+    public SecurityContextProviderAttribute(Type providerType) : base(100) /* configurator priority 100 to execute before the XmlConfigurator */
+    {
+      m_providerType = providerType;
+    }
 
-		#endregion
+    #endregion
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the type of the provider to use.
-		/// </summary>
-		/// <value>
-		/// the type of the provider to use.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The provider specified must subclass the <see cref="SecurityContextProvider"/>
-		/// class.
-		/// </para>
-		/// </remarks>
-		public Type ProviderType
-		{
-			get { return m_providerType; }
-			set { m_providerType = value; }
-		}
+    /// <summary>
+    /// Gets or sets the type of the provider to use.
+    /// </summary>
+    /// <value>
+    /// the type of the provider to use.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The provider specified must subclass the <see cref="SecurityContextProvider"/>
+    /// class.
+    /// </para>
+    /// </remarks>
+    public Type ProviderType
+    {
+      get { return m_providerType; }
+      set { m_providerType = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override ConfiguratorAttribute
+    #region Override ConfiguratorAttribute
 
-		/// <summary>
-		/// Configures the SecurityContextProvider
-		/// </summary>
-		/// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
-		/// <param name="targetRepository">The repository to configure.</param>
-		/// <remarks>
-		/// <para>
-		/// Creates a provider instance from the <see cref="ProviderType"/> specified.
-		/// Sets this as the default security context provider <see cref="SecurityContextProvider.DefaultProvider"/>.
-		/// </para>
-		/// </remarks>
-		public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
-		{
-			if (m_providerType == null)
-			{
-				LogLog.Error(declaringType, "Attribute specified on assembly ["+sourceAssembly.FullName+"] with null ProviderType.");
-			}
-			else
-			{
-				LogLog.Debug(declaringType, "Creating provider of type ["+ m_providerType.FullName +"]");
+    /// <summary>
+    /// Configures the SecurityContextProvider
+    /// </summary>
+    /// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+    /// <param name="targetRepository">The repository to configure.</param>
+    /// <remarks>
+    /// <para>
+    /// Creates a provider instance from the <see cref="ProviderType"/> specified.
+    /// Sets this as the default security context provider <see cref="SecurityContextProvider.DefaultProvider"/>.
+    /// </para>
+    /// </remarks>
+    public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
+    {
+      if (m_providerType == null)
+      {
+        LogLog.Error(declaringType, "Attribute specified on assembly [" + sourceAssembly.FullName + "] with null ProviderType.");
+      }
+      else
+      {
+        LogLog.Debug(declaringType, "Creating provider of type [" + m_providerType.FullName + "]");
 
-				SecurityContextProvider provider = Activator.CreateInstance(m_providerType) as SecurityContextProvider;
+        SecurityContextProvider provider = Activator.CreateInstance(m_providerType) as SecurityContextProvider;
 
-				if (provider == null)
-				{
-					LogLog.Error(declaringType, "Failed to create SecurityContextProvider instance of type ["+m_providerType.Name+"].");
-				}
-				else
-				{
-					SecurityContextProvider.DefaultProvider = provider;
-				}
-			}
-		}
+        if (provider == null)
+        {
+          LogLog.Error(declaringType, "Failed to create SecurityContextProvider instance of type [" + m_providerType.Name + "].");
+        }
+        else
+        {
+          SecurityContextProvider.DefaultProvider = provider;
+        }
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private Type m_providerType = null;
+    private Type m_providerType = null;
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the SecurityContextProviderAttribute class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(SecurityContextProviderAttribute);
+    /// <summary>
+    /// The fully qualified type of the SecurityContextProviderAttribute class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(SecurityContextProviderAttribute);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
 #endif // !NETCF
\ No newline at end of file
diff --git a/src/log4net/Config/XmlConfigurator.cs b/src/log4net/Config/XmlConfigurator.cs
index ce37d2d..b11cda0 100644
--- a/src/log4net/Config/XmlConfigurator.cs
+++ b/src/log4net/Config/XmlConfigurator.cs
@@ -32,1102 +32,1102 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Use this class to initialize the log4net environment using an Xml tree.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Configures a <see cref="ILoggerRepository"/> using an Xml tree.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class XmlConfigurator
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// Use this class to initialize the log4net environment using an Xml tree.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Configures a <see cref="ILoggerRepository"/> using an Xml tree.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class XmlConfigurator
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private constructor
-		/// </summary>
-		private XmlConfigurator()
-		{
-		}
+    /// <summary>
+    /// Private constructor
+    /// </summary>
+    private XmlConfigurator()
+    {
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Configure static methods
+    #region Configure static methods
 
 #if !NETCF
-		/// <summary>
-		/// Automatically configures the <see cref="ILoggerRepository"/> using settings
-		/// stored in the application's configuration file.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Each application has a configuration file. This has the
-		/// same name as the application with '.config' appended.
-		/// This file is XML and calling this function prompts the
-		/// configurator to look in that file for a section called
-		/// <c>log4net</c> that contains the configuration data.
-		/// </para>
-		/// <para>
-		/// To use this method to configure log4net you must specify 
-		/// the <see cref="Log4NetConfigurationSectionHandler"/> section
-		/// handler for the <c>log4net</c> configuration section. See the
-		/// <see cref="Log4NetConfigurationSectionHandler"/> for an example.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The repository to configure.</param>
+    /// <summary>
+    /// Automatically configures the <see cref="ILoggerRepository"/> using settings
+    /// stored in the application's configuration file.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Each application has a configuration file. This has the
+    /// same name as the application with '.config' appended.
+    /// This file is XML and calling this function prompts the
+    /// configurator to look in that file for a section called
+    /// <c>log4net</c> that contains the configuration data.
+    /// </para>
+    /// <para>
+    /// To use this method to configure log4net you must specify 
+    /// the <see cref="Log4NetConfigurationSectionHandler"/> section
+    /// handler for the <c>log4net</c> configuration section. See the
+    /// <see cref="Log4NetConfigurationSectionHandler"/> for an example.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to configure.</param>
 #else
-		/// <summary>
-		/// Automatically configures the <see cref="ILoggerRepository"/> using settings
-		/// stored in the application's configuration file.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Each application has a configuration file. This has the
-		/// same name as the application with '.config' appended.
-		/// This file is XML and calling this function prompts the
-		/// configurator to look in that file for a section called
-		/// <c>log4net</c> that contains the configuration data.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The repository to configure.</param>
+    /// <summary>
+    /// Automatically configures the <see cref="ILoggerRepository"/> using settings
+    /// stored in the application's configuration file.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Each application has a configuration file. This has the
+    /// same name as the application with '.config' appended.
+    /// This file is XML and calling this function prompts the
+    /// configurator to look in that file for a section called
+    /// <c>log4net</c> that contains the configuration data.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to configure.</param>
 #endif
-		public static ICollection Configure(ILoggerRepository repository)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    public static ICollection Configure(ILoggerRepository repository)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(repository);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		private static void InternalConfigure(ILoggerRepository repository)
-		{
-			LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using .config file section");
+    private static void InternalConfigure(ILoggerRepository repository)
+    {
+      LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using .config file section");
 
-			try
-			{
-				LogLog.Debug(declaringType, "Application config file is [" + SystemInfo.ConfigurationFileLocation + "]");
-			}
-			catch
-			{
-				// ignore error
-				LogLog.Debug(declaringType, "Application config file location unknown");
-			}
+      try
+      {
+        LogLog.Debug(declaringType, "Application config file is [" + SystemInfo.ConfigurationFileLocation + "]");
+      }
+      catch
+      {
+        // ignore error
+        LogLog.Debug(declaringType, "Application config file location unknown");
+      }
 
 #if NETCF || NETSTANDARD1_3
-			// No config file reading stuff. Just go straight for the file
-			Configure(repository, new FileInfo(SystemInfo.ConfigurationFileLocation));
+      // No config file reading stuff. Just go straight for the file
+      Configure(repository, new FileInfo(SystemInfo.ConfigurationFileLocation));
 #else
-			try
-			{
-				XmlElement configElement = System.Configuration.ConfigurationManager.GetSection("log4net") as XmlElement;
-				if (configElement == null)
-				{
-					// Failed to load the xml config using configuration settings handler
-					LogLog.Error(declaringType, "Failed to find configuration section 'log4net' in the application's .config file. Check your .config file for the <log4net> and <configSections> elements. The configuration section should look like: <section name=\"log4net\" type=\"log4net.Config.Log4NetConfigurationSectionHandler,log4net\" />");
-				}
-				else
-				{
-					// Configure using the xml loaded from the config file
-					InternalConfigureFromXml(repository, configElement);
-				}
-			}
-			catch(System.Configuration.ConfigurationException confEx)
-			{
-				if (confEx.BareMessage.IndexOf("Unrecognized element") >= 0)
-				{
-					// Looks like the XML file is not valid
-					LogLog.Error(declaringType, "Failed to parse config file. Check your .config file is well formed XML.", confEx);
-				}
-				else
-				{
-					// This exception is typically due to the assembly name not being correctly specified in the section type.
-					string configSectionStr = "<section name=\"log4net\" type=\"log4net.Config.Log4NetConfigurationSectionHandler," + Assembly.GetExecutingAssembly().FullName + "\" />";
-					LogLog.Error(declaringType, "Failed to parse config file. Is the <configSections> specified as: " + configSectionStr, confEx);
-				}
-			}
+      try
+      {
+        XmlElement configElement = System.Configuration.ConfigurationManager.GetSection("log4net") as XmlElement;
+        if (configElement == null)
+        {
+          // Failed to load the xml config using configuration settings handler
+          LogLog.Error(declaringType, "Failed to find configuration section 'log4net' in the application's .config file. Check your .config file for the <log4net> and <configSections> elements. The configuration section should look like: <section name=\"log4net\" type=\"log4net.Config.Log4NetConfigurationSectionHandler,log4net\" />");
+        }
+        else
+        {
+          // Configure using the xml loaded from the config file
+          InternalConfigureFromXml(repository, configElement);
+        }
+      }
+      catch (System.Configuration.ConfigurationException confEx)
+      {
+        if (confEx.BareMessage.IndexOf("Unrecognized element") >= 0)
+        {
+          // Looks like the XML file is not valid
+          LogLog.Error(declaringType, "Failed to parse config file. Check your .config file is well formed XML.", confEx);
+        }
+        else
+        {
+          // This exception is typically due to the assembly name not being correctly specified in the section type.
+          string configSectionStr = "<section name=\"log4net\" type=\"log4net.Config.Log4NetConfigurationSectionHandler," + Assembly.GetExecutingAssembly().FullName + "\" />";
+          LogLog.Error(declaringType, "Failed to parse config file. Is the <configSections> specified as: " + configSectionStr, confEx);
+        }
+      }
 #endif
-		}
+    }
 
 #if !NETSTANDARD1_3 // Excluded because GetCallingAssembly() is not available in CoreFX (https://github.com/dotnet/corefx/issues/2221).
 #if !NETCF
-		/// <summary>
-		/// Automatically configures the log4net system based on the 
-		/// application's configuration settings.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Each application has a configuration file. This has the
-		/// same name as the application with '.config' appended.
-		/// This file is XML and calling this function prompts the
-		/// configurator to look in that file for a section called
-		/// <c>log4net</c> that contains the configuration data.
-		/// </para>
-		/// <para>
-		/// To use this method to configure log4net you must specify 
-		/// the <see cref="Log4NetConfigurationSectionHandler"/> section
-		/// handler for the <c>log4net</c> configuration section. See the
-		/// <see cref="Log4NetConfigurationSectionHandler"/> for an example.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="Log4NetConfigurationSectionHandler"/>
+    /// <summary>
+    /// Automatically configures the log4net system based on the 
+    /// application's configuration settings.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Each application has a configuration file. This has the
+    /// same name as the application with '.config' appended.
+    /// This file is XML and calling this function prompts the
+    /// configurator to look in that file for a section called
+    /// <c>log4net</c> that contains the configuration data.
+    /// </para>
+    /// <para>
+    /// To use this method to configure log4net you must specify 
+    /// the <see cref="Log4NetConfigurationSectionHandler"/> section
+    /// handler for the <c>log4net</c> configuration section. See the
+    /// <see cref="Log4NetConfigurationSectionHandler"/> for an example.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="Log4NetConfigurationSectionHandler"/>
 #else
-		/// <summary>
-		/// Automatically configures the log4net system based on the 
-		/// application's configuration settings.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Each application has a configuration file. This has the
-		/// same name as the application with '.config' appended.
-		/// This file is XML and calling this function prompts the
-		/// configurator to look in that file for a section called
-		/// <c>log4net</c> that contains the configuration data.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Automatically configures the log4net system based on the 
+    /// application's configuration settings.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Each application has a configuration file. This has the
+    /// same name as the application with '.config' appended.
+    /// This file is XML and calling this function prompts the
+    /// configurator to look in that file for a section called
+    /// <c>log4net</c> that contains the configuration data.
+    /// </para>
+    /// </remarks>
 #endif
-		public static ICollection Configure()
-		{
-			return Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));
-		}
+    public static ICollection Configure()
+    {
+      return Configure(LogManager.GetRepository(Assembly.GetCallingAssembly()));
+    }
 
-		/// <summary>
-		/// Configures log4net using a <c>log4net</c> element
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Loads the log4net configuration from the XML element
-		/// supplied as <paramref name="element"/>.
-		/// </para>
-		/// </remarks>
-		/// <param name="element">The element to parse.</param>
-		public static ICollection Configure(XmlElement element)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures log4net using a <c>log4net</c> element
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Loads the log4net configuration from the XML element
+    /// supplied as <paramref name="element"/>.
+    /// </para>
+    /// </remarks>
+    /// <param name="element">The element to parse.</param>
+    public static ICollection Configure(XmlElement element)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
+      ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigureFromXml(repository, element);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigureFromXml(repository, element);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
 #if !NETCF
-		/// <summary>
-		/// Configures log4net using the specified configuration file.
-		/// </summary>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the log4net configuration data.
-		/// </para>
-		/// <para>
-		/// The log4net configuration file can possible be specified in the application's
-		/// configuration file (either <c>MyAppName.exe.config</c> for a
-		/// normal application on <c>Web.config</c> for an ASP.NET application).
-		/// </para>
-		/// <para>
-		/// The first element matching <c>&lt;configuration&gt;</c> will be read as the 
-		/// configuration. If this file is also a .NET .config file then you must specify 
-		/// a configuration section for the <c>log4net</c> element otherwise .NET will 
-		/// complain. Set the type for the section handler to <see cref="System.Configuration.IgnoreSectionHandler"/>, for example:
-		/// <code lang="XML" escaped="true">
-		/// <configSections>
-		///		<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
-		///	</configSections>
-		/// </code>
-		/// </para>
-		/// <example>
-		/// The following example configures log4net using a configuration file, of which the 
-		/// location is stored in the application's configuration file :
-		/// </example>
-		/// <code lang="C#">
-		/// using log4net.Config;
-		/// using System.IO;
-		/// using System.Configuration;
-		/// 
-		/// ...
-		/// 
-		/// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
-		/// </code>
-		/// <para>
-		/// In the <c>.config</c> file, the path to the log4net can be specified like this :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net-config-file" value="log.config"/>
-		///		</appSettings>
-		///	</configuration>
-		/// </code>
-		/// </remarks>
+    /// <summary>
+    /// Configures log4net using the specified configuration file.
+    /// </summary>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the log4net configuration data.
+    /// </para>
+    /// <para>
+    /// The log4net configuration file can possible be specified in the application's
+    /// configuration file (either <c>MyAppName.exe.config</c> for a
+    /// normal application on <c>Web.config</c> for an ASP.NET application).
+    /// </para>
+    /// <para>
+    /// The first element matching <c>&lt;configuration&gt;</c> will be read as the 
+    /// configuration. If this file is also a .NET .config file then you must specify 
+    /// a configuration section for the <c>log4net</c> element otherwise .NET will 
+    /// complain. Set the type for the section handler to <see cref="System.Configuration.IgnoreSectionHandler"/>, for example:
+    /// <code lang="XML" escaped="true">
+    /// <configSections>
+    ///    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
+    ///  </configSections>
+    /// </code>
+    /// </para>
+    /// <example>
+    /// The following example configures log4net using a configuration file, of which the 
+    /// location is stored in the application's configuration file :
+    /// </example>
+    /// <code lang="C#">
+    /// using log4net.Config;
+    /// using System.IO;
+    /// using System.Configuration;
+    /// 
+    /// ...
+    /// 
+    /// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+    /// </code>
+    /// <para>
+    /// In the <c>.config</c> file, the path to the log4net can be specified like this :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net-config-file" value="log.config"/>
+    ///    </appSettings>
+    ///  </configuration>
+    /// </code>
+    /// </remarks>
 #else
-		/// <summary>
-		/// Configures log4net using the specified configuration file.
-		/// </summary>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the log4net configuration data.
-		/// </para>
-		/// <example>
-		/// The following example configures log4net using a configuration file, of which the 
-		/// location is stored in the application's configuration file :
-		/// </example>
-		/// <code lang="C#">
-		/// using log4net.Config;
-		/// using System.IO;
-		/// using System.Configuration;
-		/// 
-		/// ...
-		/// 
-		/// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
-		/// </code>
-		/// <para>
-		/// In the <c>.config</c> file, the path to the log4net can be specified like this :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net-config-file" value="log.config"/>
-		///		</appSettings>
-		///	</configuration>
-		/// </code>
-		/// </remarks>
+    /// <summary>
+    /// Configures log4net using the specified configuration file.
+    /// </summary>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the log4net configuration data.
+    /// </para>
+    /// <example>
+    /// The following example configures log4net using a configuration file, of which the 
+    /// location is stored in the application's configuration file :
+    /// </example>
+    /// <code lang="C#">
+    /// using log4net.Config;
+    /// using System.IO;
+    /// using System.Configuration;
+    /// 
+    /// ...
+    /// 
+    /// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+    /// </code>
+    /// <para>
+    /// In the <c>.config</c> file, the path to the log4net can be specified like this :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net-config-file" value="log.config"/>
+    ///    </appSettings>
+    ///  </configuration>
+    /// </code>
+    /// </remarks>
 #endif
-		public static ICollection Configure(FileInfo configFile)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    public static ICollection Configure(FileInfo configFile)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(LogManager.GetRepository(Assembly.GetCallingAssembly()), configFile);
+      }
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		/// <summary>
-		/// Configures log4net using the specified configuration URI.
-		/// </summary>
-		/// <param name="configUri">A URI to load the XML configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration data must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the log4net configuration data.
-		/// </para>
-		/// <para>
-		/// The <see cref="System.Net.WebRequest"/> must support the URI scheme specified.
-		/// </para>
-		/// </remarks>
-		public static ICollection Configure(Uri configUri)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures log4net using the specified configuration URI.
+    /// </summary>
+    /// <param name="configUri">A URI to load the XML configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration data must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the log4net configuration data.
+    /// </para>
+    /// <para>
+    /// The <see cref="System.Net.WebRequest"/> must support the URI scheme specified.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(Uri configUri)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(repository, configUri);
-			}
+      ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, configUri);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		/// <summary>
-		/// Configures log4net using the specified configuration data stream.
-		/// </summary>
-		/// <param name="configStream">A stream to load the XML configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration data must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the log4net configuration data.
-		/// </para>
-		/// <para>
-		/// Note that this method will NOT close the stream parameter.
-		/// </para>
-		/// </remarks>
-		public static ICollection Configure(Stream configStream)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures log4net using the specified configuration data stream.
+    /// </summary>
+    /// <param name="configStream">A stream to load the XML configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration data must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the log4net configuration data.
+    /// </para>
+    /// <para>
+    /// Note that this method will NOT close the stream parameter.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(Stream configStream)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(repository, configStream);
-			}
+      ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, configStream);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 #endif // !NETSTANDARD1_3
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified XML 
-		/// element.
-		/// </summary>
-		/// <remarks>
-		/// Loads the log4net configuration from the XML element
-		/// supplied as <paramref name="element"/>.
-		/// </remarks>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="element">The element to parse.</param>
-		public static ICollection Configure(ILoggerRepository repository, XmlElement element)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified XML 
+    /// element.
+    /// </summary>
+    /// <remarks>
+    /// Loads the log4net configuration from the XML element
+    /// supplied as <paramref name="element"/>.
+    /// </remarks>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="element">The element to parse.</param>
+    public static ICollection Configure(ILoggerRepository repository, XmlElement element)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using XML element");
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using XML element");
 
-				InternalConfigureFromXml(repository, element);
-			}
+        InternalConfigureFromXml(repository, element);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
 #if !NETCF
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
-		/// file.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The log4net configuration file can possible be specified in the application's
-		/// configuration file (either <c>MyAppName.exe.config</c> for a
-		/// normal application on <c>Web.config</c> for an ASP.NET application).
-		/// </para>
-		/// <para>
-		/// The first element matching <c>&lt;configuration&gt;</c> will be read as the 
-		/// configuration. If this file is also a .NET .config file then you must specify 
-		/// a configuration section for the <c>log4net</c> element otherwise .NET will 
-		/// complain. Set the type for the section handler to <see cref="System.Configuration.IgnoreSectionHandler"/>, for example:
-		/// <code lang="XML" escaped="true">
-		/// <configSections>
-		///		<section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
-		///	</configSections>
-		/// </code>
-		/// </para>
-		/// <example>
-		/// The following example configures log4net using a configuration file, of which the 
-		/// location is stored in the application's configuration file :
-		/// </example>
-		/// <code lang="C#">
-		/// using log4net.Config;
-		/// using System.IO;
-		/// using System.Configuration;
-		/// 
-		/// ...
-		/// 
-		/// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
-		/// </code>
-		/// <para>
-		/// In the <c>.config</c> file, the path to the log4net can be specified like this :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net-config-file" value="log.config"/>
-		///		</appSettings>
-		///	</configuration>
-		/// </code>
-		/// </remarks>
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
+    /// file.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The log4net configuration file can possible be specified in the application's
+    /// configuration file (either <c>MyAppName.exe.config</c> for a
+    /// normal application on <c>Web.config</c> for an ASP.NET application).
+    /// </para>
+    /// <para>
+    /// The first element matching <c>&lt;configuration&gt;</c> will be read as the 
+    /// configuration. If this file is also a .NET .config file then you must specify 
+    /// a configuration section for the <c>log4net</c> element otherwise .NET will 
+    /// complain. Set the type for the section handler to <see cref="System.Configuration.IgnoreSectionHandler"/>, for example:
+    /// <code lang="XML" escaped="true">
+    /// <configSections>
+    ///    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
+    ///  </configSections>
+    /// </code>
+    /// </para>
+    /// <example>
+    /// The following example configures log4net using a configuration file, of which the 
+    /// location is stored in the application's configuration file :
+    /// </example>
+    /// <code lang="C#">
+    /// using log4net.Config;
+    /// using System.IO;
+    /// using System.Configuration;
+    /// 
+    /// ...
+    /// 
+    /// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+    /// </code>
+    /// <para>
+    /// In the <c>.config</c> file, the path to the log4net can be specified like this :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net-config-file" value="log.config"/>
+    ///    </appSettings>
+    ///  </configuration>
+    /// </code>
+    /// </remarks>
 #else
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
-		/// file.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <example>
-		/// The following example configures log4net using a configuration file, of which the 
-		/// location is stored in the application's configuration file :
-		/// </example>
-		/// <code lang="C#">
-		/// using log4net.Config;
-		/// using System.IO;
-		/// using System.Configuration;
-		/// 
-		/// ...
-		/// 
-		/// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
-		/// </code>
-		/// <para>
-		/// In the <c>.config</c> file, the path to the log4net can be specified like this :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net-config-file" value="log.config"/>
-		///		</appSettings>
-		///	</configuration>
-		/// </code>
-		/// </remarks>
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
+    /// file.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <example>
+    /// The following example configures log4net using a configuration file, of which the 
+    /// location is stored in the application's configuration file :
+    /// </example>
+    /// <code lang="C#">
+    /// using log4net.Config;
+    /// using System.IO;
+    /// using System.Configuration;
+    /// 
+    /// ...
+    /// 
+    /// XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"]));
+    /// </code>
+    /// <para>
+    /// In the <c>.config</c> file, the path to the log4net can be specified like this :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net-config-file" value="log.config"/>
+    ///    </appSettings>
+    ///  </configuration>
+    /// </code>
+    /// </remarks>
 #endif
-		public static ICollection Configure(ILoggerRepository repository, FileInfo configFile)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    public static ICollection Configure(ILoggerRepository repository, FileInfo configFile)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(repository, configFile);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, configFile);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		private static void InternalConfigure(ILoggerRepository repository, FileInfo configFile)
-		{
-			LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "]");
+    private static void InternalConfigure(ILoggerRepository repository, FileInfo configFile)
+    {
+      LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "]");
 
-			if (configFile == null)
-			{
-				LogLog.Error(declaringType, "Configure called with null 'configFile' parameter");
-			}
-			else
-			{
-				// Have to use File.Exists() rather than configFile.Exists()
-				// because configFile.Exists() caches the value, not what we want.
-				if (File.Exists(configFile.FullName))
-				{
-					// Open the file for reading
-					FileStream fs = null;
+      if (configFile == null)
+      {
+        LogLog.Error(declaringType, "Configure called with null 'configFile' parameter");
+      }
+      else
+      {
+        // Have to use File.Exists() rather than configFile.Exists()
+        // because configFile.Exists() caches the value, not what we want.
+        if (File.Exists(configFile.FullName))
+        {
+          // Open the file for reading
+          FileStream fs = null;
 
-					// Try hard to open the file
-					for(int retry = 5; --retry >= 0; )
-					{
-						try
-						{
-							fs = configFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
-							break;
-						}
-						catch(IOException ex)
-						{
-							if (retry == 0)
-							{
-								LogLog.Error(declaringType, "Failed to open XML config file [" + configFile.Name + "]", ex);
+          // Try hard to open the file
+          for (int retry = 5; --retry >= 0;)
+          {
+            try
+            {
+              fs = configFile.Open(FileMode.Open, FileAccess.Read, FileShare.Read);
+              break;
+            }
+            catch (IOException ex)
+            {
+              if (retry == 0)
+              {
+                LogLog.Error(declaringType, "Failed to open XML config file [" + configFile.Name + "]", ex);
 
-								// The stream cannot be valid
-								fs = null;
-							}
-							System.Threading.Thread.Sleep(250);
-						}
-					}
+                // The stream cannot be valid
+                fs = null;
+              }
+              System.Threading.Thread.Sleep(250);
+            }
+          }
 
-					if (fs != null)
-					{
-						try
-						{
-							// Load the configuration from the stream
-							InternalConfigure(repository, fs);
-						}
-						finally
-						{
-							// Force the file closed whatever happens
-							fs.Dispose();
-						}
-					}
-				}
-				else
-				{
-					LogLog.Debug(declaringType, "config file [" + configFile.FullName + "] not found. Configuration unchanged.");
-				}
-			}
-		}
+          if (fs != null)
+          {
+            try
+            {
+              // Load the configuration from the stream
+              InternalConfigure(repository, fs);
+            }
+            finally
+            {
+              // Force the file closed whatever happens
+              fs.Dispose();
+            }
+          }
+        }
+        else
+        {
+          LogLog.Debug(declaringType, "config file [" + configFile.FullName + "] not found. Configuration unchanged.");
+        }
+      }
+    }
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
-		/// URI.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configUri">A URI to load the XML configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration data must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The <see cref="System.Net.WebRequest"/> must support the URI scheme specified.
-		/// </para>
-		/// </remarks>
-		public static ICollection Configure(ILoggerRepository repository, Uri configUri)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
+    /// URI.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configUri">A URI to load the XML configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration data must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The <see cref="System.Net.WebRequest"/> must support the URI scheme specified.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(ILoggerRepository repository, Uri configUri)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(repository, configUri);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, configUri);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		private static void InternalConfigure(ILoggerRepository repository, Uri configUri)
-		{
-			LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using URI ["+configUri+"]");
+    private static void InternalConfigure(ILoggerRepository repository, Uri configUri)
+    {
+      LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using URI [" + configUri + "]");
 
-			if (configUri == null)
-			{
-				LogLog.Error(declaringType, "Configure called with null 'configUri' parameter");
-			}
-			else
-			{
-				if (configUri.IsFile)
-				{
-					// If URI is local file then call Configure with FileInfo
-					InternalConfigure(repository, new FileInfo(configUri.LocalPath));
-				}
-				else
-				{
-					// NETCF dose not support WebClient
-					WebRequest configRequest = null;
+      if (configUri == null)
+      {
+        LogLog.Error(declaringType, "Configure called with null 'configUri' parameter");
+      }
+      else
+      {
+        if (configUri.IsFile)
+        {
+          // If URI is local file then call Configure with FileInfo
+          InternalConfigure(repository, new FileInfo(configUri.LocalPath));
+        }
+        else
+        {
+          // NETCF dose not support WebClient
+          WebRequest configRequest = null;
 
-					try
-					{
-						configRequest = WebRequest.Create(configUri);
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Failed to create WebRequest for URI ["+configUri+"]", ex);
-					}
+          try
+          {
+            configRequest = WebRequest.Create(configUri);
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "Failed to create WebRequest for URI [" + configUri + "]", ex);
+          }
 
-					if (configRequest != null)
-					{
+          if (configRequest != null)
+          {
 #if !NETCF_1_0
-						// authentication may be required, set client to use default credentials
-						try
-						{
-							configRequest.Credentials = CredentialCache.DefaultCredentials;
-						}
-						catch
-						{
-							// ignore security exception
-						}
+            // authentication may be required, set client to use default credentials
+            try
+            {
+              configRequest.Credentials = CredentialCache.DefaultCredentials;
+            }
+            catch
+            {
+              // ignore security exception
+            }
 #endif
-						try
-						{
+            try
+            {
 #if NETSTANDARD
-							using WebResponse response = configRequest.GetResponseAsync().GetAwaiter().GetResult();
+              using WebResponse response = configRequest.GetResponseAsync().GetAwaiter().GetResult();
 #else
-							using WebResponse response = configRequest.GetResponse();
+              using WebResponse response = configRequest.GetResponse();
 #endif
-							if (response != null)
-							{
-								using var configStream = response.GetResponseStream();
-								InternalConfigure(repository, configStream);
-							}
-						}
-						catch(Exception ex)
-						{
-							LogLog.Error(declaringType, "Failed to request config from URI ["+configUri+"]", ex);
-						}
-					}
-				}
-			}
-		}
+              if (response != null)
+              {
+                using var configStream = response.GetResponseStream();
+                InternalConfigure(repository, configStream);
+              }
+            }
+            catch (Exception ex)
+            {
+              LogLog.Error(declaringType, "Failed to request config from URI [" + configUri + "]", ex);
+            }
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
-		/// file.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configStream">The stream to load the XML configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration data must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// Note that this method will NOT close the stream parameter.
-		/// </para>
-		/// </remarks>
-		public static ICollection Configure(ILoggerRepository repository, Stream configStream)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the specified configuration 
+    /// file.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configStream">The stream to load the XML configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration data must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// Note that this method will NOT close the stream parameter.
+    /// </para>
+    /// </remarks>
+    public static ICollection Configure(ILoggerRepository repository, Stream configStream)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigure(repository, configStream);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigure(repository, configStream);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		private static void InternalConfigure(ILoggerRepository repository, Stream configStream)
-		{
-			LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using stream");
+    private static void InternalConfigure(ILoggerRepository repository, Stream configStream)
+    {
+      LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using stream");
 
-			if (configStream == null)
-			{
-				LogLog.Error(declaringType, "Configure called with null 'configStream' parameter");
-			}
-			else
-			{
-				// Load the config file into a document
+      if (configStream == null)
+      {
+        LogLog.Error(declaringType, "Configure called with null 'configStream' parameter");
+      }
+      else
+      {
+        // Load the config file into a document
 #if NETSTANDARD1_3
-				XmlDocument doc = new XmlDocument();
+        XmlDocument doc = new XmlDocument();
 #else
-				XmlDocument doc = new XmlDocument { XmlResolver = null };
+        XmlDocument doc = new XmlDocument { XmlResolver = null };
 #endif
-				try
-				{
+        try
+        {
 #if (NETCF)
-					// Create a text reader for the file stream
-					XmlTextReader xmlReader = new XmlTextReader(configStream);
+          // Create a text reader for the file stream
+          XmlTextReader xmlReader = new XmlTextReader(configStream);
 #elif NET_2_0 || NETSTANDARD
-					// Allow the DTD to specify entity includes
-					XmlReaderSettings settings = new XmlReaderSettings();
-					// .NET 4.0 warning CS0618: 'System.Xml.XmlReaderSettings.ProhibitDtd'
-					// is obsolete: 'Use XmlReaderSettings.DtdProcessing property instead.'
+          // Allow the DTD to specify entity includes
+          XmlReaderSettings settings = new XmlReaderSettings();
+          // .NET 4.0 warning CS0618: 'System.Xml.XmlReaderSettings.ProhibitDtd'
+          // is obsolete: 'Use XmlReaderSettings.DtdProcessing property instead.'
 #if NETSTANDARD1_3 // TODO DtdProcessing.Parse not yet available (https://github.com/dotnet/corefx/issues/4376)
-					settings.DtdProcessing = DtdProcessing.Ignore;
+          settings.DtdProcessing = DtdProcessing.Ignore;
 #elif !NET_4_0 && !MONO_4_0 && !NETSTANDARD2_0
-					settings.ProhibitDtd = true;
+          settings.ProhibitDtd = true;
 #else
-					settings.DtdProcessing = DtdProcessing.Ignore;
+          settings.DtdProcessing = DtdProcessing.Ignore;
 #endif
 
-					// Create a reader over the input stream
-					using XmlReader xmlReader = XmlReader.Create(configStream, settings);
+          // Create a reader over the input stream
+          using XmlReader xmlReader = XmlReader.Create(configStream, settings);
 #else
-					// Create a validating reader around a text reader for the file stream
-					using XmlValidatingReader xmlReader = new XmlValidatingReader(new XmlTextReader(configStream));
+          // Create a validating reader around a text reader for the file stream
+          using XmlValidatingReader xmlReader = new XmlValidatingReader(new XmlTextReader(configStream));
 
-					// Specify that the reader should not perform validation, but that it should
-					// expand entity refs.
-					xmlReader.ValidationType = ValidationType.None;
-					xmlReader.EntityHandling = EntityHandling.ExpandEntities;
+          // Specify that the reader should not perform validation, but that it should
+          // expand entity refs.
+          xmlReader.ValidationType = ValidationType.None;
+          xmlReader.EntityHandling = EntityHandling.ExpandEntities;
 #endif
 
-					// load the data into the document
-					doc.Load(xmlReader);
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Error while loading XML configuration", ex);
+          // load the data into the document
+          doc.Load(xmlReader);
+        }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Error while loading XML configuration", ex);
 
-					// The document is invalid
-					doc = null;
-				}
+          // The document is invalid
+          doc = null;
+        }
 
-				if (doc != null)
-				{
-					LogLog.Debug(declaringType, "loading XML configuration");
+        if (doc != null)
+        {
+          LogLog.Debug(declaringType, "loading XML configuration");
 
-					// Configure using the 'log4net' element
-					XmlNodeList configNodeList = doc.GetElementsByTagName("log4net");
-					if (configNodeList.Count == 0)
-					{
-						LogLog.Debug(declaringType, "XML configuration does not contain a <log4net> element. Configuration Aborted.");
-					}
-					else if (configNodeList.Count > 1)
-					{
-						LogLog.Error(declaringType, "XML configuration contains [" + configNodeList.Count + "] <log4net> elements. Only one is allowed. Configuration Aborted.");
-					}
-					else
-					{
-						InternalConfigureFromXml(repository, configNodeList[0] as XmlElement);
-					}
-				}
-			}
-		}
+          // Configure using the 'log4net' element
+          XmlNodeList configNodeList = doc.GetElementsByTagName("log4net");
+          if (configNodeList.Count == 0)
+          {
+            LogLog.Debug(declaringType, "XML configuration does not contain a <log4net> element. Configuration Aborted.");
+          }
+          else if (configNodeList.Count > 1)
+          {
+            LogLog.Error(declaringType, "XML configuration contains [" + configNodeList.Count + "] <log4net> elements. Only one is allowed. Configuration Aborted.");
+          }
+          else
+          {
+            InternalConfigureFromXml(repository, configNodeList[0] as XmlElement);
+          }
+        }
+      }
+    }
 
-		#endregion Configure static methods
+    #endregion Configure static methods
 
-		#region ConfigureAndWatch static methods
+    #region ConfigureAndWatch static methods
 
 #if (!NETCF && !SSCLI)
 #if !NETSTANDARD1_3 // Excluded because GetCallingAssembly() is not available in CoreFX (https://github.com/dotnet/corefx/issues/2221).
-		/// <summary>
-		/// Configures log4net using the file specified, monitors the file for changes 
-		/// and reloads the configuration if a change is detected.
-		/// </summary>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
-		/// and depends on the behavior of that class.
-		/// </para>
-		/// <para>
-		/// For more information on how to configure log4net using
-		/// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Configure(FileInfo)"/>
-		public static ICollection ConfigureAndWatch(FileInfo configFile)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures log4net using the file specified, monitors the file for changes 
+    /// and reloads the configuration if a change is detected.
+    /// </summary>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
+    /// and depends on the behavior of that class.
+    /// </para>
+    /// <para>
+    /// For more information on how to configure log4net using
+    /// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Configure(FileInfo)"/>
+    public static ICollection ConfigureAndWatch(FileInfo configFile)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
+      ILoggerRepository repository = LogManager.GetRepository(Assembly.GetCallingAssembly());
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigureAndWatch(repository, configFile);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigureAndWatch(repository, configFile);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 #endif // !NETSTANDARD1_3
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> using the file specified, 
-		/// monitors the file for changes and reloads the configuration if a change 
-		/// is detected.
-		/// </summary>
-		/// <param name="repository">The repository to configure.</param>
-		/// <param name="configFile">The XML file to load the configuration from.</param>
-		/// <remarks>
-		/// <para>
-		/// The configuration file must be valid XML. It must contain
-		/// at least one element called <c>log4net</c> that holds
-		/// the configuration data.
-		/// </para>
-		/// <para>
-		/// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
-		/// and depends on the behavior of that class.
-		/// </para>
-		/// <para>
-		/// For more information on how to configure log4net using
-		/// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Configure(FileInfo)"/>
-		public static ICollection ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile)
-		{
-			ArrayList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> using the file specified, 
+    /// monitors the file for changes and reloads the configuration if a change 
+    /// is detected.
+    /// </summary>
+    /// <param name="repository">The repository to configure.</param>
+    /// <param name="configFile">The XML file to load the configuration from.</param>
+    /// <remarks>
+    /// <para>
+    /// The configuration file must be valid XML. It must contain
+    /// at least one element called <c>log4net</c> that holds
+    /// the configuration data.
+    /// </para>
+    /// <para>
+    /// The configuration file will be monitored using a <see cref="FileSystemWatcher"/>
+    /// and depends on the behavior of that class.
+    /// </para>
+    /// <para>
+    /// For more information on how to configure log4net using
+    /// a separate configuration file, see <see cref="M:Configure(FileInfo)"/>.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Configure(FileInfo)"/>
+    public static ICollection ConfigureAndWatch(ILoggerRepository repository, FileInfo configFile)
+    {
+      ArrayList configurationMessages = new ArrayList();
 
-			using (new LogLog.LogReceivedAdapter(configurationMessages))
-			{
-				InternalConfigureAndWatch(repository, configFile);
-			}
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        InternalConfigureAndWatch(repository, configFile);
+      }
 
-			repository.ConfigurationMessages = configurationMessages;
+      repository.ConfigurationMessages = configurationMessages;
 
-			return configurationMessages;
-		}
+      return configurationMessages;
+    }
 
-		private static void InternalConfigureAndWatch(ILoggerRepository repository, FileInfo configFile)
-		{
-			LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "] watching for file updates");
+    private static void InternalConfigureAndWatch(ILoggerRepository repository, FileInfo configFile)
+    {
+      LogLog.Debug(declaringType, "configuring repository [" + repository.Name + "] using file [" + configFile + "] watching for file updates");
 
-			if (configFile == null)
-			{
-				LogLog.Error(declaringType, "ConfigureAndWatch called with null 'configFile' parameter");
-			}
-			else
-			{
-				// Configure log4net now
-				InternalConfigure(repository, configFile);
+      if (configFile == null)
+      {
+        LogLog.Error(declaringType, "ConfigureAndWatch called with null 'configFile' parameter");
+      }
+      else
+      {
+        // Configure log4net now
+        InternalConfigure(repository, configFile);
 
-				try
-				{
-					lock (m_repositoryName2ConfigAndWatchHandler)
-					{
-						// support multiple repositories each having their own watcher
-						ConfigureAndWatchHandler handler =
-							(ConfigureAndWatchHandler)m_repositoryName2ConfigAndWatchHandler[configFile.FullName];
+        try
+        {
+          lock (m_repositoryName2ConfigAndWatchHandler)
+          {
+            // support multiple repositories each having their own watcher
+            ConfigureAndWatchHandler handler =
+              (ConfigureAndWatchHandler)m_repositoryName2ConfigAndWatchHandler[configFile.FullName];
 
-						if (handler != null)
-						{
-							m_repositoryName2ConfigAndWatchHandler.Remove(configFile.FullName);
-							handler.Dispose();
-						}
+            if (handler != null)
+            {
+              m_repositoryName2ConfigAndWatchHandler.Remove(configFile.FullName);
+              handler.Dispose();
+            }
 
-						// Create and start a watch handler that will reload the
-						// configuration whenever the config file is modified.
-						handler = new ConfigureAndWatchHandler(repository, configFile);
-						m_repositoryName2ConfigAndWatchHandler[configFile.FullName] = handler;
-					}
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Failed to initialize configuration file watcher for file ["+configFile.FullName+"]", ex);
-				}
-			}
-		}
+            // Create and start a watch handler that will reload the
+            // configuration whenever the config file is modified.
+            handler = new ConfigureAndWatchHandler(repository, configFile);
+            m_repositoryName2ConfigAndWatchHandler[configFile.FullName] = handler;
+          }
+        }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Failed to initialize configuration file watcher for file [" + configFile.FullName + "]", ex);
+        }
+      }
+    }
 #endif
 
-		#endregion ConfigureAndWatch static methods
+    #endregion ConfigureAndWatch static methods
 
-		#region ConfigureAndWatchHandler
+    #region ConfigureAndWatchHandler
 
 #if (!NETCF && !SSCLI)
-		/// <summary>
-		/// Class used to watch config files.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="FileSystemWatcher"/> to monitor
-		/// changes to a specified file. Because multiple change notifications
-		/// may be raised when the file is modified, a timer is used to
-		/// compress the notifications into a single event. The timer
-		/// waits for <see cref="TimeoutMillis"/> time before delivering
-		/// the event notification. If any further <see cref="FileSystemWatcher"/>
-		/// change notifications arrive while the timer is waiting it
-		/// is reset and waits again for <see cref="TimeoutMillis"/> to
-		/// elapse.
-		/// </para>
-		/// </remarks>
-		private sealed class ConfigureAndWatchHandler : IDisposable
-		{
-			/// <summary>
-			/// Holds the FileInfo used to configure the XmlConfigurator
-			/// </summary>
-			private FileInfo m_configFile;
+    /// <summary>
+    /// Class used to watch config files.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="FileSystemWatcher"/> to monitor
+    /// changes to a specified file. Because multiple change notifications
+    /// may be raised when the file is modified, a timer is used to
+    /// compress the notifications into a single event. The timer
+    /// waits for <see cref="TimeoutMillis"/> time before delivering
+    /// the event notification. If any further <see cref="FileSystemWatcher"/>
+    /// change notifications arrive while the timer is waiting it
+    /// is reset and waits again for <see cref="TimeoutMillis"/> to
+    /// elapse.
+    /// </para>
+    /// </remarks>
+    private sealed class ConfigureAndWatchHandler : IDisposable
+    {
+      /// <summary>
+      /// Holds the FileInfo used to configure the XmlConfigurator
+      /// </summary>
+      private FileInfo m_configFile;
 
-			/// <summary>
-			/// Holds the repository being configured.
-			/// </summary>
-			private ILoggerRepository m_repository;
+      /// <summary>
+      /// Holds the repository being configured.
+      /// </summary>
+      private ILoggerRepository m_repository;
 
-			/// <summary>
-			/// The timer used to compress the notification events.
-			/// </summary>
-			private Timer m_timer;
+      /// <summary>
+      /// The timer used to compress the notification events.
+      /// </summary>
+      private Timer m_timer;
 
-			/// <summary>
-			/// The default amount of time to wait after receiving notification
-			/// before reloading the config file.
-			/// </summary>
-			private const int TimeoutMillis = 500;
+      /// <summary>
+      /// The default amount of time to wait after receiving notification
+      /// before reloading the config file.
+      /// </summary>
+      private const int TimeoutMillis = 500;
 
-			/// <summary>
-			/// Watches file for changes. This object should be disposed when no longer
-			/// needed to free system handles on the watched resources.
-			/// </summary>
-			private FileSystemWatcher m_watcher;
+      /// <summary>
+      /// Watches file for changes. This object should be disposed when no longer
+      /// needed to free system handles on the watched resources.
+      /// </summary>
+      private FileSystemWatcher m_watcher;
 
-			/// <summary>
-			/// Initializes a new instance of the <see cref="ConfigureAndWatchHandler" /> class to
-			/// watch a specified config file used to configure a repository.
-			/// </summary>
-			/// <param name="repository">The repository to configure.</param>
-			/// <param name="configFile">The configuration file to watch.</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="ConfigureAndWatchHandler" /> class.
-			/// </para>
-			/// </remarks>
+      /// <summary>
+      /// Initializes a new instance of the <see cref="ConfigureAndWatchHandler" /> class to
+      /// watch a specified config file used to configure a repository.
+      /// </summary>
+      /// <param name="repository">The repository to configure.</param>
+      /// <param name="configFile">The configuration file to watch.</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="ConfigureAndWatchHandler" /> class.
+      /// </para>
+      /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-			[System.Security.SecuritySafeCritical]
+      [System.Security.SecuritySafeCritical]
 #endif
-			public ConfigureAndWatchHandler(ILoggerRepository repository, FileInfo configFile)
-			{
-				m_repository = repository;
-				m_configFile = configFile;
+      public ConfigureAndWatchHandler(ILoggerRepository repository, FileInfo configFile)
+      {
+        m_repository = repository;
+        m_configFile = configFile;
 
-				// Create a new FileSystemWatcher and set its properties.
-				m_watcher = new FileSystemWatcher();
+        // Create a new FileSystemWatcher and set its properties.
+        m_watcher = new FileSystemWatcher();
 
-				m_watcher.Path = m_configFile.DirectoryName;
-				m_watcher.Filter = m_configFile.Name;
+        m_watcher.Path = m_configFile.DirectoryName;
+        m_watcher.Filter = m_configFile.Name;
 
-				// Set the notification filters
-				m_watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName;
+        // Set the notification filters
+        m_watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName;
 
-				// Add event handlers. OnChanged will do for all event handlers that fire a FileSystemEventArgs
-				m_watcher.Changed += new FileSystemEventHandler(ConfigureAndWatchHandler_OnChanged);
-				m_watcher.Created += new FileSystemEventHandler(ConfigureAndWatchHandler_OnChanged);
-				m_watcher.Deleted += new FileSystemEventHandler(ConfigureAndWatchHandler_OnChanged);
-				m_watcher.Renamed += new RenamedEventHandler(ConfigureAndWatchHandler_OnRenamed);
+        // Add event handlers. OnChanged will do for all event handlers that fire a FileSystemEventArgs
+        m_watcher.Changed += new FileSystemEventHandler(ConfigureAndWatchHandler_OnChanged);
+        m_watcher.Created += new FileSystemEventHandler(ConfigureAndWatchHandler_OnChanged);
+        m_watcher.Deleted += new FileSystemEventHandler(ConfigureAndWatchHandler_OnChanged);
+        m_watcher.Renamed += new RenamedEventHandler(ConfigureAndWatchHandler_OnRenamed);
 
-				// Begin watching.
-				m_watcher.EnableRaisingEvents = true;
+        // Begin watching.
+        m_watcher.EnableRaisingEvents = true;
 
-				// Create the timer that will be used to deliver events. Set as disabled
-				m_timer = new Timer(new TimerCallback(OnWatchedFileChange), null, Timeout.Infinite, Timeout.Infinite);
-			}
+        // Create the timer that will be used to deliver events. Set as disabled
+        m_timer = new Timer(new TimerCallback(OnWatchedFileChange), null, Timeout.Infinite, Timeout.Infinite);
+      }
 
-			/// <summary>
-			/// Event handler used by <see cref="ConfigureAndWatchHandler"/>.
-			/// </summary>
-			/// <param name="source">The <see cref="FileSystemWatcher"/> firing the event.</param>
-			/// <param name="e">The argument indicates the file that caused the event to be fired.</param>
-			/// <remarks>
-			/// <para>
-			/// This handler reloads the configuration from the file when the event is fired.
-			/// </para>
-			/// </remarks>
-			private void ConfigureAndWatchHandler_OnChanged(object source, FileSystemEventArgs e)
-			{
-				LogLog.Debug(declaringType, "ConfigureAndWatchHandler: "+e.ChangeType+" [" + m_configFile.FullName + "]");
+      /// <summary>
+      /// Event handler used by <see cref="ConfigureAndWatchHandler"/>.
+      /// </summary>
+      /// <param name="source">The <see cref="FileSystemWatcher"/> firing the event.</param>
+      /// <param name="e">The argument indicates the file that caused the event to be fired.</param>
+      /// <remarks>
+      /// <para>
+      /// This handler reloads the configuration from the file when the event is fired.
+      /// </para>
+      /// </remarks>
+      private void ConfigureAndWatchHandler_OnChanged(object source, FileSystemEventArgs e)
+      {
+        LogLog.Debug(declaringType, "ConfigureAndWatchHandler: " + e.ChangeType + " [" + m_configFile.FullName + "]");
 
-				// Deliver the event in TimeoutMillis time
-				// timer will fire only once
-				m_timer.Change(TimeoutMillis, Timeout.Infinite);
-			}
+        // Deliver the event in TimeoutMillis time
+        // timer will fire only once
+        m_timer.Change(TimeoutMillis, Timeout.Infinite);
+      }
 
-			/// <summary>
-			/// Event handler used by <see cref="ConfigureAndWatchHandler"/>.
-			/// </summary>
-			/// <param name="source">The <see cref="FileSystemWatcher"/> firing the event.</param>
-			/// <param name="e">The argument indicates the file that caused the event to be fired.</param>
-			/// <remarks>
-			/// <para>
-			/// This handler reloads the configuration from the file when the event is fired.
-			/// </para>
-			/// </remarks>
-			private void ConfigureAndWatchHandler_OnRenamed(object source, RenamedEventArgs e)
-			{
-				LogLog.Debug(declaringType, "ConfigureAndWatchHandler: " + e.ChangeType + " [" + m_configFile.FullName + "]");
+      /// <summary>
+      /// Event handler used by <see cref="ConfigureAndWatchHandler"/>.
+      /// </summary>
+      /// <param name="source">The <see cref="FileSystemWatcher"/> firing the event.</param>
+      /// <param name="e">The argument indicates the file that caused the event to be fired.</param>
+      /// <remarks>
+      /// <para>
+      /// This handler reloads the configuration from the file when the event is fired.
+      /// </para>
+      /// </remarks>
+      private void ConfigureAndWatchHandler_OnRenamed(object source, RenamedEventArgs e)
+      {
+        LogLog.Debug(declaringType, "ConfigureAndWatchHandler: " + e.ChangeType + " [" + m_configFile.FullName + "]");
 
-				// Deliver the event in TimeoutMillis time
-				// timer will fire only once
-				m_timer.Change(TimeoutMillis, Timeout.Infinite);
-			}
+        // Deliver the event in TimeoutMillis time
+        // timer will fire only once
+        m_timer.Change(TimeoutMillis, Timeout.Infinite);
+      }
 
-			/// <summary>
-			/// Called by the timer when the configuration has been updated.
-			/// </summary>
-			/// <param name="state">null</param>
-			private void OnWatchedFileChange(object state)
-			{
-				XmlConfigurator.InternalConfigure(m_repository, m_configFile);
-			}
+      /// <summary>
+      /// Called by the timer when the configuration has been updated.
+      /// </summary>
+      /// <param name="state">null</param>
+      private void OnWatchedFileChange(object state)
+      {
+        XmlConfigurator.InternalConfigure(m_repository, m_configFile);
+      }
 
-			/// <summary>
-			/// Release the handles held by the watcher and timer.
-			/// </summary>
+      /// <summary>
+      /// Release the handles held by the watcher and timer.
+      /// </summary>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
-			[System.Security.SecuritySafeCritical]
+      [System.Security.SecuritySafeCritical]
 #endif
-			public void Dispose()
-			{
-				m_watcher.EnableRaisingEvents = false;
-				m_watcher.Dispose();
-				m_timer.Dispose();
-			}
-		}
+      public void Dispose()
+      {
+        m_watcher.EnableRaisingEvents = false;
+        m_watcher.Dispose();
+        m_timer.Dispose();
+      }
+    }
 #endif
 
-		#endregion ConfigureAndWatchHandler
+    #endregion ConfigureAndWatchHandler
 
-		#region Private Static Methods
+    #region Private Static Methods
 
-		/// <summary>
-		/// Configures the specified repository using a <c>log4net</c> element.
-		/// </summary>
-		/// <param name="repository">The hierarchy to configure.</param>
-		/// <param name="element">The element to parse.</param>
-		/// <remarks>
-		/// <para>
-		/// Loads the log4net configuration from the XML element
-		/// supplied as <paramref name="element"/>.
-		/// </para>
-		/// <para>
-		/// This method is ultimately called by one of the Configure methods 
-		/// to load the configuration from an <see cref="XmlElement"/>.
-		/// </para>
-		/// </remarks>
-		private static void InternalConfigureFromXml(ILoggerRepository repository, XmlElement element)
-		{
-			if (element == null)
-			{
-				LogLog.Error(declaringType, "ConfigureFromXml called with null 'element' parameter");
-			}
-			else if (repository == null)
-			{
-				LogLog.Error(declaringType, "ConfigureFromXml called with null 'repository' parameter");
-			}
-			else
-			{
-				LogLog.Debug(declaringType, "Configuring Repository [" + repository.Name + "]");
+    /// <summary>
+    /// Configures the specified repository using a <c>log4net</c> element.
+    /// </summary>
+    /// <param name="repository">The hierarchy to configure.</param>
+    /// <param name="element">The element to parse.</param>
+    /// <remarks>
+    /// <para>
+    /// Loads the log4net configuration from the XML element
+    /// supplied as <paramref name="element"/>.
+    /// </para>
+    /// <para>
+    /// This method is ultimately called by one of the Configure methods 
+    /// to load the configuration from an <see cref="XmlElement"/>.
+    /// </para>
+    /// </remarks>
+    private static void InternalConfigureFromXml(ILoggerRepository repository, XmlElement element)
+    {
+      if (element == null)
+      {
+        LogLog.Error(declaringType, "ConfigureFromXml called with null 'element' parameter");
+      }
+      else if (repository == null)
+      {
+        LogLog.Error(declaringType, "ConfigureFromXml called with null 'repository' parameter");
+      }
+      else
+      {
+        LogLog.Debug(declaringType, "Configuring Repository [" + repository.Name + "]");
 
-				IXmlRepositoryConfigurator configurableRepository = repository as IXmlRepositoryConfigurator;
-				if (configurableRepository == null)
-				{
-					LogLog.Warn(declaringType, "Repository [" + repository + "] does not support the XmlConfigurator");
-				}
-				else
-				{
-					// Copy the xml data into the root of a new document
-					// this isolates the xml config data from the rest of
-					// the document
+        IXmlRepositoryConfigurator configurableRepository = repository as IXmlRepositoryConfigurator;
+        if (configurableRepository == null)
+        {
+          LogLog.Warn(declaringType, "Repository [" + repository + "] does not support the XmlConfigurator");
+        }
+        else
+        {
+          // Copy the xml data into the root of a new document
+          // this isolates the xml config data from the rest of
+          // the document
 #if NETSTANDARD1_3
-					XmlDocument newDoc = new XmlDocument();
+          XmlDocument newDoc = new XmlDocument();
 #else
-					XmlDocument newDoc = new XmlDocument { XmlResolver = null };
+          XmlDocument newDoc = new XmlDocument { XmlResolver = null };
 #endif
-					XmlElement newElement = (XmlElement)newDoc.AppendChild(newDoc.ImportNode(element, true));
+          XmlElement newElement = (XmlElement)newDoc.AppendChild(newDoc.ImportNode(element, true));
 
-					// Pass the configurator the config element
-					configurableRepository.Configure(newElement);
-				}
-			}
-		}
+          // Pass the configurator the config element
+          configurableRepository.Configure(newElement);
+        }
+      }
+    }
 
-		#endregion Private Static Methods
+    #endregion Private Static Methods
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// Maps repository names to ConfigAndWatchHandler instances to allow a particular
-		/// ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is 
-		/// reconfigured.
-		/// </summary>
-		private static readonly Hashtable m_repositoryName2ConfigAndWatchHandler = new Hashtable();
+    /// <summary>
+    /// Maps repository names to ConfigAndWatchHandler instances to allow a particular
+    /// ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is 
+    /// reconfigured.
+    /// </summary>
+    private static readonly Hashtable m_repositoryName2ConfigAndWatchHandler = new Hashtable();
 
-		/// <summary>
-		/// The fully qualified type of the XmlConfigurator class.
-		/// </summary>
-		/// <remarks>
-		/// Used by the internal logger to record the Type of the
-		/// log message.
-		/// </remarks>
-		private static readonly Type declaringType = typeof(XmlConfigurator);
+    /// <summary>
+    /// The fully qualified type of the XmlConfigurator class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(XmlConfigurator);
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
diff --git a/src/log4net/Config/XmlConfiguratorAttribute.cs b/src/log4net/Config/XmlConfiguratorAttribute.cs
index b5cc702..bdc79a1 100644
--- a/src/log4net/Config/XmlConfiguratorAttribute.cs
+++ b/src/log4net/Config/XmlConfiguratorAttribute.cs
@@ -31,439 +31,439 @@
 
 namespace log4net.Config
 {
-	/// <summary>
-	/// Assembly level attribute to configure the <see cref="XmlConfigurator"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This attribute may only be used at the assembly scope and can only
-	/// be used once per assembly.
-	/// </para>
-	/// <para>
-	/// Use this attribute to configure the <see cref="XmlConfigurator"/>
-	/// without calling one of the <see cref="M:XmlConfigurator.Configure()"/>
-	/// methods.
-	/// </para>
-	/// <para>
-	/// If neither of the <see cref="ConfigFile"/> or <see cref="ConfigFileExtension"/>
-	/// properties are set the configuration is loaded from the application's .config file.
-	/// If set the <see cref="ConfigFile"/> property takes priority over the
-	/// <see cref="ConfigFileExtension"/> property. The <see cref="ConfigFile"/> property
-	/// specifies a path to a file to load the config from. The path is relative to the
-	/// application's base directory; <see cref="AppDomain.BaseDirectory"/>.
-	/// The <see cref="ConfigFileExtension"/> property is used as a postfix to the assembly file name.
-	/// The config file must be located in the  application's base directory; <see cref="AppDomain.BaseDirectory"/>.
-	/// For example in a console application setting the <see cref="ConfigFileExtension"/> to
-	/// <c>config</c> has the same effect as not specifying the <see cref="ConfigFile"/> or 
-	/// <see cref="ConfigFileExtension"/> properties.
-	/// </para>
-	/// <para>
-	/// The <see cref="Watch"/> property can be set to cause the <see cref="XmlConfigurator"/>
-	/// to watch the configuration file for changes.
-	/// </para>
-	/// <note>
-	/// <para>
-	/// Log4net will only look for assembly level configuration attributes once.
-	/// When using the log4net assembly level attributes to control the configuration 
-	/// of log4net you must ensure that the first call to any of the 
-	/// <see cref="log4net.Core.LoggerManager"/> methods is made from the assembly with the configuration
-	/// attributes. 
-	/// </para>
-	/// <para>
-	/// If you cannot guarantee the order in which log4net calls will be made from 
-	/// different assemblies you must use programmatic configuration instead, i.e.
-	/// call the <see cref="M:XmlConfigurator.Configure()"/> method directly.
-	/// </para>
-	/// </note>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Assembly)]
-	[Serializable]
-	public /*sealed*/ class XmlConfiguratorAttribute : ConfiguratorAttribute
-	{
-		//
-		// Class is not sealed because DOMConfiguratorAttribute extends it while it is obsoleted
-		// 
+  /// <summary>
+  /// Assembly level attribute to configure the <see cref="XmlConfigurator"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This attribute may only be used at the assembly scope and can only
+  /// be used once per assembly.
+  /// </para>
+  /// <para>
+  /// Use this attribute to configure the <see cref="XmlConfigurator"/>
+  /// without calling one of the <see cref="M:XmlConfigurator.Configure()"/>
+  /// methods.
+  /// </para>
+  /// <para>
+  /// If neither of the <see cref="ConfigFile"/> or <see cref="ConfigFileExtension"/>
+  /// properties are set the configuration is loaded from the application's .config file.
+  /// If set the <see cref="ConfigFile"/> property takes priority over the
+  /// <see cref="ConfigFileExtension"/> property. The <see cref="ConfigFile"/> property
+  /// specifies a path to a file to load the config from. The path is relative to the
+  /// application's base directory; <see cref="AppDomain.BaseDirectory"/>.
+  /// The <see cref="ConfigFileExtension"/> property is used as a postfix to the assembly file name.
+  /// The config file must be located in the  application's base directory; <see cref="AppDomain.BaseDirectory"/>.
+  /// For example in a console application setting the <see cref="ConfigFileExtension"/> to
+  /// <c>config</c> has the same effect as not specifying the <see cref="ConfigFile"/> or 
+  /// <see cref="ConfigFileExtension"/> properties.
+  /// </para>
+  /// <para>
+  /// The <see cref="Watch"/> property can be set to cause the <see cref="XmlConfigurator"/>
+  /// to watch the configuration file for changes.
+  /// </para>
+  /// <note>
+  /// <para>
+  /// Log4net will only look for assembly level configuration attributes once.
+  /// When using the log4net assembly level attributes to control the configuration 
+  /// of log4net you must ensure that the first call to any of the 
+  /// <see cref="log4net.Core.LoggerManager"/> methods is made from the assembly with the configuration
+  /// attributes. 
+  /// </para>
+  /// <para>
+  /// If you cannot guarantee the order in which log4net calls will be made from 
+  /// different assemblies you must use programmatic configuration instead, i.e.
+  /// call the <see cref="M:XmlConfigurator.Configure()"/> method directly.
+  /// </para>
+  /// </note>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Assembly)]
+  [Serializable]
+  public /*sealed*/ class XmlConfiguratorAttribute : ConfiguratorAttribute
+  {
+    //
+    // Class is not sealed because DOMConfiguratorAttribute extends it while it is obsoleted
+    // 
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public XmlConfiguratorAttribute() : base(0) /* configurator priority 0 */
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public XmlConfiguratorAttribute() : base(0) /* configurator priority 0 */
+    {
+    }
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the filename of the configuration file.
-		/// </summary>
-		/// <value>
-		/// The filename of the configuration file.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// If specified, this is the name of the configuration file to use with
-		/// the <see cref="XmlConfigurator"/>. This file path is relative to the
-		/// <b>application base</b> directory (<see cref="AppDomain.BaseDirectory"/>).
-		/// </para>
-		/// <para>
-		/// The <see cref="ConfigFile"/> takes priority over the <see cref="ConfigFileExtension"/>.
-		/// </para>
-		/// </remarks>
-		public string ConfigFile
-		{
-			get { return m_configFile; }
-			set { m_configFile = value; }
-		}
+    /// <summary>
+    /// Gets or sets the filename of the configuration file.
+    /// </summary>
+    /// <value>
+    /// The filename of the configuration file.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If specified, this is the name of the configuration file to use with
+    /// the <see cref="XmlConfigurator"/>. This file path is relative to the
+    /// <b>application base</b> directory (<see cref="AppDomain.BaseDirectory"/>).
+    /// </para>
+    /// <para>
+    /// The <see cref="ConfigFile"/> takes priority over the <see cref="ConfigFileExtension"/>.
+    /// </para>
+    /// </remarks>
+    public string ConfigFile
+    {
+      get { return m_configFile; }
+      set { m_configFile = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the extension of the configuration file.
-		/// </summary>
-		/// <value>
-		/// The extension of the configuration file.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// If specified this is the extension for the configuration file.
-		/// The path to the config file is built by using the <b>application 
-		/// base</b> directory (<see cref="AppDomain.BaseDirectory"/>),
-		/// the <b>assembly file name</b> and the config file extension.
-		/// </para>
-		/// <para>
-		/// If the <see cref="ConfigFileExtension"/> is set to <c>MyExt</c> then
-		/// possible config file names would be: <c>MyConsoleApp.exe.MyExt</c> or
-		/// <c>MyClassLibrary.dll.MyExt</c>.
-		/// </para>
-		/// <para>
-		/// The <see cref="ConfigFile"/> takes priority over the <see cref="ConfigFileExtension"/>.
-		/// </para>
-		/// </remarks>
-		public string ConfigFileExtension
-		{
-			get { return m_configFileExtension; }
-			set { m_configFileExtension = value; }
-		}
+    /// <summary>
+    /// Gets or sets the extension of the configuration file.
+    /// </summary>
+    /// <value>
+    /// The extension of the configuration file.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If specified this is the extension for the configuration file.
+    /// The path to the config file is built by using the <b>application 
+    /// base</b> directory (<see cref="AppDomain.BaseDirectory"/>),
+    /// the <b>assembly file name</b> and the config file extension.
+    /// </para>
+    /// <para>
+    /// If the <see cref="ConfigFileExtension"/> is set to <c>MyExt</c> then
+    /// possible config file names would be: <c>MyConsoleApp.exe.MyExt</c> or
+    /// <c>MyClassLibrary.dll.MyExt</c>.
+    /// </para>
+    /// <para>
+    /// The <see cref="ConfigFile"/> takes priority over the <see cref="ConfigFileExtension"/>.
+    /// </para>
+    /// </remarks>
+    public string ConfigFileExtension
+    {
+      get { return m_configFileExtension; }
+      set { m_configFileExtension = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets a value indicating whether to watch the configuration file.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if the configuration should be watched, <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// If this flag is specified and set to <c>true</c> then the framework
-		/// will watch the configuration file and will reload the config each time 
-		/// the file is modified.
-		/// </para>
-		/// <para>
-		/// The config file can only be watched if it is loaded from local disk.
-		/// In a No-Touch (Smart Client) deployment where the application is downloaded
-		/// from a web server the config file may not reside on the local disk
-		/// and therefore it may not be able to watch it.
-		/// </para>
-		/// <note>
-		/// Watching configuration is not supported on the SSCLI.
-		/// </note>
-		/// </remarks>
-		public bool Watch
-		{
-			get { return m_configureAndWatch; }
-			set { m_configureAndWatch = value; }
-		}
+    /// <summary>
+    /// Gets or sets a value indicating whether to watch the configuration file.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if the configuration should be watched, <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If this flag is specified and set to <c>true</c> then the framework
+    /// will watch the configuration file and will reload the config each time 
+    /// the file is modified.
+    /// </para>
+    /// <para>
+    /// The config file can only be watched if it is loaded from local disk.
+    /// In a No-Touch (Smart Client) deployment where the application is downloaded
+    /// from a web server the config file may not reside on the local disk
+    /// and therefore it may not be able to watch it.
+    /// </para>
+    /// <note>
+    /// Watching configuration is not supported on the SSCLI.
+    /// </note>
+    /// </remarks>
+    public bool Watch
+    {
+      get { return m_configureAndWatch; }
+      set { m_configureAndWatch = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override ConfiguratorAttribute
+    #region Override ConfiguratorAttribute
 
-		/// <summary>
-		/// Configures the <see cref="ILoggerRepository"/> for the specified assembly.
-		/// </summary>
-		/// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
-		/// <param name="targetRepository">The repository to configure.</param>
-		/// <remarks>
-		/// <para>
-		/// Configure the repository using the <see cref="XmlConfigurator"/>.
-		/// The <paramref name="targetRepository"/> specified must extend the <see cref="Hierarchy"/>
-		/// class otherwise the <see cref="XmlConfigurator"/> will not be able to
-		/// configure it.
-		/// </para>
-		/// </remarks>
-        /// <exception cref="ArgumentOutOfRangeException">The <paramref name="targetRepository" /> does not extend <see cref="Hierarchy"/>.</exception>
-		public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
-		{
-            IList configurationMessages = new ArrayList();
+    /// <summary>
+    /// Configures the <see cref="ILoggerRepository"/> for the specified assembly.
+    /// </summary>
+    /// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+    /// <param name="targetRepository">The repository to configure.</param>
+    /// <remarks>
+    /// <para>
+    /// Configure the repository using the <see cref="XmlConfigurator"/>.
+    /// The <paramref name="targetRepository"/> specified must extend the <see cref="Hierarchy"/>
+    /// class otherwise the <see cref="XmlConfigurator"/> will not be able to
+    /// configure it.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentOutOfRangeException">The <paramref name="targetRepository" /> does not extend <see cref="Hierarchy"/>.</exception>
+    public override void Configure(Assembly sourceAssembly, ILoggerRepository targetRepository)
+    {
+      IList configurationMessages = new ArrayList();
 
-            using (new LogLog.LogReceivedAdapter(configurationMessages))
-            {
-                string applicationBaseDirectory = null;
-                try
-                {
-                    applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
-                }
-                catch
-                {
-                    // Ignore this exception because it is only thrown when ApplicationBaseDirectory is a file
-                    // and the application does not have PathDiscovery permission
-                }
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        string applicationBaseDirectory = null;
+        try
+        {
+          applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+        }
+        catch
+        {
+          // Ignore this exception because it is only thrown when ApplicationBaseDirectory is a file
+          // and the application does not have PathDiscovery permission
+        }
 
-                if (applicationBaseDirectory == null || (new Uri(applicationBaseDirectory)).IsFile)
-                {
-                    ConfigureFromFile(sourceAssembly, targetRepository);
-                }
-                else
-                {
-                    ConfigureFromUri(sourceAssembly, targetRepository);
-                }
-            }
+        if (applicationBaseDirectory == null || (new Uri(applicationBaseDirectory)).IsFile)
+        {
+          ConfigureFromFile(sourceAssembly, targetRepository);
+        }
+        else
+        {
+          ConfigureFromUri(sourceAssembly, targetRepository);
+        }
+      }
 
-            targetRepository.ConfigurationMessages = configurationMessages;
-		}
+      targetRepository.ConfigurationMessages = configurationMessages;
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Attempt to load configuration from the local file system
-		/// </summary>
-		/// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
-		/// <param name="targetRepository">The repository to configure.</param>
-		private void ConfigureFromFile(Assembly sourceAssembly, ILoggerRepository targetRepository)
-		{
-			// Work out the full path to the config file
-			string fullPath2ConfigFile = null;
-			
-			// Select the config file
-			if (m_configFile == null || m_configFile.Length == 0)
-			{
-				if (m_configFileExtension == null || m_configFileExtension.Length == 0)
-				{
-					// Use the default .config file for the AppDomain
-					try
-					{
-						fullPath2ConfigFile = SystemInfo.ConfigurationFileLocation;
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when ConfigFile and ConfigFileExtension properties are not set.", ex);
-					}
-				}
-				else
-				{
-					// Force the extension to start with a '.'
-					if (m_configFileExtension[0] != '.')
-					{
-						m_configFileExtension = "." + m_configFileExtension;
-					}
+    /// <summary>
+    /// Attempt to load configuration from the local file system
+    /// </summary>
+    /// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+    /// <param name="targetRepository">The repository to configure.</param>
+    private void ConfigureFromFile(Assembly sourceAssembly, ILoggerRepository targetRepository)
+    {
+      // Work out the full path to the config file
+      string fullPath2ConfigFile = null;
 
-					string applicationBaseDirectory = null;
-					try
-					{
-						applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Exception getting ApplicationBaseDirectory. Must be able to resolve ApplicationBaseDirectory and AssemblyFileName when ConfigFileExtension property is set.", ex);
-					}
+      // Select the config file
+      if (m_configFile == null || m_configFile.Length == 0)
+      {
+        if (m_configFileExtension == null || m_configFileExtension.Length == 0)
+        {
+          // Use the default .config file for the AppDomain
+          try
+          {
+            fullPath2ConfigFile = SystemInfo.ConfigurationFileLocation;
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when ConfigFile and ConfigFileExtension properties are not set.", ex);
+          }
+        }
+        else
+        {
+          // Force the extension to start with a '.'
+          if (m_configFileExtension[0] != '.')
+          {
+            m_configFileExtension = "." + m_configFileExtension;
+          }
 
-					if (applicationBaseDirectory != null)
-					{
-						fullPath2ConfigFile = Path.Combine(applicationBaseDirectory, SystemInfo.AssemblyFileName(sourceAssembly) + m_configFileExtension);
-					}
-				}
-			}
-			else
-			{
-				string applicationBaseDirectory = null;
-				try
-				{
-					applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
-				}
-				catch(Exception ex)
-				{
-					LogLog.Warn(declaringType, "Exception getting ApplicationBaseDirectory. ConfigFile property path ["+m_configFile+"] will be treated as an absolute path.", ex);
-				}
+          string applicationBaseDirectory = null;
+          try
+          {
+            applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "Exception getting ApplicationBaseDirectory. Must be able to resolve ApplicationBaseDirectory and AssemblyFileName when ConfigFileExtension property is set.", ex);
+          }
 
-				if (applicationBaseDirectory != null)
-				{
-					// Just the base dir + the config file
-					fullPath2ConfigFile = Path.Combine(applicationBaseDirectory, m_configFile);
-				}
-				else
-				{
-					fullPath2ConfigFile = m_configFile;
-				}
-			}
+          if (applicationBaseDirectory != null)
+          {
+            fullPath2ConfigFile = Path.Combine(applicationBaseDirectory, SystemInfo.AssemblyFileName(sourceAssembly) + m_configFileExtension);
+          }
+        }
+      }
+      else
+      {
+        string applicationBaseDirectory = null;
+        try
+        {
+          applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+        }
+        catch (Exception ex)
+        {
+          LogLog.Warn(declaringType, "Exception getting ApplicationBaseDirectory. ConfigFile property path [" + m_configFile + "] will be treated as an absolute path.", ex);
+        }
 
-			if (fullPath2ConfigFile != null)
-			{
-				ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile));
-			}
-		}
+        if (applicationBaseDirectory != null)
+        {
+          // Just the base dir + the config file
+          fullPath2ConfigFile = Path.Combine(applicationBaseDirectory, m_configFile);
+        }
+        else
+        {
+          fullPath2ConfigFile = m_configFile;
+        }
+      }
 
-		/// <summary>
-		/// Configure the specified repository using a <see cref="FileInfo"/>
-		/// </summary>
-		/// <param name="targetRepository">The repository to configure.</param>
-		/// <param name="configFile">the FileInfo pointing to the config file</param>
-		private void ConfigureFromFile(ILoggerRepository targetRepository, FileInfo configFile)
-		{
+      if (fullPath2ConfigFile != null)
+      {
+        ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile));
+      }
+    }
+
+    /// <summary>
+    /// Configure the specified repository using a <see cref="FileInfo"/>
+    /// </summary>
+    /// <param name="targetRepository">The repository to configure.</param>
+    /// <param name="configFile">the FileInfo pointing to the config file</param>
+    private void ConfigureFromFile(ILoggerRepository targetRepository, FileInfo configFile)
+    {
 #if (SSCLI)
-			if (m_configureAndWatch)
-			{
-				LogLog.Warn(declaringType, "XmlConfiguratorAttribute: Unable to watch config file not supported on SSCLI");
-			}
-			XmlConfigurator.Configure(targetRepository, configFile);
+      if (m_configureAndWatch)
+      {
+        LogLog.Warn(declaringType, "XmlConfiguratorAttribute: Unable to watch config file not supported on SSCLI");
+      }
+      XmlConfigurator.Configure(targetRepository, configFile);
 #else
-			// Do we configure just once or do we configure and then watch?
-			if (m_configureAndWatch)
-			{
-				XmlConfigurator.ConfigureAndWatch(targetRepository, configFile);
-			}
-			else
-			{
-				XmlConfigurator.Configure(targetRepository, configFile);
-			}
+      // Do we configure just once or do we configure and then watch?
+      if (m_configureAndWatch)
+      {
+        XmlConfigurator.ConfigureAndWatch(targetRepository, configFile);
+      }
+      else
+      {
+        XmlConfigurator.Configure(targetRepository, configFile);
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Attempt to load configuration from a URI
-		/// </summary>
-		/// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
-		/// <param name="targetRepository">The repository to configure.</param>
-		private void ConfigureFromUri(Assembly sourceAssembly, ILoggerRepository targetRepository)
-		{
-			// Work out the full path to the config file
-			Uri fullPath2ConfigFile = null;
-			
-			// Select the config file
-			if (m_configFile == null || m_configFile.Length == 0)
-			{
-				if (m_configFileExtension == null || m_configFileExtension.Length == 0)
-				{
-					string systemConfigFilePath = null;
-					try
-					{
-						systemConfigFilePath = SystemInfo.ConfigurationFileLocation;
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when ConfigFile and ConfigFileExtension properties are not set.", ex);
-					}
+    /// <summary>
+    /// Attempt to load configuration from a URI
+    /// </summary>
+    /// <param name="sourceAssembly">The assembly that this attribute was defined on.</param>
+    /// <param name="targetRepository">The repository to configure.</param>
+    private void ConfigureFromUri(Assembly sourceAssembly, ILoggerRepository targetRepository)
+    {
+      // Work out the full path to the config file
+      Uri fullPath2ConfigFile = null;
 
-					if (systemConfigFilePath != null)
-					{
-						Uri systemConfigFileUri = new Uri(systemConfigFilePath);
+      // Select the config file
+      if (m_configFile == null || m_configFile.Length == 0)
+      {
+        if (m_configFileExtension == null || m_configFileExtension.Length == 0)
+        {
+          string systemConfigFilePath = null;
+          try
+          {
+            systemConfigFilePath = SystemInfo.ConfigurationFileLocation;
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when ConfigFile and ConfigFileExtension properties are not set.", ex);
+          }
 
-						// Use the default .config file for the AppDomain
-						fullPath2ConfigFile = systemConfigFileUri;
-					}
-				}
-				else
-				{
-					// Force the extension to start with a '.'
-					if (m_configFileExtension[0] != '.')
-					{
-						m_configFileExtension = "." + m_configFileExtension;
-					}
+          if (systemConfigFilePath != null)
+          {
+            Uri systemConfigFileUri = new Uri(systemConfigFilePath);
 
-					string systemConfigFilePath = null;
-					try
-					{
-						systemConfigFilePath = SystemInfo.ConfigurationFileLocation;
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when the ConfigFile property are not set.", ex);
-					}
+            // Use the default .config file for the AppDomain
+            fullPath2ConfigFile = systemConfigFileUri;
+          }
+        }
+        else
+        {
+          // Force the extension to start with a '.'
+          if (m_configFileExtension[0] != '.')
+          {
+            m_configFileExtension = "." + m_configFileExtension;
+          }
 
-					if (systemConfigFilePath != null)
-					{
-						UriBuilder builder = new UriBuilder(new Uri(systemConfigFilePath));
+          string systemConfigFilePath = null;
+          try
+          {
+            systemConfigFilePath = SystemInfo.ConfigurationFileLocation;
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "XmlConfiguratorAttribute: Exception getting ConfigurationFileLocation. Must be able to resolve ConfigurationFileLocation when the ConfigFile property are not set.", ex);
+          }
 
-						// Remove the current extension from the systemConfigFileUri path
-						string path = builder.Path;
-						int startOfExtension = path.LastIndexOf(".");
-						if (startOfExtension >= 0)
-						{
-							path = path.Substring(0, startOfExtension);
-						}
-						path += m_configFileExtension;
+          if (systemConfigFilePath != null)
+          {
+            UriBuilder builder = new UriBuilder(new Uri(systemConfigFilePath));
 
-						builder.Path = path;
-						fullPath2ConfigFile = builder.Uri;
-					}
-				}
-			}
-			else
-			{
-				string applicationBaseDirectory = null;
-				try
-				{
-					applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
-				}
-				catch(Exception ex)
-				{
-					LogLog.Warn(declaringType, "Exception getting ApplicationBaseDirectory. ConfigFile property path ["+m_configFile+"] will be treated as an absolute URI.", ex);
-				}
+            // Remove the current extension from the systemConfigFileUri path
+            string path = builder.Path;
+            int startOfExtension = path.LastIndexOf(".");
+            if (startOfExtension >= 0)
+            {
+              path = path.Substring(0, startOfExtension);
+            }
+            path += m_configFileExtension;
 
-				if (applicationBaseDirectory != null)
-				{
-					// Just the base dir + the config file
-					fullPath2ConfigFile = new Uri(new Uri(applicationBaseDirectory), m_configFile);
-				}
-				else
-				{
-					fullPath2ConfigFile = new Uri(m_configFile);
-				}
-			}
+            builder.Path = path;
+            fullPath2ConfigFile = builder.Uri;
+          }
+        }
+      }
+      else
+      {
+        string applicationBaseDirectory = null;
+        try
+        {
+          applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+        }
+        catch (Exception ex)
+        {
+          LogLog.Warn(declaringType, "Exception getting ApplicationBaseDirectory. ConfigFile property path [" + m_configFile + "] will be treated as an absolute URI.", ex);
+        }
 
-			if (fullPath2ConfigFile != null)
-			{
-				if (fullPath2ConfigFile.IsFile)
-				{
-					// The m_configFile could be an absolute local path, therefore we have to be
-					// prepared to switch back to using FileInfos here
-					ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile.LocalPath));
-				}
-				else
-				{
-					if (m_configureAndWatch)
-					{
-						LogLog.Warn(declaringType, "XmlConfiguratorAttribute: Unable to watch config file loaded from a URI");
-					}
-					XmlConfigurator.Configure(targetRepository, fullPath2ConfigFile);
-				}
-			}
-		}
+        if (applicationBaseDirectory != null)
+        {
+          // Just the base dir + the config file
+          fullPath2ConfigFile = new Uri(new Uri(applicationBaseDirectory), m_configFile);
+        }
+        else
+        {
+          fullPath2ConfigFile = new Uri(m_configFile);
+        }
+      }
 
-		#region Private Instance Fields
+      if (fullPath2ConfigFile != null)
+      {
+        if (fullPath2ConfigFile.IsFile)
+        {
+          // The m_configFile could be an absolute local path, therefore we have to be
+          // prepared to switch back to using FileInfos here
+          ConfigureFromFile(targetRepository, new FileInfo(fullPath2ConfigFile.LocalPath));
+        }
+        else
+        {
+          if (m_configureAndWatch)
+          {
+            LogLog.Warn(declaringType, "XmlConfiguratorAttribute: Unable to watch config file loaded from a URI");
+          }
+          XmlConfigurator.Configure(targetRepository, fullPath2ConfigFile);
+        }
+      }
+    }
 
-		private string m_configFile = null;
-		private string m_configFileExtension = null;
-		private bool m_configureAndWatch = false;
+    #region Private Instance Fields
 
-		#endregion Private Instance Fields
+    private string m_configFile = null;
+    private string m_configFileExtension = null;
+    private bool m_configureAndWatch = false;
 
-	    #region Private Static Fields
+    #endregion Private Instance Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the XmlConfiguratorAttribute class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(XmlConfiguratorAttribute);
+    #region Private Static Fields
 
-	    #endregion Private Static Fields
-	}
+    /// <summary>
+    /// The fully qualified type of the XmlConfiguratorAttribute class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(XmlConfiguratorAttribute);
+
+    #endregion Private Static Fields
+  }
 }
 
 #endif // !NETCF
diff --git a/src/log4net/Core/CompactRepositorySelector.cs b/src/log4net/Core/CompactRepositorySelector.cs
index b1b2805..6034315 100644
--- a/src/log4net/Core/CompactRepositorySelector.cs
+++ b/src/log4net/Core/CompactRepositorySelector.cs
@@ -28,330 +28,330 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// The implementation of the <see cref="IRepositorySelector"/> interface suitable
-	/// for use with the compact framework
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This <see cref="IRepositorySelector"/> implementation is a simple
-	/// mapping between repository name and <see cref="ILoggerRepository"/>
-	/// object.
-	/// </para>
-	/// <para>
-	/// The .NET Compact Framework 1.0 does not support retrieving assembly
-	/// level attributes therefore unlike the <c>DefaultRepositorySelector</c>
-	/// this selector does not examine the calling assembly for attributes.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class CompactRepositorySelector : IRepositorySelector
-	{
-		#region Member Variables
+  /// <summary>
+  /// The implementation of the <see cref="IRepositorySelector"/> interface suitable
+  /// for use with the compact framework
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This <see cref="IRepositorySelector"/> implementation is a simple
+  /// mapping between repository name and <see cref="ILoggerRepository"/>
+  /// object.
+  /// </para>
+  /// <para>
+  /// The .NET Compact Framework 1.0 does not support retrieving assembly
+  /// level attributes therefore unlike the <c>DefaultRepositorySelector</c>
+  /// this selector does not examine the calling assembly for attributes.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class CompactRepositorySelector : IRepositorySelector
+  {
+    #region Member Variables
 
-		private const string DefaultRepositoryName = "log4net-default-repository";
+    private const string DefaultRepositoryName = "log4net-default-repository";
 
-		private readonly Hashtable m_name2repositoryMap = new Hashtable();
-		private readonly Type m_defaultRepositoryType;
+    private readonly Hashtable m_name2repositoryMap = new Hashtable();
+    private readonly Type m_defaultRepositoryType;
 
-		private event LoggerRepositoryCreationEventHandler m_loggerRepositoryCreatedEvent;
+    private event LoggerRepositoryCreationEventHandler m_loggerRepositoryCreatedEvent;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Create a new repository selector
-		/// </summary>
-		/// <param name="defaultRepositoryType">the type of the repositories to create, must implement <see cref="ILoggerRepository"/></param>
-		/// <remarks>
-		/// <para>
-		/// Create an new compact repository selector.
-		/// The default type for repositories must be specified,
-		/// an appropriate value would be <see cref="log4net.Repository.Hierarchy.Hierarchy"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">throw if <paramref name="defaultRepositoryType"/> is null</exception>
-		/// <exception cref="ArgumentOutOfRangeException">throw if <paramref name="defaultRepositoryType"/> does not implement <see cref="ILoggerRepository"/></exception>
-		public CompactRepositorySelector(Type defaultRepositoryType)
-		{
-			if (defaultRepositoryType == null)
-			{
-				throw new ArgumentNullException("defaultRepositoryType");
-			}
+    /// <summary>
+    /// Create a new repository selector
+    /// </summary>
+    /// <param name="defaultRepositoryType">the type of the repositories to create, must implement <see cref="ILoggerRepository"/></param>
+    /// <remarks>
+    /// <para>
+    /// Create an new compact repository selector.
+    /// The default type for repositories must be specified,
+    /// an appropriate value would be <see cref="log4net.Repository.Hierarchy.Hierarchy"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">throw if <paramref name="defaultRepositoryType"/> is null</exception>
+    /// <exception cref="ArgumentOutOfRangeException">throw if <paramref name="defaultRepositoryType"/> does not implement <see cref="ILoggerRepository"/></exception>
+    public CompactRepositorySelector(Type defaultRepositoryType)
+    {
+      if (defaultRepositoryType == null)
+      {
+        throw new ArgumentNullException("defaultRepositoryType");
+      }
 
-			// Check that the type is a repository
-			if (! (typeof(ILoggerRepository).IsAssignableFrom(defaultRepositoryType)) )
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("defaultRepositoryType", (object)defaultRepositoryType, "Parameter: defaultRepositoryType, Value: ["+defaultRepositoryType+"] out of range. Argument must implement the ILoggerRepository interface");
-			}
+      // Check that the type is a repository
+      if (!(typeof(ILoggerRepository).IsAssignableFrom(defaultRepositoryType)))
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("defaultRepositoryType", (object)defaultRepositoryType, "Parameter: defaultRepositoryType, Value: [" + defaultRepositoryType + "] out of range. Argument must implement the ILoggerRepository interface");
+      }
 
-			m_defaultRepositoryType = defaultRepositoryType;
+      m_defaultRepositoryType = defaultRepositoryType;
 
-			LogLog.Debug(declaringType, "defaultRepositoryType ["+m_defaultRepositoryType+"]");
-		}
+      LogLog.Debug(declaringType, "defaultRepositoryType [" + m_defaultRepositoryType + "]");
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IRepositorySelector
+    #region Implementation of IRepositorySelector
 
-		/// <summary>
-		/// Get the <see cref="ILoggerRepository"/> for the specified assembly
-		/// </summary>
-		/// <param name="assembly">not used</param>
-		/// <returns>The default <see cref="ILoggerRepository"/></returns>
-		/// <remarks>
-		/// <para>
-		/// The <paramref name="assembly"/> argument is not used. This selector does not create a
-		/// separate repository for each assembly. 
-		/// </para>
-		/// <para>
-		/// As a named repository is not specified the default repository is 
-		/// returned. The default repository is named <c>log4net-default-repository</c>.
-		/// </para>
-		/// </remarks>
-		public ILoggerRepository GetRepository(Assembly assembly)
-		{
-			return CreateRepository(assembly, m_defaultRepositoryType);
-		}
+    /// <summary>
+    /// Get the <see cref="ILoggerRepository"/> for the specified assembly
+    /// </summary>
+    /// <param name="assembly">not used</param>
+    /// <returns>The default <see cref="ILoggerRepository"/></returns>
+    /// <remarks>
+    /// <para>
+    /// The <paramref name="assembly"/> argument is not used. This selector does not create a
+    /// separate repository for each assembly. 
+    /// </para>
+    /// <para>
+    /// As a named repository is not specified the default repository is 
+    /// returned. The default repository is named <c>log4net-default-repository</c>.
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository GetRepository(Assembly assembly)
+    {
+      return CreateRepository(assembly, m_defaultRepositoryType);
+    }
 
-		/// <summary>
-		/// Get the named <see cref="ILoggerRepository"/>
-		/// </summary>
-		/// <param name="repositoryName">the name of the repository to lookup</param>
-		/// <returns>The named <see cref="ILoggerRepository"/></returns>
-		/// <remarks>
-		/// <para>
-		/// Get the named <see cref="ILoggerRepository"/>. The default 
-		/// repository is <c>log4net-default-repository</c>. Other repositories 
-		/// must be created using the <see cref="M:CreateRepository(string, Type)"/>.
-		/// If the named repository does not exist an exception is thrown.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">throw if <paramref name="repositoryName"/> is null</exception>
-		/// <exception cref="LogException">throw if the <paramref name="repositoryName"/> does not exist</exception>
-		public ILoggerRepository GetRepository(string repositoryName)
-		{
-			if (repositoryName == null)
-			{
-				throw new ArgumentNullException("repositoryName");
-			}
+    /// <summary>
+    /// Get the named <see cref="ILoggerRepository"/>
+    /// </summary>
+    /// <param name="repositoryName">the name of the repository to lookup</param>
+    /// <returns>The named <see cref="ILoggerRepository"/></returns>
+    /// <remarks>
+    /// <para>
+    /// Get the named <see cref="ILoggerRepository"/>. The default 
+    /// repository is <c>log4net-default-repository</c>. Other repositories 
+    /// must be created using the <see cref="M:CreateRepository(string, Type)"/>.
+    /// If the named repository does not exist an exception is thrown.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">throw if <paramref name="repositoryName"/> is null</exception>
+    /// <exception cref="LogException">throw if the <paramref name="repositoryName"/> does not exist</exception>
+    public ILoggerRepository GetRepository(string repositoryName)
+    {
+      if (repositoryName == null)
+      {
+        throw new ArgumentNullException("repositoryName");
+      }
 
-			lock(this)
-			{
-				// Lookup in map
-				ILoggerRepository rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
-				if (rep == null)
-				{
-					throw new LogException("Repository ["+repositoryName+"] is NOT defined.");
-				}
-				return rep;
-			}
-		}
+      lock (this)
+      {
+        // Lookup in map
+        ILoggerRepository rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
+        if (rep == null)
+        {
+          throw new LogException("Repository [" + repositoryName + "] is NOT defined.");
+        }
+        return rep;
+      }
+    }
 
-		/// <summary>
-		/// Create a new repository for the assembly specified 
-		/// </summary>
-		/// <param name="assembly">not used</param>
-		/// <param name="repositoryType">the type of repository to create, must implement <see cref="ILoggerRepository"/></param>
-		/// <returns>the repository created</returns>
-		/// <remarks>
-		/// <para>
-		/// The <paramref name="assembly"/> argument is not used. This selector does not create a
-		/// separate repository for each assembly. 
-		/// </para>
-		/// <para>
-		/// If the <paramref name="repositoryType"/> is <c>null</c> then the
-		/// default repository type specified to the constructor is used.
-		/// </para>
-		/// <para>
-		/// As a named repository is not specified the default repository is 
-		/// returned. The default repository is named <c>log4net-default-repository</c>.
-		/// </para>
-		/// </remarks>
-		public ILoggerRepository CreateRepository(Assembly assembly, Type repositoryType)
-		{
-			// If the type is not set then use the default type
-			if (repositoryType == null)
-			{
-				repositoryType = m_defaultRepositoryType;
-			}
+    /// <summary>
+    /// Create a new repository for the assembly specified 
+    /// </summary>
+    /// <param name="assembly">not used</param>
+    /// <param name="repositoryType">the type of repository to create, must implement <see cref="ILoggerRepository"/></param>
+    /// <returns>the repository created</returns>
+    /// <remarks>
+    /// <para>
+    /// The <paramref name="assembly"/> argument is not used. This selector does not create a
+    /// separate repository for each assembly. 
+    /// </para>
+    /// <para>
+    /// If the <paramref name="repositoryType"/> is <c>null</c> then the
+    /// default repository type specified to the constructor is used.
+    /// </para>
+    /// <para>
+    /// As a named repository is not specified the default repository is 
+    /// returned. The default repository is named <c>log4net-default-repository</c>.
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository CreateRepository(Assembly assembly, Type repositoryType)
+    {
+      // If the type is not set then use the default type
+      if (repositoryType == null)
+      {
+        repositoryType = m_defaultRepositoryType;
+      }
 
-			lock(this)
-			{
-				// This method should not throw if the default repository already exists.
+      lock (this)
+      {
+        // This method should not throw if the default repository already exists.
 
-				// First check that the repository does not exist
-				ILoggerRepository rep = m_name2repositoryMap[DefaultRepositoryName] as ILoggerRepository;
-				if (rep == null)
-				{
-					// Must create the repository
-					rep = CreateRepository(DefaultRepositoryName, repositoryType);
-				}
+        // First check that the repository does not exist
+        ILoggerRepository rep = m_name2repositoryMap[DefaultRepositoryName] as ILoggerRepository;
+        if (rep == null)
+        {
+          // Must create the repository
+          rep = CreateRepository(DefaultRepositoryName, repositoryType);
+        }
 
-				return rep;
-			}		
-		}
+        return rep;
+      }
+    }
 
-		/// <summary>
-		/// Create a new repository for the repository specified
-		/// </summary>
-		/// <param name="repositoryName">the repository to associate with the <see cref="ILoggerRepository"/></param>
-		/// <param name="repositoryType">the type of repository to create, must implement <see cref="ILoggerRepository"/>.
-		/// If this param is null then the default repository type is used.</param>
-		/// <returns>the repository created</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(string)"/> with the
-		/// same repository specified will return the same repository instance.
-		/// </para>
-		/// <para>
-		/// If the named repository already exists an exception will be thrown.
-		/// </para>
-		/// <para>
-		/// If <paramref name="repositoryType"/> is <c>null</c> then the default 
-		/// repository type specified to the constructor is used.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">throw if <paramref name="repositoryName"/> is null</exception>
-		/// <exception cref="LogException">throw if the <paramref name="repositoryName"/> already exists</exception>
-		public ILoggerRepository CreateRepository(string repositoryName, Type repositoryType)
-		{
-			if (repositoryName == null)
-			{
-				throw new ArgumentNullException("repositoryName");
-			}
+    /// <summary>
+    /// Create a new repository for the repository specified
+    /// </summary>
+    /// <param name="repositoryName">the repository to associate with the <see cref="ILoggerRepository"/></param>
+    /// <param name="repositoryType">the type of repository to create, must implement <see cref="ILoggerRepository"/>.
+    /// If this param is null then the default repository type is used.</param>
+    /// <returns>the repository created</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(string)"/> with the
+    /// same repository specified will return the same repository instance.
+    /// </para>
+    /// <para>
+    /// If the named repository already exists an exception will be thrown.
+    /// </para>
+    /// <para>
+    /// If <paramref name="repositoryType"/> is <c>null</c> then the default 
+    /// repository type specified to the constructor is used.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">throw if <paramref name="repositoryName"/> is null</exception>
+    /// <exception cref="LogException">throw if the <paramref name="repositoryName"/> already exists</exception>
+    public ILoggerRepository CreateRepository(string repositoryName, Type repositoryType)
+    {
+      if (repositoryName == null)
+      {
+        throw new ArgumentNullException("repositoryName");
+      }
 
-			// If the type is not set then use the default type
-			if (repositoryType == null)
-			{
-				repositoryType = m_defaultRepositoryType;
-			}
+      // If the type is not set then use the default type
+      if (repositoryType == null)
+      {
+        repositoryType = m_defaultRepositoryType;
+      }
 
-			lock(this)
-			{
-				ILoggerRepository rep = null;
+      lock (this)
+      {
+        ILoggerRepository rep = null;
 
-				// First check that the repository does not exist
-				rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
-				if (rep != null)
-				{
-					throw new LogException("Repository ["+repositoryName+"] is already defined. Repositories cannot be redefined.");
-				}
-				else
-				{
-					LogLog.Debug(declaringType, "Creating repository ["+repositoryName+"] using type ["+repositoryType+"]");
+        // First check that the repository does not exist
+        rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
+        if (rep != null)
+        {
+          throw new LogException("Repository [" + repositoryName + "] is already defined. Repositories cannot be redefined.");
+        }
+        else
+        {
+          LogLog.Debug(declaringType, "Creating repository [" + repositoryName + "] using type [" + repositoryType + "]");
 
-					// Call the no arg constructor for the repositoryType
-					rep = (ILoggerRepository)Activator.CreateInstance(repositoryType);
+          // Call the no arg constructor for the repositoryType
+          rep = (ILoggerRepository)Activator.CreateInstance(repositoryType);
 
-					// Set the name of the repository
-					rep.Name = repositoryName;
+          // Set the name of the repository
+          rep.Name = repositoryName;
 
-					// Store in map
-					m_name2repositoryMap[repositoryName] = rep;
+          // Store in map
+          m_name2repositoryMap[repositoryName] = rep;
 
-					// Notify listeners that the repository has been created
-					OnLoggerRepositoryCreatedEvent(rep);
-				}
+          // Notify listeners that the repository has been created
+          OnLoggerRepositoryCreatedEvent(rep);
+        }
 
-				return rep;
-			}
-		}
+        return rep;
+      }
+    }
 
-		/// <summary>
-		/// Test if a named repository exists
-		/// </summary>
-		/// <param name="repositoryName">the named repository to check</param>
-		/// <returns><c>true</c> if the repository exists</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if a named repository exists. Use <see cref="M:CreateRepository(string, Type)"/>
-		/// to create a new repository and <see cref="M:GetRepository(string)"/> to retrieve 
-		/// a repository.
-		/// </para>
-		/// </remarks>
-		public bool ExistsRepository(string repositoryName)
-		{
-			lock(this)
-			{
-				return m_name2repositoryMap.ContainsKey(repositoryName);
-			}
-		}
+    /// <summary>
+    /// Test if a named repository exists
+    /// </summary>
+    /// <param name="repositoryName">the named repository to check</param>
+    /// <returns><c>true</c> if the repository exists</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if a named repository exists. Use <see cref="M:CreateRepository(string, Type)"/>
+    /// to create a new repository and <see cref="M:GetRepository(string)"/> to retrieve 
+    /// a repository.
+    /// </para>
+    /// </remarks>
+    public bool ExistsRepository(string repositoryName)
+    {
+      lock (this)
+      {
+        return m_name2repositoryMap.ContainsKey(repositoryName);
+      }
+    }
 
-		/// <summary>
-		/// Gets a list of <see cref="ILoggerRepository"/> objects
-		/// </summary>
-		/// <returns>an array of all known <see cref="ILoggerRepository"/> objects</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets an array of all of the repositories created by this selector.
-		/// </para>
-		/// </remarks>
-		public ILoggerRepository[] GetAllRepositories()
-		{
-			lock(this)
-			{
-				ICollection reps = m_name2repositoryMap.Values;
-				ILoggerRepository[] all = new ILoggerRepository[reps.Count];
-				reps.CopyTo(all, 0);
-				return all;
-			}
-		}
+    /// <summary>
+    /// Gets a list of <see cref="ILoggerRepository"/> objects
+    /// </summary>
+    /// <returns>an array of all known <see cref="ILoggerRepository"/> objects</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets an array of all of the repositories created by this selector.
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository[] GetAllRepositories()
+    {
+      lock (this)
+      {
+        ICollection reps = m_name2repositoryMap.Values;
+        ILoggerRepository[] all = new ILoggerRepository[reps.Count];
+        reps.CopyTo(all, 0);
+        return all;
+      }
+    }
 
-		#endregion
+    #endregion
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the CompactRepositorySelector class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(CompactRepositorySelector);
+    /// <summary>
+    /// The fully qualified type of the CompactRepositorySelector class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(CompactRepositorySelector);
 
-	    #endregion Private Static Fields
+    #endregion Private Static Fields
 
-		/// <summary>
-		/// Event to notify that a logger repository has been created.
-		/// </summary>
-		/// <value>
-		/// Event to notify that a logger repository has been created.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when a new repository is created.
-		/// The event source will be this selector. The event args will
-		/// be a <see cref="LoggerRepositoryCreationEventArgs"/> which
-		/// holds the newly created <see cref="ILoggerRepository"/>.
-		/// </para>
-		/// </remarks>
-		public event LoggerRepositoryCreationEventHandler LoggerRepositoryCreatedEvent
-		{
-			add { m_loggerRepositoryCreatedEvent += value; }
-			remove { m_loggerRepositoryCreatedEvent -= value; }
-		}
+    /// <summary>
+    /// Event to notify that a logger repository has been created.
+    /// </summary>
+    /// <value>
+    /// Event to notify that a logger repository has been created.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when a new repository is created.
+    /// The event source will be this selector. The event args will
+    /// be a <see cref="LoggerRepositoryCreationEventArgs"/> which
+    /// holds the newly created <see cref="ILoggerRepository"/>.
+    /// </para>
+    /// </remarks>
+    public event LoggerRepositoryCreationEventHandler LoggerRepositoryCreatedEvent
+    {
+      add { m_loggerRepositoryCreatedEvent += value; }
+      remove { m_loggerRepositoryCreatedEvent -= value; }
+    }
 
-		/// <summary>
-		/// Notify the registered listeners that the repository has been created
-		/// </summary>
-		/// <param name="repository">The repository that has been created</param>
-		/// <remarks>
-		/// <para>
-		/// Raises the <event cref="LoggerRepositoryCreatedEvent">LoggerRepositoryCreatedEvent</event>
-		/// event.
-		/// </para>
-		/// </remarks>
-		protected virtual void OnLoggerRepositoryCreatedEvent(ILoggerRepository repository)
-		{
-			LoggerRepositoryCreationEventHandler handler = m_loggerRepositoryCreatedEvent;
-			if (handler != null)
-			{
-				handler(this, new LoggerRepositoryCreationEventArgs(repository));
-			}
-		}
-	}
+    /// <summary>
+    /// Notify the registered listeners that the repository has been created
+    /// </summary>
+    /// <param name="repository">The repository that has been created</param>
+    /// <remarks>
+    /// <para>
+    /// Raises the <event cref="LoggerRepositoryCreatedEvent">LoggerRepositoryCreatedEvent</event>
+    /// event.
+    /// </para>
+    /// </remarks>
+    protected virtual void OnLoggerRepositoryCreatedEvent(ILoggerRepository repository)
+    {
+      LoggerRepositoryCreationEventHandler handler = m_loggerRepositoryCreatedEvent;
+      if (handler != null)
+      {
+        handler(this, new LoggerRepositoryCreationEventArgs(repository));
+      }
+    }
+  }
 }
diff --git a/src/log4net/Core/DefaultRepositorySelector.cs b/src/log4net/Core/DefaultRepositorySelector.cs
index 2cc84d2..913bfc8 100644
--- a/src/log4net/Core/DefaultRepositorySelector.cs
+++ b/src/log4net/Core/DefaultRepositorySelector.cs
@@ -37,688 +37,688 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// The default implementation of the <see cref="IRepositorySelector"/> interface.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Uses attributes defined on the calling assembly to determine how to
-	/// configure the hierarchy for the repository.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class DefaultRepositorySelector : IRepositorySelector
-	{
-		#region Public Events
+  /// <summary>
+  /// The default implementation of the <see cref="IRepositorySelector"/> interface.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Uses attributes defined on the calling assembly to determine how to
+  /// configure the hierarchy for the repository.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class DefaultRepositorySelector : IRepositorySelector
+  {
+    #region Public Events
 
-		/// <summary>
-		/// Event to notify that a logger repository has been created.
-		/// </summary>
-		/// <value>
-		/// Event to notify that a logger repository has been created.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when a new repository is created.
-		/// The event source will be this selector. The event args will
-		/// be a <see cref="LoggerRepositoryCreationEventArgs"/> which
-		/// holds the newly created <see cref="ILoggerRepository"/>.
-		/// </para>
-		/// </remarks>
-		public event LoggerRepositoryCreationEventHandler LoggerRepositoryCreatedEvent 
-		{
-			add { m_loggerRepositoryCreatedEvent += value; }
-			remove { m_loggerRepositoryCreatedEvent -= value; }
-		}
+    /// <summary>
+    /// Event to notify that a logger repository has been created.
+    /// </summary>
+    /// <value>
+    /// Event to notify that a logger repository has been created.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when a new repository is created.
+    /// The event source will be this selector. The event args will
+    /// be a <see cref="LoggerRepositoryCreationEventArgs"/> which
+    /// holds the newly created <see cref="ILoggerRepository"/>.
+    /// </para>
+    /// </remarks>
+    public event LoggerRepositoryCreationEventHandler LoggerRepositoryCreatedEvent
+    {
+      add { m_loggerRepositoryCreatedEvent += value; }
+      remove { m_loggerRepositoryCreatedEvent -= value; }
+    }
 
-		#endregion Public Events
+    #endregion Public Events
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Creates a new repository selector.
-		/// </summary>
-		/// <param name="defaultRepositoryType">The type of the repositories to create, must implement <see cref="ILoggerRepository"/></param>
-		/// <remarks>
-		/// <para>
-		/// Create an new repository selector.
-		/// The default type for repositories must be specified,
-		/// an appropriate value would be <see cref="log4net.Repository.Hierarchy.Hierarchy"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException"><paramref name="defaultRepositoryType"/> is <see langword="null" />.</exception>
-		/// <exception cref="ArgumentOutOfRangeException"><paramref name="defaultRepositoryType"/> does not implement <see cref="ILoggerRepository"/>.</exception>
-		public DefaultRepositorySelector(Type defaultRepositoryType)
-		{
-			if (defaultRepositoryType == null)
-			{
-				throw new ArgumentNullException("defaultRepositoryType");
-			}
+    /// <summary>
+    /// Creates a new repository selector.
+    /// </summary>
+    /// <param name="defaultRepositoryType">The type of the repositories to create, must implement <see cref="ILoggerRepository"/></param>
+    /// <remarks>
+    /// <para>
+    /// Create an new repository selector.
+    /// The default type for repositories must be specified,
+    /// an appropriate value would be <see cref="log4net.Repository.Hierarchy.Hierarchy"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException"><paramref name="defaultRepositoryType"/> is <see langword="null" />.</exception>
+    /// <exception cref="ArgumentOutOfRangeException"><paramref name="defaultRepositoryType"/> does not implement <see cref="ILoggerRepository"/>.</exception>
+    public DefaultRepositorySelector(Type defaultRepositoryType)
+    {
+      if (defaultRepositoryType == null)
+      {
+        throw new ArgumentNullException("defaultRepositoryType");
+      }
 
-			// Check that the type is a repository
-			if (! (typeof(ILoggerRepository).IsAssignableFrom(defaultRepositoryType)) )
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("defaultRepositoryType", defaultRepositoryType, "Parameter: defaultRepositoryType, Value: [" + defaultRepositoryType + "] out of range. Argument must implement the ILoggerRepository interface");
-			}
+      // Check that the type is a repository
+      if (!(typeof(ILoggerRepository).IsAssignableFrom(defaultRepositoryType)))
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("defaultRepositoryType", defaultRepositoryType, "Parameter: defaultRepositoryType, Value: [" + defaultRepositoryType + "] out of range. Argument must implement the ILoggerRepository interface");
+      }
 
-			m_defaultRepositoryType = defaultRepositoryType;
+      m_defaultRepositoryType = defaultRepositoryType;
 
-			LogLog.Debug(declaringType, "defaultRepositoryType [" + m_defaultRepositoryType + "]");
-		}
+      LogLog.Debug(declaringType, "defaultRepositoryType [" + m_defaultRepositoryType + "]");
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Implementation of IRepositorySelector
+    #region Implementation of IRepositorySelector
 
-		/// <summary>
-		/// Gets the <see cref="ILoggerRepository"/> for the specified assembly.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly use to lookup the <see cref="ILoggerRepository"/>.</param>
-		/// <remarks>
-		/// <para>
-		/// The type of the <see cref="ILoggerRepository"/> created and the repository 
-		/// to create can be overridden by specifying the <see cref="log4net.Config.RepositoryAttribute"/> 
-		/// attribute on the <paramref name="repositoryAssembly"/>.
-		/// </para>
-		/// <para>
-		/// The default values are to use the <see cref="log4net.Repository.Hierarchy.Hierarchy"/> 
-		/// implementation of the <see cref="ILoggerRepository"/> interface and to use the
-		/// <see cref="AssemblyName.Name"/> as the name of the repository.
-		/// </para>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be automatically configured using 
-		/// any <see cref="log4net.Config.ConfiguratorAttribute"/> attributes defined on
-		/// the <paramref name="repositoryAssembly"/>.
-		/// </para>
-		/// </remarks>
-		/// <returns>The <see cref="ILoggerRepository"/> for the assembly</returns>
-		/// <exception cref="ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null" />.</exception>
-		public ILoggerRepository GetRepository(Assembly repositoryAssembly)
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			return CreateRepository(repositoryAssembly, m_defaultRepositoryType);
-		}
+    /// <summary>
+    /// Gets the <see cref="ILoggerRepository"/> for the specified assembly.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly use to lookup the <see cref="ILoggerRepository"/>.</param>
+    /// <remarks>
+    /// <para>
+    /// The type of the <see cref="ILoggerRepository"/> created and the repository 
+    /// to create can be overridden by specifying the <see cref="log4net.Config.RepositoryAttribute"/> 
+    /// attribute on the <paramref name="repositoryAssembly"/>.
+    /// </para>
+    /// <para>
+    /// The default values are to use the <see cref="log4net.Repository.Hierarchy.Hierarchy"/> 
+    /// implementation of the <see cref="ILoggerRepository"/> interface and to use the
+    /// <see cref="AssemblyName.Name"/> as the name of the repository.
+    /// </para>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be automatically configured using 
+    /// any <see cref="log4net.Config.ConfiguratorAttribute"/> attributes defined on
+    /// the <paramref name="repositoryAssembly"/>.
+    /// </para>
+    /// </remarks>
+    /// <returns>The <see cref="ILoggerRepository"/> for the assembly</returns>
+    /// <exception cref="ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null" />.</exception>
+    public ILoggerRepository GetRepository(Assembly repositoryAssembly)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      return CreateRepository(repositoryAssembly, m_defaultRepositoryType);
+    }
 
-		/// <summary>
-		/// Gets the <see cref="ILoggerRepository"/> for the specified repository.
-		/// </summary>
-		/// <param name="repositoryName">The repository to use to lookup the <see cref="ILoggerRepository"/>.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> for the specified repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the named repository. If <paramref name="repositoryName"/> is <c>null</c>
-		/// a <see cref="ArgumentNullException"/> is thrown. If the repository 
-		/// does not exist a <see cref="LogException"/> is thrown.
-		/// </para>
-		/// <para>
-		/// Use <see cref="M:CreateRepository(string, Type)"/> to create a repository.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException"><paramref name="repositoryName"/> is <see langword="null" />.</exception>
-		/// <exception cref="LogException"><paramref name="repositoryName"/> does not exist.</exception>
-		public ILoggerRepository GetRepository(string repositoryName)
-		{
-			if (repositoryName == null)
-			{
-				throw new ArgumentNullException("repositoryName");
-			}
+    /// <summary>
+    /// Gets the <see cref="ILoggerRepository"/> for the specified repository.
+    /// </summary>
+    /// <param name="repositoryName">The repository to use to lookup the <see cref="ILoggerRepository"/>.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> for the specified repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the named repository. If <paramref name="repositoryName"/> is <c>null</c>
+    /// a <see cref="ArgumentNullException"/> is thrown. If the repository 
+    /// does not exist a <see cref="LogException"/> is thrown.
+    /// </para>
+    /// <para>
+    /// Use <see cref="M:CreateRepository(string, Type)"/> to create a repository.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException"><paramref name="repositoryName"/> is <see langword="null" />.</exception>
+    /// <exception cref="LogException"><paramref name="repositoryName"/> does not exist.</exception>
+    public ILoggerRepository GetRepository(string repositoryName)
+    {
+      if (repositoryName == null)
+      {
+        throw new ArgumentNullException("repositoryName");
+      }
 
-			lock(this)
-			{
-				// Lookup in map
-				ILoggerRepository rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
-				if (rep == null)
-				{
-					throw new LogException("Repository [" + repositoryName + "] is NOT defined.");
-				}
-				return rep;
-			}
-		}
+      lock (this)
+      {
+        // Lookup in map
+        ILoggerRepository rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
+        if (rep == null)
+        {
+          throw new LogException("Repository [" + repositoryName + "] is NOT defined.");
+        }
+        return rep;
+      }
+    }
 
-		/// <summary>
-		/// Create a new repository for the assembly specified 
-		/// </summary>
-		/// <param name="repositoryAssembly">the assembly to use to create the repository to associate with the <see cref="ILoggerRepository"/>.</param>
-		/// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
-		/// <returns>The repository created.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// <para>
-		/// The type of the <see cref="ILoggerRepository"/> created and
-		/// the repository to create can be overridden by specifying the
-		/// <see cref="log4net.Config.RepositoryAttribute"/> attribute on the 
-		/// <paramref name="repositoryAssembly"/>.  The default values are to use the 
-		/// <paramref name="repositoryType"/> implementation of the 
-		/// <see cref="ILoggerRepository"/> interface and to use the
-		/// <see cref="AssemblyName.Name"/> as the name of the repository.
-		/// </para>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be automatically
-		/// configured using any <see cref="log4net.Config.ConfiguratorAttribute"/> 
-		/// attributes defined on the <paramref name="repositoryAssembly"/>.
-		/// </para>
-		/// <para>
-		/// If a repository for the <paramref name="repositoryAssembly"/> already exists
-		/// that repository will be returned. An error will not be raised and that 
-		/// repository may be of a different type to that specified in <paramref name="repositoryType"/>.
-		/// Also the <see cref="log4net.Config.RepositoryAttribute"/> attribute on the
-		/// assembly may be used to override the repository type specified in 
-		/// <paramref name="repositoryType"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null" />.</exception>
-		public ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType)
-		{
-			return CreateRepository(repositoryAssembly, repositoryType, DefaultRepositoryName, true);
-		}
+    /// <summary>
+    /// Create a new repository for the assembly specified 
+    /// </summary>
+    /// <param name="repositoryAssembly">the assembly to use to create the repository to associate with the <see cref="ILoggerRepository"/>.</param>
+    /// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
+    /// <returns>The repository created.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// <para>
+    /// The type of the <see cref="ILoggerRepository"/> created and
+    /// the repository to create can be overridden by specifying the
+    /// <see cref="log4net.Config.RepositoryAttribute"/> attribute on the 
+    /// <paramref name="repositoryAssembly"/>.  The default values are to use the 
+    /// <paramref name="repositoryType"/> implementation of the 
+    /// <see cref="ILoggerRepository"/> interface and to use the
+    /// <see cref="AssemblyName.Name"/> as the name of the repository.
+    /// </para>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be automatically
+    /// configured using any <see cref="log4net.Config.ConfiguratorAttribute"/> 
+    /// attributes defined on the <paramref name="repositoryAssembly"/>.
+    /// </para>
+    /// <para>
+    /// If a repository for the <paramref name="repositoryAssembly"/> already exists
+    /// that repository will be returned. An error will not be raised and that 
+    /// repository may be of a different type to that specified in <paramref name="repositoryType"/>.
+    /// Also the <see cref="log4net.Config.RepositoryAttribute"/> attribute on the
+    /// assembly may be used to override the repository type specified in 
+    /// <paramref name="repositoryType"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null" />.</exception>
+    public ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType)
+    {
+      return CreateRepository(repositoryAssembly, repositoryType, DefaultRepositoryName, true);
+    }
 
-		/// <summary>
-		/// Creates a new repository for the assembly specified.
-		/// </summary>
-		/// <param name="repositoryAssembly">the assembly to use to create the repository to associate with the <see cref="ILoggerRepository"/>.</param>
-		/// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
-		/// <param name="repositoryName">The name to assign to the created repository</param>
-		/// <param name="readAssemblyAttributes">Set to <c>true</c> to read and apply the assembly attributes</param>
-		/// <returns>The repository created.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// <para>
-		/// The type of the <see cref="ILoggerRepository"/> created and
-		/// the repository to create can be overridden by specifying the
-		/// <see cref="log4net.Config.RepositoryAttribute"/> attribute on the 
-		/// <paramref name="repositoryAssembly"/>.  The default values are to use the 
-		/// <paramref name="repositoryType"/> implementation of the 
-		/// <see cref="ILoggerRepository"/> interface and to use the
-		/// <see cref="AssemblyName.Name"/> as the name of the repository.
-		/// </para>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be automatically
-		/// configured using any <see cref="log4net.Config.ConfiguratorAttribute"/> 
-		/// attributes defined on the <paramref name="repositoryAssembly"/>.
-		/// </para>
-		/// <para>
-		/// If a repository for the <paramref name="repositoryAssembly"/> already exists
-		/// that repository will be returned. An error will not be raised and that 
-		/// repository may be of a different type to that specified in <paramref name="repositoryType"/>.
-		/// Also the <see cref="log4net.Config.RepositoryAttribute"/> attribute on the
-		/// assembly may be used to override the repository type specified in 
-		/// <paramref name="repositoryType"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null" />.</exception>
-		public ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType, string repositoryName, bool readAssemblyAttributes)
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
+    /// <summary>
+    /// Creates a new repository for the assembly specified.
+    /// </summary>
+    /// <param name="repositoryAssembly">the assembly to use to create the repository to associate with the <see cref="ILoggerRepository"/>.</param>
+    /// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
+    /// <param name="repositoryName">The name to assign to the created repository</param>
+    /// <param name="readAssemblyAttributes">Set to <c>true</c> to read and apply the assembly attributes</param>
+    /// <returns>The repository created.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// <para>
+    /// The type of the <see cref="ILoggerRepository"/> created and
+    /// the repository to create can be overridden by specifying the
+    /// <see cref="log4net.Config.RepositoryAttribute"/> attribute on the 
+    /// <paramref name="repositoryAssembly"/>.  The default values are to use the 
+    /// <paramref name="repositoryType"/> implementation of the 
+    /// <see cref="ILoggerRepository"/> interface and to use the
+    /// <see cref="AssemblyName.Name"/> as the name of the repository.
+    /// </para>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be automatically
+    /// configured using any <see cref="log4net.Config.ConfiguratorAttribute"/> 
+    /// attributes defined on the <paramref name="repositoryAssembly"/>.
+    /// </para>
+    /// <para>
+    /// If a repository for the <paramref name="repositoryAssembly"/> already exists
+    /// that repository will be returned. An error will not be raised and that 
+    /// repository may be of a different type to that specified in <paramref name="repositoryType"/>.
+    /// Also the <see cref="log4net.Config.RepositoryAttribute"/> attribute on the
+    /// assembly may be used to override the repository type specified in 
+    /// <paramref name="repositoryType"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException"><paramref name="repositoryAssembly"/> is <see langword="null" />.</exception>
+    public ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType, string repositoryName, bool readAssemblyAttributes)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
 
-			// If the type is not set then use the default type
-			if (repositoryType == null)
-			{
-				repositoryType = m_defaultRepositoryType;
-			}
+      // If the type is not set then use the default type
+      if (repositoryType == null)
+      {
+        repositoryType = m_defaultRepositoryType;
+      }
 
-			lock(this)
-			{
-				// Lookup in map
-				ILoggerRepository rep = m_assembly2repositoryMap[repositoryAssembly] as ILoggerRepository;
-				if (rep == null)
-				{
-					// Not found, therefore create
-					LogLog.Debug(declaringType, "Creating repository for assembly [" + repositoryAssembly + "]");
+      lock (this)
+      {
+        // Lookup in map
+        ILoggerRepository rep = m_assembly2repositoryMap[repositoryAssembly] as ILoggerRepository;
+        if (rep == null)
+        {
+          // Not found, therefore create
+          LogLog.Debug(declaringType, "Creating repository for assembly [" + repositoryAssembly + "]");
 
-					// Must specify defaults
-					string actualRepositoryName = repositoryName;
-					Type actualRepositoryType = repositoryType;
+          // Must specify defaults
+          string actualRepositoryName = repositoryName;
+          Type actualRepositoryType = repositoryType;
 
-					if (readAssemblyAttributes)
-					{
-						// Get the repository and type from the assembly attributes
-						GetInfoForAssembly(repositoryAssembly, ref actualRepositoryName, ref actualRepositoryType);
-					}
+          if (readAssemblyAttributes)
+          {
+            // Get the repository and type from the assembly attributes
+            GetInfoForAssembly(repositoryAssembly, ref actualRepositoryName, ref actualRepositoryType);
+          }
 
-					LogLog.Debug(declaringType, "Assembly [" + repositoryAssembly + "] using repository [" + actualRepositoryName + "] and repository type [" + actualRepositoryType + "]");
+          LogLog.Debug(declaringType, "Assembly [" + repositoryAssembly + "] using repository [" + actualRepositoryName + "] and repository type [" + actualRepositoryType + "]");
 
-					// Lookup the repository in the map (as this may already be defined)
-					rep = m_name2repositoryMap[actualRepositoryName] as ILoggerRepository;
-					if (rep == null)
-					{
-						// Create the repository
-						rep = CreateRepository(actualRepositoryName, actualRepositoryType);
+          // Lookup the repository in the map (as this may already be defined)
+          rep = m_name2repositoryMap[actualRepositoryName] as ILoggerRepository;
+          if (rep == null)
+          {
+            // Create the repository
+            rep = CreateRepository(actualRepositoryName, actualRepositoryType);
 
-						if (readAssemblyAttributes)
-						{
-							try
-							{
-								// Look for aliasing attributes
-								LoadAliases(repositoryAssembly, rep);
+            if (readAssemblyAttributes)
+            {
+              try
+              {
+                // Look for aliasing attributes
+                LoadAliases(repositoryAssembly, rep);
 
-								// Look for plugins defined on the assembly
-								LoadPlugins(repositoryAssembly, rep);
+                // Look for plugins defined on the assembly
+                LoadPlugins(repositoryAssembly, rep);
 
-								// Configure the repository using the assembly attributes
-								ConfigureRepository(repositoryAssembly, rep);
-							}
-							catch (Exception ex)
-							{
-								LogLog.Error(declaringType, "Failed to configure repository [" + actualRepositoryName + "] from assembly attributes.", ex);
-							}
-						}
-					}
-					else
-					{
-						LogLog.Debug(declaringType, "repository [" + actualRepositoryName + "] already exists, using repository type [" + rep.GetType().FullName + "]");
+                // Configure the repository using the assembly attributes
+                ConfigureRepository(repositoryAssembly, rep);
+              }
+              catch (Exception ex)
+              {
+                LogLog.Error(declaringType, "Failed to configure repository [" + actualRepositoryName + "] from assembly attributes.", ex);
+              }
+            }
+          }
+          else
+          {
+            LogLog.Debug(declaringType, "repository [" + actualRepositoryName + "] already exists, using repository type [" + rep.GetType().FullName + "]");
 
-						if (readAssemblyAttributes)
-						{
-							try
-							{
-								// Look for plugins defined on the assembly
-								LoadPlugins(repositoryAssembly, rep);
-							}
-							catch (Exception ex)
-							{
-								LogLog.Error(declaringType, "Failed to configure repository [" + actualRepositoryName + "] from assembly attributes.", ex);
-							}
-						}
-					}
-					m_assembly2repositoryMap[repositoryAssembly] = rep;
-				}
-				return rep;
-			}
-		}
+            if (readAssemblyAttributes)
+            {
+              try
+              {
+                // Look for plugins defined on the assembly
+                LoadPlugins(repositoryAssembly, rep);
+              }
+              catch (Exception ex)
+              {
+                LogLog.Error(declaringType, "Failed to configure repository [" + actualRepositoryName + "] from assembly attributes.", ex);
+              }
+            }
+          }
+          m_assembly2repositoryMap[repositoryAssembly] = rep;
+        }
+        return rep;
+      }
+    }
 
-		/// <summary>
-		/// Creates a new repository for the specified repository.
-		/// </summary>
-		/// <param name="repositoryName">The repository to associate with the <see cref="ILoggerRepository"/>.</param>
-		/// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.
-		/// If this param is <see langword="null" /> then the default repository type is used.</param>
-		/// <returns>The new repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(string)"/> with the
-		/// same repository specified will return the same repository instance.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException"><paramref name="repositoryName"/> is <see langword="null" />.</exception>
-		/// <exception cref="LogException"><paramref name="repositoryName"/> already exists.</exception>
-		public ILoggerRepository CreateRepository(string repositoryName, Type repositoryType)
-		{
-			if (repositoryName == null)
-			{
-				throw new ArgumentNullException("repositoryName");
-			}
+    /// <summary>
+    /// Creates a new repository for the specified repository.
+    /// </summary>
+    /// <param name="repositoryName">The repository to associate with the <see cref="ILoggerRepository"/>.</param>
+    /// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.
+    /// If this param is <see langword="null" /> then the default repository type is used.</param>
+    /// <returns>The new repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(string)"/> with the
+    /// same repository specified will return the same repository instance.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException"><paramref name="repositoryName"/> is <see langword="null" />.</exception>
+    /// <exception cref="LogException"><paramref name="repositoryName"/> already exists.</exception>
+    public ILoggerRepository CreateRepository(string repositoryName, Type repositoryType)
+    {
+      if (repositoryName == null)
+      {
+        throw new ArgumentNullException("repositoryName");
+      }
 
-			// If the type is not set then use the default type
-			if (repositoryType == null)
-			{
-				repositoryType = m_defaultRepositoryType;
-			}
+      // If the type is not set then use the default type
+      if (repositoryType == null)
+      {
+        repositoryType = m_defaultRepositoryType;
+      }
 
-			lock(this)
-			{
-				ILoggerRepository rep = null;
+      lock (this)
+      {
+        ILoggerRepository rep = null;
 
-				// First check that the repository does not exist
-				rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
-				if (rep != null)
-				{
-					throw new LogException("Repository [" + repositoryName + "] is already defined. Repositories cannot be redefined.");
-				}
-				else
-				{
-					// Lookup an alias before trying to create the new repository
-					ILoggerRepository aliasedRepository = m_alias2repositoryMap[repositoryName] as ILoggerRepository;
-					if (aliasedRepository != null)
-					{
-						// Found an alias
+        // First check that the repository does not exist
+        rep = m_name2repositoryMap[repositoryName] as ILoggerRepository;
+        if (rep != null)
+        {
+          throw new LogException("Repository [" + repositoryName + "] is already defined. Repositories cannot be redefined.");
+        }
+        else
+        {
+          // Lookup an alias before trying to create the new repository
+          ILoggerRepository aliasedRepository = m_alias2repositoryMap[repositoryName] as ILoggerRepository;
+          if (aliasedRepository != null)
+          {
+            // Found an alias
 
-						// Check repository type
-						if (aliasedRepository.GetType() == repositoryType)
-						{
-							// Repository type is compatible
-							LogLog.Debug(declaringType, "Aliasing repository [" + repositoryName + "] to existing repository [" + aliasedRepository.Name + "]");
-							rep = aliasedRepository;
+            // Check repository type
+            if (aliasedRepository.GetType() == repositoryType)
+            {
+              // Repository type is compatible
+              LogLog.Debug(declaringType, "Aliasing repository [" + repositoryName + "] to existing repository [" + aliasedRepository.Name + "]");
+              rep = aliasedRepository;
 
-							// Store in map
-							m_name2repositoryMap[repositoryName] = rep;
-						}
-						else
-						{
-							// Invalid repository type for alias
-							LogLog.Error(declaringType, "Failed to alias repository [" + repositoryName + "] to existing repository ["+aliasedRepository.Name+"]. Requested repository type ["+repositoryType.FullName+"] is not compatible with existing type [" + aliasedRepository.GetType().FullName + "]");
+              // Store in map
+              m_name2repositoryMap[repositoryName] = rep;
+            }
+            else
+            {
+              // Invalid repository type for alias
+              LogLog.Error(declaringType, "Failed to alias repository [" + repositoryName + "] to existing repository [" + aliasedRepository.Name + "]. Requested repository type [" + repositoryType.FullName + "] is not compatible with existing type [" + aliasedRepository.GetType().FullName + "]");
 
-							// We now drop through to create the repository without aliasing
-						}
-					}
+              // We now drop through to create the repository without aliasing
+            }
+          }
 
-					// If we could not find an alias
-					if (rep == null)
-					{
-						LogLog.Debug(declaringType, "Creating repository [" + repositoryName + "] using type [" + repositoryType + "]");
+          // If we could not find an alias
+          if (rep == null)
+          {
+            LogLog.Debug(declaringType, "Creating repository [" + repositoryName + "] using type [" + repositoryType + "]");
 
-						// Call the no arg constructor for the repositoryType
-						rep = (ILoggerRepository)Activator.CreateInstance(repositoryType);
+            // Call the no arg constructor for the repositoryType
+            rep = (ILoggerRepository)Activator.CreateInstance(repositoryType);
 
-						// Set the name of the repository
-						rep.Name = repositoryName;
+            // Set the name of the repository
+            rep.Name = repositoryName;
 
-						// Store in map
-						m_name2repositoryMap[repositoryName] = rep;
+            // Store in map
+            m_name2repositoryMap[repositoryName] = rep;
 
-						// Notify listeners that the repository has been created
-						OnLoggerRepositoryCreatedEvent(rep);
-					}
-				}
+            // Notify listeners that the repository has been created
+            OnLoggerRepositoryCreatedEvent(rep);
+          }
+        }
 
-				return rep;
-			}
-		}
+        return rep;
+      }
+    }
 
-		/// <summary>
-		/// Test if a named repository exists
-		/// </summary>
-		/// <param name="repositoryName">the named repository to check</param>
-		/// <returns><c>true</c> if the repository exists</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if a named repository exists. Use <see cref="M:CreateRepository(string, Type)"/>
-		/// to create a new repository and <see cref="M:GetRepository(string)"/> to retrieve 
-		/// a repository.
-		/// </para>
-		/// </remarks>
-		public bool ExistsRepository(string repositoryName)
-		{
-			lock(this)
-			{
-				return m_name2repositoryMap.ContainsKey(repositoryName);
-			}
-		}
+    /// <summary>
+    /// Test if a named repository exists
+    /// </summary>
+    /// <param name="repositoryName">the named repository to check</param>
+    /// <returns><c>true</c> if the repository exists</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if a named repository exists. Use <see cref="M:CreateRepository(string, Type)"/>
+    /// to create a new repository and <see cref="M:GetRepository(string)"/> to retrieve 
+    /// a repository.
+    /// </para>
+    /// </remarks>
+    public bool ExistsRepository(string repositoryName)
+    {
+      lock (this)
+      {
+        return m_name2repositoryMap.ContainsKey(repositoryName);
+      }
+    }
 
-		/// <summary>
-		/// Gets a list of <see cref="ILoggerRepository"/> objects
-		/// </summary>
-		/// <returns>an array of all known <see cref="ILoggerRepository"/> objects</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets an array of all of the repositories created by this selector.
-		/// </para>
-		/// </remarks>
-		public ILoggerRepository[] GetAllRepositories()
-		{
-			lock(this)
-			{
-				ICollection reps = m_name2repositoryMap.Values;
-				ILoggerRepository[] all = new ILoggerRepository[reps.Count];
-				reps.CopyTo(all, 0);
-				return all;
-			}
-		}
+    /// <summary>
+    /// Gets a list of <see cref="ILoggerRepository"/> objects
+    /// </summary>
+    /// <returns>an array of all known <see cref="ILoggerRepository"/> objects</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets an array of all of the repositories created by this selector.
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository[] GetAllRepositories()
+    {
+      lock (this)
+      {
+        ICollection reps = m_name2repositoryMap.Values;
+        ILoggerRepository[] all = new ILoggerRepository[reps.Count];
+        reps.CopyTo(all, 0);
+        return all;
+      }
+    }
 
-		#endregion Implementation of IRepositorySelector
+    #endregion Implementation of IRepositorySelector
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Aliases a repository to an existing repository.
-		/// </summary>
-		/// <param name="repositoryAlias">The repository to alias.</param>
-		/// <param name="repositoryTarget">The repository that the repository is aliased to.</param>
-		/// <remarks>
-		/// <para>
-		/// The repository specified will be aliased to the repository when created. 
-		/// The repository must not already exist.
-		/// </para>
-		/// <para>
-		/// When the repository is created it must utilize the same repository type as 
-		/// the repository it is aliased to, otherwise the aliasing will fail.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">
-		///	<para><paramref name="repositoryAlias" /> is <see langword="null" />.</para>
-		///	<para>-or-</para>
-		///	<para><paramref name="repositoryTarget" /> is <see langword="null" />.</para>
-		/// </exception>
-		public void AliasRepository(string repositoryAlias, ILoggerRepository repositoryTarget) 
-		{
-			if (repositoryAlias == null) 
-			{
-				throw new ArgumentNullException("repositoryAlias");
-			}
-			if (repositoryTarget == null) 
-			{
-				throw new ArgumentNullException("repositoryTarget");
-			}
+    /// <summary>
+    /// Aliases a repository to an existing repository.
+    /// </summary>
+    /// <param name="repositoryAlias">The repository to alias.</param>
+    /// <param name="repositoryTarget">The repository that the repository is aliased to.</param>
+    /// <remarks>
+    /// <para>
+    /// The repository specified will be aliased to the repository when created. 
+    /// The repository must not already exist.
+    /// </para>
+    /// <para>
+    /// When the repository is created it must utilize the same repository type as 
+    /// the repository it is aliased to, otherwise the aliasing will fail.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">
+    ///  <para><paramref name="repositoryAlias" /> is <see langword="null" />.</para>
+    ///  <para>-or-</para>
+    ///  <para><paramref name="repositoryTarget" /> is <see langword="null" />.</para>
+    /// </exception>
+    public void AliasRepository(string repositoryAlias, ILoggerRepository repositoryTarget)
+    {
+      if (repositoryAlias == null)
+      {
+        throw new ArgumentNullException("repositoryAlias");
+      }
+      if (repositoryTarget == null)
+      {
+        throw new ArgumentNullException("repositoryTarget");
+      }
 
-			lock(this) 
-			{
-				// Check if the alias is already set
-				if (m_alias2repositoryMap.Contains(repositoryAlias)) 
-				{
-					// Check if this is a duplicate of the current alias
-					if (repositoryTarget != ((ILoggerRepository)m_alias2repositoryMap[repositoryAlias])) 
-					{
-						// Cannot redefine existing alias
-						throw new InvalidOperationException("Repository [" + repositoryAlias + "] is already aliased to repository [" + ((ILoggerRepository)m_alias2repositoryMap[repositoryAlias]).Name + "]. Aliases cannot be redefined.");
-					}
-				}
-					// Check if the alias is already mapped to a repository
-				else if (m_name2repositoryMap.Contains(repositoryAlias)) 
-				{
-					// Check if this is a duplicate of the current mapping
-					if ( repositoryTarget != ((ILoggerRepository)m_name2repositoryMap[repositoryAlias]) ) 
-					{
-						// Cannot define alias for already mapped repository
-						throw new InvalidOperationException("Repository [" + repositoryAlias + "] already exists and cannot be aliased to repository [" + repositoryTarget.Name + "].");
-					}
-				}
-				else 
-				{
-					// Set the alias
-					m_alias2repositoryMap[repositoryAlias] = repositoryTarget;
-				}
-			}
-		}
+      lock (this)
+      {
+        // Check if the alias is already set
+        if (m_alias2repositoryMap.Contains(repositoryAlias))
+        {
+          // Check if this is a duplicate of the current alias
+          if (repositoryTarget != ((ILoggerRepository)m_alias2repositoryMap[repositoryAlias]))
+          {
+            // Cannot redefine existing alias
+            throw new InvalidOperationException("Repository [" + repositoryAlias + "] is already aliased to repository [" + ((ILoggerRepository)m_alias2repositoryMap[repositoryAlias]).Name + "]. Aliases cannot be redefined.");
+          }
+        }
+        // Check if the alias is already mapped to a repository
+        else if (m_name2repositoryMap.Contains(repositoryAlias))
+        {
+          // Check if this is a duplicate of the current mapping
+          if (repositoryTarget != ((ILoggerRepository)m_name2repositoryMap[repositoryAlias]))
+          {
+            // Cannot define alias for already mapped repository
+            throw new InvalidOperationException("Repository [" + repositoryAlias + "] already exists and cannot be aliased to repository [" + repositoryTarget.Name + "].");
+          }
+        }
+        else
+        {
+          // Set the alias
+          m_alias2repositoryMap[repositoryAlias] = repositoryTarget;
+        }
+      }
+    }
 
-		#endregion Public Instance Methods
+    #endregion Public Instance Methods
 
-		#region Protected Instance Methods
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Notifies the registered listeners that the repository has been created.
-		/// </summary>
-		/// <param name="repository">The repository that has been created.</param>
-		/// <remarks>
-		/// <para>
-		/// Raises the <see cref="LoggerRepositoryCreatedEvent"/> event.
-		/// </para>
-		/// </remarks>
-		protected virtual void OnLoggerRepositoryCreatedEvent(ILoggerRepository repository) 
-		{
-			LoggerRepositoryCreationEventHandler handler = m_loggerRepositoryCreatedEvent;
-			if (handler != null) 
-			{
-				handler(this, new LoggerRepositoryCreationEventArgs(repository));
-			}
-		}
+    /// <summary>
+    /// Notifies the registered listeners that the repository has been created.
+    /// </summary>
+    /// <param name="repository">The repository that has been created.</param>
+    /// <remarks>
+    /// <para>
+    /// Raises the <see cref="LoggerRepositoryCreatedEvent"/> event.
+    /// </para>
+    /// </remarks>
+    protected virtual void OnLoggerRepositoryCreatedEvent(ILoggerRepository repository)
+    {
+      LoggerRepositoryCreationEventHandler handler = m_loggerRepositoryCreatedEvent;
+      if (handler != null)
+      {
+        handler(this, new LoggerRepositoryCreationEventArgs(repository));
+      }
+    }
 
-		#endregion Protected Instance Methods
+    #endregion Protected Instance Methods
 
-		#region Private Instance Methods
+    #region Private Instance Methods
 
-		/// <summary>
-		/// Gets the repository name and repository type for the specified assembly.
-		/// </summary>
-		/// <param name="assembly">The assembly that has a <see cref="log4net.Config.RepositoryAttribute"/>.</param>
-		/// <param name="repositoryName">in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling.</param>
-		/// <param name="repositoryType">in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling.</param>
-		/// <exception cref="ArgumentNullException"><paramref name="assembly" /> is <see langword="null" />.</exception>
-		private void GetInfoForAssembly(Assembly assembly, ref string repositoryName, ref Type repositoryType)
-		{
-			if (assembly == null)
-			{
-				throw new ArgumentNullException("assembly");
-			}
+    /// <summary>
+    /// Gets the repository name and repository type for the specified assembly.
+    /// </summary>
+    /// <param name="assembly">The assembly that has a <see cref="log4net.Config.RepositoryAttribute"/>.</param>
+    /// <param name="repositoryName">in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling.</param>
+    /// <param name="repositoryType">in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling.</param>
+    /// <exception cref="ArgumentNullException"><paramref name="assembly" /> is <see langword="null" />.</exception>
+    private void GetInfoForAssembly(Assembly assembly, ref string repositoryName, ref Type repositoryType)
+    {
+      if (assembly == null)
+      {
+        throw new ArgumentNullException("assembly");
+      }
 
-			try
-			{
-				LogLog.Debug(declaringType, "Assembly [" + assembly.FullName + "] Loaded From [" + SystemInfo.AssemblyLocationInfo(assembly) + "]");
-			}
-			catch
-			{
-				// Ignore exception from debug call
-			}
+      try
+      {
+        LogLog.Debug(declaringType, "Assembly [" + assembly.FullName + "] Loaded From [" + SystemInfo.AssemblyLocationInfo(assembly) + "]");
+      }
+      catch
+      {
+        // Ignore exception from debug call
+      }
 
-			try
-			{
-				// Look for the RepositoryAttribute on the assembly 
+      try
+      {
+        // Look for the RepositoryAttribute on the assembly 
 #if NETSTANDARD
-				object[] repositoryAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.RepositoryAttribute)).ToArray();
+        object[] repositoryAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.RepositoryAttribute)).ToArray();
 #else
-				object[] repositoryAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.RepositoryAttribute), false);
+        object[] repositoryAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.RepositoryAttribute), false);
 #endif
-				if (repositoryAttributes == null || repositoryAttributes.Length == 0)
-				{
-					// This is not a problem, but its nice to know what is going on.
-					LogLog.Debug(declaringType, "Assembly [" + assembly + "] does not have a RepositoryAttribute specified.");
-				}
-				else
-				{
-					if (repositoryAttributes.Length > 1)
-					{
-						LogLog.Error(declaringType, "Assembly [" + assembly + "] has multiple log4net.Config.RepositoryAttribute assembly attributes. Only using first occurrence.");
-					}
+        if (repositoryAttributes == null || repositoryAttributes.Length == 0)
+        {
+          // This is not a problem, but its nice to know what is going on.
+          LogLog.Debug(declaringType, "Assembly [" + assembly + "] does not have a RepositoryAttribute specified.");
+        }
+        else
+        {
+          if (repositoryAttributes.Length > 1)
+          {
+            LogLog.Error(declaringType, "Assembly [" + assembly + "] has multiple log4net.Config.RepositoryAttribute assembly attributes. Only using first occurrence.");
+          }
 
-					log4net.Config.RepositoryAttribute domAttr = repositoryAttributes[0] as log4net.Config.RepositoryAttribute;
+          log4net.Config.RepositoryAttribute domAttr = repositoryAttributes[0] as log4net.Config.RepositoryAttribute;
 
-					if (domAttr == null)
-					{
-						LogLog.Error(declaringType, "Assembly [" + assembly + "] has a RepositoryAttribute but it does not!.");
-					}
-					else
-					{
-						// If the Name property is set then override the default
-						if (domAttr.Name != null)
-						{
-							repositoryName = domAttr.Name;
-						}
+          if (domAttr == null)
+          {
+            LogLog.Error(declaringType, "Assembly [" + assembly + "] has a RepositoryAttribute but it does not!.");
+          }
+          else
+          {
+            // If the Name property is set then override the default
+            if (domAttr.Name != null)
+            {
+              repositoryName = domAttr.Name;
+            }
 
-						// If the RepositoryType property is set then override the default
-						if (domAttr.RepositoryType != null)
-						{
-							// Check that the type is a repository
-							if (typeof(ILoggerRepository).IsAssignableFrom(domAttr.RepositoryType))
-							{
-								repositoryType = domAttr.RepositoryType;
-							}
-							else
-							{
-								LogLog.Error(declaringType, "DefaultRepositorySelector: Repository Type [" + domAttr.RepositoryType + "] must implement the ILoggerRepository interface.");
-							}
-						}
-					}
-				}
-			}
-			catch (Exception ex)
-			{
-				LogLog.Error(declaringType, "Unhandled exception in GetInfoForAssembly", ex);
-			}
-		}
+            // If the RepositoryType property is set then override the default
+            if (domAttr.RepositoryType != null)
+            {
+              // Check that the type is a repository
+              if (typeof(ILoggerRepository).IsAssignableFrom(domAttr.RepositoryType))
+              {
+                repositoryType = domAttr.RepositoryType;
+              }
+              else
+              {
+                LogLog.Error(declaringType, "DefaultRepositorySelector: Repository Type [" + domAttr.RepositoryType + "] must implement the ILoggerRepository interface.");
+              }
+            }
+          }
+        }
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Unhandled exception in GetInfoForAssembly", ex);
+      }
+    }
 
-		/// <summary>
-		/// Configures the repository using information from the assembly.
-		/// </summary>
-		/// <param name="assembly">The assembly containing <see cref="log4net.Config.ConfiguratorAttribute"/>
-		/// attributes which define the configuration for the repository.</param>
-		/// <param name="repository">The repository to configure.</param>
-		/// <exception cref="ArgumentNullException">
-		///	<para><paramref name="assembly" /> is <see langword="null" />.</para>
-		///	<para>-or-</para>
-		///	<para><paramref name="repository" /> is <see langword="null" />.</para>
-		/// </exception>
-		private void ConfigureRepository(Assembly assembly, ILoggerRepository repository)
-		{
-			if (assembly == null)
-			{
-				throw new ArgumentNullException("assembly");
-			}
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
+    /// <summary>
+    /// Configures the repository using information from the assembly.
+    /// </summary>
+    /// <param name="assembly">The assembly containing <see cref="log4net.Config.ConfiguratorAttribute"/>
+    /// attributes which define the configuration for the repository.</param>
+    /// <param name="repository">The repository to configure.</param>
+    /// <exception cref="ArgumentNullException">
+    ///  <para><paramref name="assembly" /> is <see langword="null" />.</para>
+    ///  <para>-or-</para>
+    ///  <para><paramref name="repository" /> is <see langword="null" />.</para>
+    /// </exception>
+    private void ConfigureRepository(Assembly assembly, ILoggerRepository repository)
+    {
+      if (assembly == null)
+      {
+        throw new ArgumentNullException("assembly");
+      }
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
 
-			// Look for the Configurator attributes (e.g. XmlConfiguratorAttribute) on the assembly
+      // Look for the Configurator attributes (e.g. XmlConfiguratorAttribute) on the assembly
 #if NETSTANDARD
-			object[] configAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.ConfiguratorAttribute)).ToArray();
+      object[] configAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.ConfiguratorAttribute)).ToArray();
 #else
-			object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.ConfiguratorAttribute), false);
+      object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.ConfiguratorAttribute), false);
 #endif
-			if (configAttributes != null && configAttributes.Length > 0)
-			{
-				// Sort the ConfiguratorAttributes in priority order
-				Array.Sort(configAttributes);
+      if (configAttributes != null && configAttributes.Length > 0)
+      {
+        // Sort the ConfiguratorAttributes in priority order
+        Array.Sort(configAttributes);
 
-				// Delegate to the attribute the job of configuring the repository
-				foreach(log4net.Config.ConfiguratorAttribute configAttr in configAttributes)
-				{
-					if (configAttr != null)
-					{
-						try
-						{
-							configAttr.Configure(assembly, repository);
-						}
-						catch (Exception ex)
-						{
-							LogLog.Error(declaringType, "Exception calling ["+configAttr.GetType().FullName+"] .Configure method.", ex);
-						}
-					}
-				}
-			}
+        // Delegate to the attribute the job of configuring the repository
+        foreach (log4net.Config.ConfiguratorAttribute configAttr in configAttributes)
+        {
+          if (configAttr != null)
+          {
+            try
+            {
+              configAttr.Configure(assembly, repository);
+            }
+            catch (Exception ex)
+            {
+              LogLog.Error(declaringType, "Exception calling [" + configAttr.GetType().FullName + "] .Configure method.", ex);
+            }
+          }
+        }
+      }
 
-			if (repository.Name == DefaultRepositoryName)
-			{
-				// Try to configure the default repository using an AppSettings specified config file
-				// Do this even if the repository has been configured (or claims to be), this allows overriding
-				// of the default config files etc, if that is required.
+      if (repository.Name == DefaultRepositoryName)
+      {
+        // Try to configure the default repository using an AppSettings specified config file
+        // Do this even if the repository has been configured (or claims to be), this allows overriding
+        // of the default config files etc, if that is required.
 
-				string repositoryConfigFile = SystemInfo.GetAppSetting("log4net.Config");
-				if (repositoryConfigFile != null && repositoryConfigFile.Length > 0)
-				{
-					string applicationBaseDirectory = null;
-					try
-					{
-						applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
-					}
-					catch(Exception ex)
-					{
-						LogLog.Warn(declaringType, "Exception getting ApplicationBaseDirectory. appSettings log4net.Config path ["+repositoryConfigFile+"] will be treated as an absolute URI", ex);
-					}
+        string repositoryConfigFile = SystemInfo.GetAppSetting("log4net.Config");
+        if (repositoryConfigFile != null && repositoryConfigFile.Length > 0)
+        {
+          string applicationBaseDirectory = null;
+          try
+          {
+            applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+          }
+          catch (Exception ex)
+          {
+            LogLog.Warn(declaringType, "Exception getting ApplicationBaseDirectory. appSettings log4net.Config path [" + repositoryConfigFile + "] will be treated as an absolute URI", ex);
+          }
 
-                    string repositoryConfigFilePath = repositoryConfigFile;
-                    if (applicationBaseDirectory != null)
-                    {
-                        repositoryConfigFilePath = Path.Combine(applicationBaseDirectory, repositoryConfigFile);
-                    }
+          string repositoryConfigFilePath = repositoryConfigFile;
+          if (applicationBaseDirectory != null)
+          {
+            repositoryConfigFilePath = Path.Combine(applicationBaseDirectory, repositoryConfigFile);
+          }
 
-                    // Determine whether to watch the file or not based on an app setting value:
-				    bool watchRepositoryConfigFile = false;
+          // Determine whether to watch the file or not based on an app setting value:
+          bool watchRepositoryConfigFile = false;
 #if NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0 || NETSTANDARD
-				    Boolean.TryParse(SystemInfo.GetAppSetting("log4net.Config.Watch"), out watchRepositoryConfigFile);
+          Boolean.TryParse(SystemInfo.GetAppSetting("log4net.Config.Watch"), out watchRepositoryConfigFile);
 #else
                                     {
                                         string watch = SystemInfo.GetAppSetting("log4net.Config.Watch");
@@ -736,178 +736,178 @@
                                     }
 #endif
 
-					if (watchRepositoryConfigFile)
-					{
- 						// As we are going to watch the config file it is required to resolve it as a 
- 						// physical file system path pass that in a FileInfo object to the Configurator
-						FileInfo repositoryConfigFileInfo = null;
-						try
-						{
-							repositoryConfigFileInfo = new FileInfo(repositoryConfigFilePath);
-						}
-						catch (Exception ex)
-						{
-                            LogLog.Error(declaringType, "DefaultRepositorySelector: Exception while parsing log4net.Config file physical path [" + repositoryConfigFilePath + "]", ex);
-						}
-						try
-						{
-                            LogLog.Debug(declaringType, "Loading and watching configuration for default repository from AppSettings specified Config path [" + repositoryConfigFilePath + "]");
+          if (watchRepositoryConfigFile)
+          {
+            // As we are going to watch the config file it is required to resolve it as a 
+            // physical file system path pass that in a FileInfo object to the Configurator
+            FileInfo repositoryConfigFileInfo = null;
+            try
+            {
+              repositoryConfigFileInfo = new FileInfo(repositoryConfigFilePath);
+            }
+            catch (Exception ex)
+            {
+              LogLog.Error(declaringType, "DefaultRepositorySelector: Exception while parsing log4net.Config file physical path [" + repositoryConfigFilePath + "]", ex);
+            }
+            try
+            {
+              LogLog.Debug(declaringType, "Loading and watching configuration for default repository from AppSettings specified Config path [" + repositoryConfigFilePath + "]");
 
-                            XmlConfigurator.ConfigureAndWatch(repository, repositoryConfigFileInfo);
-						}
-						catch (Exception ex)
-						{
-                            LogLog.Error(declaringType, "DefaultRepositorySelector: Exception calling XmlConfigurator.ConfigureAndWatch method with ConfigFilePath [" + repositoryConfigFilePath + "]", ex);
-						}
-					}
-					else
-					{
-                    // As we are not going to watch the config file it is easiest to just resolve it as a 
-					// URI and pass that to the Configurator
-					Uri repositoryConfigUri = null;
-					try
-					{
-					    repositoryConfigUri = new Uri(repositoryConfigFilePath);
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Exception while parsing log4net.Config file path ["+repositoryConfigFile+"]", ex);
-					}
+              XmlConfigurator.ConfigureAndWatch(repository, repositoryConfigFileInfo);
+            }
+            catch (Exception ex)
+            {
+              LogLog.Error(declaringType, "DefaultRepositorySelector: Exception calling XmlConfigurator.ConfigureAndWatch method with ConfigFilePath [" + repositoryConfigFilePath + "]", ex);
+            }
+          }
+          else
+          {
+            // As we are not going to watch the config file it is easiest to just resolve it as a 
+            // URI and pass that to the Configurator
+            Uri repositoryConfigUri = null;
+            try
+            {
+              repositoryConfigUri = new Uri(repositoryConfigFilePath);
+            }
+            catch (Exception ex)
+            {
+              LogLog.Error(declaringType, "Exception while parsing log4net.Config file path [" + repositoryConfigFile + "]", ex);
+            }
 
-					if (repositoryConfigUri != null)
-					{
-						LogLog.Debug(declaringType, "Loading configuration for default repository from AppSettings specified Config URI ["+repositoryConfigUri.ToString()+"]");
+            if (repositoryConfigUri != null)
+            {
+              LogLog.Debug(declaringType, "Loading configuration for default repository from AppSettings specified Config URI [" + repositoryConfigUri.ToString() + "]");
 
-						try
-						{
-							// TODO: Support other types of configurator
-							XmlConfigurator.Configure(repository, repositoryConfigUri);
-						}
-						catch (Exception ex)
-						{
-							LogLog.Error(declaringType, "Exception calling XmlConfigurator.Configure method with ConfigUri ["+repositoryConfigUri+"]", ex);
-						}
-					}
-                    }
-				}
-			}
-		}
+              try
+              {
+                // TODO: Support other types of configurator
+                XmlConfigurator.Configure(repository, repositoryConfigUri);
+              }
+              catch (Exception ex)
+              {
+                LogLog.Error(declaringType, "Exception calling XmlConfigurator.Configure method with ConfigUri [" + repositoryConfigUri + "]", ex);
+              }
+            }
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Loads the attribute defined plugins on the assembly.
-		/// </summary>
-		/// <param name="assembly">The assembly that contains the attributes.</param>
-		/// <param name="repository">The repository to add the plugins to.</param>
-		/// <exception cref="ArgumentNullException">
-		///	<para><paramref name="assembly" /> is <see langword="null" />.</para>
-		///	<para>-or-</para>
-		///	<para><paramref name="repository" /> is <see langword="null" />.</para>
-		/// </exception>
-		private void LoadPlugins(Assembly assembly, ILoggerRepository repository)
-		{
-			if (assembly == null)
-			{
-				throw new ArgumentNullException("assembly");
-			}
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
+    /// <summary>
+    /// Loads the attribute defined plugins on the assembly.
+    /// </summary>
+    /// <param name="assembly">The assembly that contains the attributes.</param>
+    /// <param name="repository">The repository to add the plugins to.</param>
+    /// <exception cref="ArgumentNullException">
+    ///  <para><paramref name="assembly" /> is <see langword="null" />.</para>
+    ///  <para>-or-</para>
+    ///  <para><paramref name="repository" /> is <see langword="null" />.</para>
+    /// </exception>
+    private void LoadPlugins(Assembly assembly, ILoggerRepository repository)
+    {
+      if (assembly == null)
+      {
+        throw new ArgumentNullException("assembly");
+      }
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
 
-			// Look for the PluginAttribute on the assembly
+      // Look for the PluginAttribute on the assembly
 #if NETSTANDARD
-			object[] configAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.PluginAttribute)).ToArray();
+      object[] configAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.PluginAttribute)).ToArray();
 #else
-			object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.PluginAttribute), false);
+      object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.PluginAttribute), false);
 #endif
-			if (configAttributes != null && configAttributes.Length > 0)
-			{
-				foreach(log4net.Plugin.IPluginFactory configAttr in configAttributes)
-				{
-					try
-					{
-						// Create the plugin and add it to the repository
-						repository.PluginMap.Add(configAttr.CreatePlugin());
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Failed to create plugin. Attribute [" + configAttr.ToString() + "]", ex);
-					}
-				}
-			}
-		}
+      if (configAttributes != null && configAttributes.Length > 0)
+      {
+        foreach (log4net.Plugin.IPluginFactory configAttr in configAttributes)
+        {
+          try
+          {
+            // Create the plugin and add it to the repository
+            repository.PluginMap.Add(configAttr.CreatePlugin());
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "Failed to create plugin. Attribute [" + configAttr.ToString() + "]", ex);
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Loads the attribute defined aliases on the assembly.
-		/// </summary>
-		/// <param name="assembly">The assembly that contains the attributes.</param>
-		/// <param name="repository">The repository to alias to.</param>
-		/// <exception cref="ArgumentNullException">
-		///	<para><paramref name="assembly" /> is <see langword="null" />.</para>
-		///	<para>-or-</para>
-		///	<para><paramref name="repository" /> is <see langword="null" />.</para>
-		/// </exception>
-		private void LoadAliases(Assembly assembly, ILoggerRepository repository)
-		{
-			if (assembly == null)
-			{
-				throw new ArgumentNullException("assembly");
-			}
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
+    /// <summary>
+    /// Loads the attribute defined aliases on the assembly.
+    /// </summary>
+    /// <param name="assembly">The assembly that contains the attributes.</param>
+    /// <param name="repository">The repository to alias to.</param>
+    /// <exception cref="ArgumentNullException">
+    ///  <para><paramref name="assembly" /> is <see langword="null" />.</para>
+    ///  <para>-or-</para>
+    ///  <para><paramref name="repository" /> is <see langword="null" />.</para>
+    /// </exception>
+    private void LoadAliases(Assembly assembly, ILoggerRepository repository)
+    {
+      if (assembly == null)
+      {
+        throw new ArgumentNullException("assembly");
+      }
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
 
-			// Look for the AliasRepositoryAttribute on the assembly
+      // Look for the AliasRepositoryAttribute on the assembly
 #if NETSTANDARD
-			object[] configAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.AliasRepositoryAttribute)).ToArray();
+      object[] configAttributes = assembly.GetCustomAttributes(typeof(log4net.Config.AliasRepositoryAttribute)).ToArray();
 #else
-			object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.AliasRepositoryAttribute), false);
+      object[] configAttributes = Attribute.GetCustomAttributes(assembly, typeof(log4net.Config.AliasRepositoryAttribute), false);
 #endif
-			if (configAttributes != null && configAttributes.Length > 0)
-			{
-				foreach(log4net.Config.AliasRepositoryAttribute configAttr in configAttributes)
-				{
-					try
-					{
-						AliasRepository(configAttr.Name, repository);
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Failed to alias repository [" + configAttr.Name + "]", ex);
-					}
-				}
-			}
-		}
+      if (configAttributes != null && configAttributes.Length > 0)
+      {
+        foreach (log4net.Config.AliasRepositoryAttribute configAttr in configAttributes)
+        {
+          try
+          {
+            AliasRepository(configAttr.Name, repository);
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "Failed to alias repository [" + configAttr.Name + "]", ex);
+          }
+        }
+      }
+    }
 
-		#endregion Private Instance Methods
+    #endregion Private Instance Methods
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-        /// <summary>
-        /// The fully qualified type of the DefaultRepositorySelector class.
-        /// </summary>
-        /// <remarks>
-        /// Used by the internal logger to record the Type of the
-        /// log message.
-        /// </remarks>
-        private static readonly Type declaringType = typeof(DefaultRepositorySelector);
+    /// <summary>
+    /// The fully qualified type of the DefaultRepositorySelector class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(DefaultRepositorySelector);
 
-		private const string DefaultRepositoryName = "log4net-default-repository";
+    private const string DefaultRepositoryName = "log4net-default-repository";
 
-		#endregion Private Static Fields
+    #endregion Private Static Fields
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private readonly Hashtable m_name2repositoryMap = new Hashtable();
-		private readonly Hashtable m_assembly2repositoryMap = new Hashtable();
-		private readonly Hashtable m_alias2repositoryMap = new Hashtable();
-		private readonly Type m_defaultRepositoryType;
+    private readonly Hashtable m_name2repositoryMap = new Hashtable();
+    private readonly Hashtable m_assembly2repositoryMap = new Hashtable();
+    private readonly Hashtable m_alias2repositoryMap = new Hashtable();
+    private readonly Type m_defaultRepositoryType;
 
-		private event LoggerRepositoryCreationEventHandler m_loggerRepositoryCreatedEvent;
+    private event LoggerRepositoryCreationEventHandler m_loggerRepositoryCreatedEvent;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
 
 #endif // !NETCF
diff --git a/src/log4net/Core/ErrorCode.cs b/src/log4net/Core/ErrorCode.cs
index 9107a24..3df2581 100644
--- a/src/log4net/Core/ErrorCode.cs
+++ b/src/log4net/Core/ErrorCode.cs
@@ -21,50 +21,50 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Defined error codes that can be passed to the <see cref="M:IErrorHandler.Error(string, Exception, ErrorCode)"/> method.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Values passed to the <see cref="M:IErrorHandler.Error(string, Exception, ErrorCode)"/> method.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public enum ErrorCode : int
-	{
-		/// <summary>
-		/// A general error
-		/// </summary>
-		GenericFailure = 0,
+  /// <summary>
+  /// Defined error codes that can be passed to the <see cref="M:IErrorHandler.Error(string, Exception, ErrorCode)"/> method.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Values passed to the <see cref="M:IErrorHandler.Error(string, Exception, ErrorCode)"/> method.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public enum ErrorCode : int
+  {
+    /// <summary>
+    /// A general error
+    /// </summary>
+    GenericFailure = 0,
 
-		/// <summary>
-		/// Error while writing output
-		/// </summary>
-		WriteFailure,
+    /// <summary>
+    /// Error while writing output
+    /// </summary>
+    WriteFailure,
 
-		/// <summary>
-		/// Failed to flush file
-		/// </summary>
-		FlushFailure,
+    /// <summary>
+    /// Failed to flush file
+    /// </summary>
+    FlushFailure,
 
-		/// <summary>
-		/// Failed to close file
-		/// </summary>
-		CloseFailure,
+    /// <summary>
+    /// Failed to close file
+    /// </summary>
+    CloseFailure,
 
-		/// <summary>
-		/// Unable to open output file
-		/// </summary>
-		FileOpenFailure,
+    /// <summary>
+    /// Unable to open output file
+    /// </summary>
+    FileOpenFailure,
 
-		/// <summary>
-		/// No layout specified
-		/// </summary>
-		MissingLayout,
+    /// <summary>
+    /// No layout specified
+    /// </summary>
+    MissingLayout,
 
-		/// <summary>
-		/// Failed to parse address
-		/// </summary>
-		AddressParseFailure
-	}
+    /// <summary>
+    /// Failed to parse address
+    /// </summary>
+    AddressParseFailure
+  }
 }
diff --git a/src/log4net/Core/ExceptionEvaluator.cs b/src/log4net/Core/ExceptionEvaluator.cs
index 60bac57..adaeb49 100644
--- a/src/log4net/Core/ExceptionEvaluator.cs
+++ b/src/log4net/Core/ExceptionEvaluator.cs
@@ -21,110 +21,110 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// An evaluator that triggers on an Exception type
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This evaluator will trigger if the type of the Exception
-	/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-	/// is equal to a Type in <see cref="ExceptionType"/>.    /// 
-	/// </para>
-	/// </remarks>
-	/// <author>Drew Schaeffer</author>
-	public class ExceptionEvaluator : ITriggeringEventEvaluator
-	{
-		/// <summary>
-		/// The type that causes the trigger to fire.
-		/// </summary>
-		private Type m_type;
+  /// <summary>
+  /// An evaluator that triggers on an Exception type
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This evaluator will trigger if the type of the Exception
+  /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+  /// is equal to a Type in <see cref="ExceptionType"/>.    /// 
+  /// </para>
+  /// </remarks>
+  /// <author>Drew Schaeffer</author>
+  public class ExceptionEvaluator : ITriggeringEventEvaluator
+  {
+    /// <summary>
+    /// The type that causes the trigger to fire.
+    /// </summary>
+    private Type m_type;
 
-		/// <summary>
-		/// Causes subclasses of <see cref="ExceptionType"/> to cause the trigger to fire.
-		/// </summary>
-		private bool m_triggerOnSubclass;
+    /// <summary>
+    /// Causes subclasses of <see cref="ExceptionType"/> to cause the trigger to fire.
+    /// </summary>
+    private bool m_triggerOnSubclass;
 
-		/// <summary>
-		/// Default ctor to allow dynamic creation through a configurator.
-		/// </summary>
-		public ExceptionEvaluator()
-		{
-			// empty
-		}
+    /// <summary>
+    /// Default ctor to allow dynamic creation through a configurator.
+    /// </summary>
+    public ExceptionEvaluator()
+    {
+      // empty
+    }
 
-		/// <summary>
-		/// Constructs an evaluator and initializes to trigger on <paramref name="exType"/>
-		/// </summary>
-		/// <param name="exType">the type that triggers this evaluator.</param>
-		/// <param name="triggerOnSubClass">If true, this evaluator will trigger on subclasses of <see cref="ExceptionType"/>.</param>
-		public ExceptionEvaluator(Type exType, bool triggerOnSubClass)
-		{
-			if (exType == null)
-			{
-				throw new ArgumentNullException("exType");
-			}
+    /// <summary>
+    /// Constructs an evaluator and initializes to trigger on <paramref name="exType"/>
+    /// </summary>
+    /// <param name="exType">the type that triggers this evaluator.</param>
+    /// <param name="triggerOnSubClass">If true, this evaluator will trigger on subclasses of <see cref="ExceptionType"/>.</param>
+    public ExceptionEvaluator(Type exType, bool triggerOnSubClass)
+    {
+      if (exType == null)
+      {
+        throw new ArgumentNullException("exType");
+      }
 
-			m_type = exType;
-			m_triggerOnSubclass = triggerOnSubClass;
-		}
+      m_type = exType;
+      m_triggerOnSubclass = triggerOnSubClass;
+    }
 
-		/// <summary>
-		/// The type that triggers this evaluator.
-		/// </summary>
-		public Type ExceptionType
-		{
-			get { return m_type; }
-			set { m_type = value; }
-		}
+    /// <summary>
+    /// The type that triggers this evaluator.
+    /// </summary>
+    public Type ExceptionType
+    {
+      get { return m_type; }
+      set { m_type = value; }
+    }
 
-		/// <summary>
-		/// If true, this evaluator will trigger on subclasses of <see cref="ExceptionType"/>.
-		/// </summary>
-		public bool TriggerOnSubclass
-		{
-			get { return m_triggerOnSubclass; }
-			set { m_triggerOnSubclass = value; }
-		}
+    /// <summary>
+    /// If true, this evaluator will trigger on subclasses of <see cref="ExceptionType"/>.
+    /// </summary>
+    public bool TriggerOnSubclass
+    {
+      get { return m_triggerOnSubclass; }
+      set { m_triggerOnSubclass = value; }
+    }
 
-		#region ITriggeringEventEvaluator Members
+    #region ITriggeringEventEvaluator Members
 
-		/// <summary>
-		/// Is this <paramref name="loggingEvent"/> the triggering event?
-		/// </summary>
-		/// <param name="loggingEvent">The event to check</param>
-		/// <returns>This method returns <c>true</c>, if the logging event Exception 
-		/// Type is <see cref="ExceptionType"/>. 
-		/// Otherwise it returns <c>false</c></returns>
-		/// <remarks>
-		/// <para>
-		/// This evaluator will trigger if the Exception Type of the event
-		/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-		/// is <see cref="ExceptionType"/>.
-		/// </para>
-		/// </remarks>
-		public bool IsTriggeringEvent(LoggingEvent loggingEvent)
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Is this <paramref name="loggingEvent"/> the triggering event?
+    /// </summary>
+    /// <param name="loggingEvent">The event to check</param>
+    /// <returns>This method returns <c>true</c>, if the logging event Exception 
+    /// Type is <see cref="ExceptionType"/>. 
+    /// Otherwise it returns <c>false</c></returns>
+    /// <remarks>
+    /// <para>
+    /// This evaluator will trigger if the Exception Type of the event
+    /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+    /// is <see cref="ExceptionType"/>.
+    /// </para>
+    /// </remarks>
+    public bool IsTriggeringEvent(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			if (m_triggerOnSubclass && loggingEvent.ExceptionObject != null)
-			{
-				// check if loggingEvent.ExceptionObject is of type ExceptionType or subclass of ExceptionType
-				Type exceptionObjectType = loggingEvent.ExceptionObject.GetType();
-				return exceptionObjectType == m_type || m_type.IsAssignableFrom(exceptionObjectType);
-			}
-			else if (!m_triggerOnSubclass && loggingEvent.ExceptionObject != null)
-			{   // check if loggingEvent.ExceptionObject is of type ExceptionType
-				return loggingEvent.ExceptionObject.GetType() == m_type;
-			}
-			else
-			{   // loggingEvent.ExceptionObject is null
-				return false;
-			}
-		}
+      if (m_triggerOnSubclass && loggingEvent.ExceptionObject != null)
+      {
+        // check if loggingEvent.ExceptionObject is of type ExceptionType or subclass of ExceptionType
+        Type exceptionObjectType = loggingEvent.ExceptionObject.GetType();
+        return exceptionObjectType == m_type || m_type.IsAssignableFrom(exceptionObjectType);
+      }
+      else if (!m_triggerOnSubclass && loggingEvent.ExceptionObject != null)
+      {   // check if loggingEvent.ExceptionObject is of type ExceptionType
+        return loggingEvent.ExceptionObject.GetType() == m_type;
+      }
+      else
+      {   // loggingEvent.ExceptionObject is null
+        return false;
+      }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Core/FixFlags.cs b/src/log4net/Core/FixFlags.cs
index b2e9445..1853f44 100644
--- a/src/log4net/Core/FixFlags.cs
+++ b/src/log4net/Core/FixFlags.cs
@@ -2,103 +2,103 @@
 
 namespace log4net.Core
 {
+  /// <summary>
+  /// Flags passed to the <see cref="LoggingEvent.Fix"/> property
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Flags passed to the <see cref="LoggingEvent.Fix"/> property
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  [Flags]
+  public enum FixFlags
+  {
     /// <summary>
-    /// Flags passed to the <see cref="LoggingEvent.Fix"/> property
+    /// Fix the MDC
+    /// </summary>
+    [Obsolete("Replaced by composite Properties")]
+    Mdc = 0x01,
+
+    /// <summary>
+    /// Fix the NDC
+    /// </summary>
+    Ndc = 0x02,
+
+    /// <summary>
+    /// Fix the rendered message
+    /// </summary>
+    Message = 0x04,
+
+    /// <summary>
+    /// Fix the thread name
+    /// </summary>
+    ThreadName = 0x08,
+
+    /// <summary>
+    /// Fix the callers location information
+    /// </summary>
+    /// <remarks>
+    /// CAUTION: Very slow to generate
+    /// </remarks>
+    LocationInfo = 0x10,
+
+    /// <summary>
+    /// Fix the callers windows user name
+    /// </summary>
+    /// <remarks>
+    /// CAUTION: Slow to generate
+    /// </remarks>
+    UserName = 0x20,
+
+    /// <summary>
+    /// Fix the domain friendly name
+    /// </summary>
+    Domain = 0x40,
+
+    /// <summary>
+    /// Fix the callers principal name
+    /// </summary>
+    /// <remarks>
+    /// CAUTION: May be slow to generate
+    /// </remarks>
+    Identity = 0x80,
+
+    /// <summary>
+    /// Fix the exception text
+    /// </summary>
+    Exception = 0x100,
+
+    /// <summary>
+    /// Fix the event properties. Active properties must implement <see cref="IFixingRequired"/> in order to be eligible for fixing.
+    /// </summary>
+    Properties = 0x200,
+
+    /// <summary>
+    /// No fields fixed
+    /// </summary>
+    None = 0x0,
+
+    /// <summary>
+    /// All fields fixed
+    /// </summary>
+    All = 0xFFFFFFF,
+
+    /// <summary>
+    /// Partial fields fixed
     /// </summary>
     /// <remarks>
     /// <para>
-    /// Flags passed to the <see cref="LoggingEvent.Fix"/> property
+    /// This set of partial fields gives good performance. The following fields are fixed:
     /// </para>
+    /// <list type="bullet">
+    /// <item><description><see cref="Message"/></description></item>
+    /// <item><description><see cref="ThreadName"/></description></item>
+    /// <item><description><see cref="Exception"/></description></item>
+    /// <item><description><see cref="Domain"/></description></item>
+    /// <item><description><see cref="Properties"/></description></item>
+    /// </list>
     /// </remarks>
-    /// <author>Nicko Cadell</author>
-    [Flags]
-    public enum FixFlags
-    {
-        /// <summary>
-        /// Fix the MDC
-        /// </summary>
-        [Obsolete("Replaced by composite Properties")]
-        Mdc = 0x01,
-
-        /// <summary>
-        /// Fix the NDC
-        /// </summary>
-        Ndc = 0x02,
-
-        /// <summary>
-        /// Fix the rendered message
-        /// </summary>
-        Message = 0x04,
-
-        /// <summary>
-        /// Fix the thread name
-        /// </summary>
-        ThreadName = 0x08,
-
-        /// <summary>
-        /// Fix the callers location information
-        /// </summary>
-        /// <remarks>
-        /// CAUTION: Very slow to generate
-        /// </remarks>
-        LocationInfo = 0x10,
-
-        /// <summary>
-        /// Fix the callers windows user name
-        /// </summary>
-        /// <remarks>
-        /// CAUTION: Slow to generate
-        /// </remarks>
-        UserName = 0x20,
-
-        /// <summary>
-        /// Fix the domain friendly name
-        /// </summary>
-        Domain = 0x40,
-
-        /// <summary>
-        /// Fix the callers principal name
-        /// </summary>
-        /// <remarks>
-        /// CAUTION: May be slow to generate
-        /// </remarks>
-        Identity = 0x80,
-
-        /// <summary>
-        /// Fix the exception text
-        /// </summary>
-        Exception = 0x100,
-
-        /// <summary>
-        /// Fix the event properties. Active properties must implement <see cref="IFixingRequired"/> in order to be eligible for fixing.
-        /// </summary>
-        Properties = 0x200,
-
-        /// <summary>
-        /// No fields fixed
-        /// </summary>
-        None = 0x0,
-
-        /// <summary>
-        /// All fields fixed
-        /// </summary>
-        All = 0xFFFFFFF,
-
-        /// <summary>
-        /// Partial fields fixed
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// This set of partial fields gives good performance. The following fields are fixed:
-        /// </para>
-        /// <list type="bullet">
-        /// <item><description><see cref="Message"/></description></item>
-        /// <item><description><see cref="ThreadName"/></description></item>
-        /// <item><description><see cref="Exception"/></description></item>
-        /// <item><description><see cref="Domain"/></description></item>
-        /// <item><description><see cref="Properties"/></description></item>
-        /// </list>
-        /// </remarks>
-        Partial = Message | ThreadName | Exception | Domain | Properties,
-    }
+    Partial = Message | ThreadName | Exception | Domain | Properties,
+  }
 }
\ No newline at end of file
diff --git a/src/log4net/Core/IAppenderAttachable.cs b/src/log4net/Core/IAppenderAttachable.cs
index 9c350c1..3632765 100644
--- a/src/log4net/Core/IAppenderAttachable.cs
+++ b/src/log4net/Core/IAppenderAttachable.cs
@@ -23,99 +23,99 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Interface for attaching appenders to objects.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface for attaching, removing and retrieving appenders.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IAppenderAttachable
-	{
-		/// <summary>
-		/// Attaches an appender.
-		/// </summary>
-		/// <param name="appender">The appender to add.</param>
-		/// <remarks>
-		/// <para>
-		/// Add the specified appender. The implementation may
-		/// choose to allow or deny duplicate appenders.
-		/// </para>
-		/// </remarks>
-		void AddAppender(IAppender appender);
+  /// <summary>
+  /// Interface for attaching appenders to objects.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface for attaching, removing and retrieving appenders.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IAppenderAttachable
+  {
+    /// <summary>
+    /// Attaches an appender.
+    /// </summary>
+    /// <param name="appender">The appender to add.</param>
+    /// <remarks>
+    /// <para>
+    /// Add the specified appender. The implementation may
+    /// choose to allow or deny duplicate appenders.
+    /// </para>
+    /// </remarks>
+    void AddAppender(IAppender appender);
 
-		/// <summary>
-		/// Gets all attached appenders.
-		/// </summary>
-		/// <value>
-		/// A collection of attached appenders.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets a collection of attached appenders.
-		/// If there are no attached appenders the
-		/// implementation should return an empty 
-		/// collection rather than <c>null</c>.
-		/// </para>
-		/// </remarks>
-		AppenderCollection Appenders {get;}
+    /// <summary>
+    /// Gets all attached appenders.
+    /// </summary>
+    /// <value>
+    /// A collection of attached appenders.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets a collection of attached appenders.
+    /// If there are no attached appenders the
+    /// implementation should return an empty 
+    /// collection rather than <c>null</c>.
+    /// </para>
+    /// </remarks>
+    AppenderCollection Appenders { get; }
 
-		/// <summary>
-		/// Gets an attached appender with the specified name.
-		/// </summary>
-		/// <param name="name">The name of the appender to get.</param>
-		/// <returns>
-		/// The appender with the name specified, or <c>null</c> if no appender with the
-		/// specified name is found.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Returns an attached appender with the <paramref name="name"/> specified.
-		/// If no appender with the specified name is found <c>null</c> will be
-		/// returned.
-		/// </para>
-		/// </remarks>
-		IAppender GetAppender(string name);
+    /// <summary>
+    /// Gets an attached appender with the specified name.
+    /// </summary>
+    /// <param name="name">The name of the appender to get.</param>
+    /// <returns>
+    /// The appender with the name specified, or <c>null</c> if no appender with the
+    /// specified name is found.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Returns an attached appender with the <paramref name="name"/> specified.
+    /// If no appender with the specified name is found <c>null</c> will be
+    /// returned.
+    /// </para>
+    /// </remarks>
+    IAppender GetAppender(string name);
 
-		/// <summary>
-		/// Removes all attached appenders.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Removes and closes all attached appenders
-		/// </para>
-		/// </remarks>
-		void RemoveAllAppenders();
+    /// <summary>
+    /// Removes all attached appenders.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Removes and closes all attached appenders
+    /// </para>
+    /// </remarks>
+    void RemoveAllAppenders();
 
-		/// <summary>
-		/// Removes the specified appender from the list of attached appenders.
-		/// </summary>
-		/// <param name="appender">The appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// <para>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </para>
-		/// </remarks>
-		IAppender RemoveAppender(IAppender appender);
+    /// <summary>
+    /// Removes the specified appender from the list of attached appenders.
+    /// </summary>
+    /// <param name="appender">The appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// <para>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </para>
+    /// </remarks>
+    IAppender RemoveAppender(IAppender appender);
 
-		/// <summary>
-		/// Removes the appender with the specified name from the list of appenders.
-		/// </summary>
-		/// <param name="name">The name of the appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// <para>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </para>
-		/// </remarks>
-		IAppender RemoveAppender(string name);   	
-	}
+    /// <summary>
+    /// Removes the appender with the specified name from the list of appenders.
+    /// </summary>
+    /// <param name="name">The name of the appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// <para>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </para>
+    /// </remarks>
+    IAppender RemoveAppender(string name);
+  }
 }
diff --git a/src/log4net/Core/IErrorHandler.cs b/src/log4net/Core/IErrorHandler.cs
index 763e518..06197de 100644
--- a/src/log4net/Core/IErrorHandler.cs
+++ b/src/log4net/Core/IErrorHandler.cs
@@ -21,55 +21,55 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Appenders may delegate their error handling to an <see cref="IErrorHandler" />.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Error handling is a particularly tedious to get right because by
-	/// definition errors are hard to predict and to reproduce. 
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IErrorHandler
-	{
-		/// <summary>
-		/// Handles the error and information about the error condition is passed as 
-		/// a parameter.
-		/// </summary>
-		/// <param name="message">The message associated with the error.</param>
-		/// <param name="e">The <see cref="Exception" /> that was thrown when the error occurred.</param>
-		/// <param name="errorCode">The error code associated with the error.</param>
-		/// <remarks>
-		/// <para>
-		/// Handles the error and information about the error condition is passed as 
-		/// a parameter.
-		/// </para>
-		/// </remarks>
-		void Error(string message, Exception e, ErrorCode errorCode);
+  /// <summary>
+  /// Appenders may delegate their error handling to an <see cref="IErrorHandler" />.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Error handling is a particularly tedious to get right because by
+  /// definition errors are hard to predict and to reproduce. 
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IErrorHandler
+  {
+    /// <summary>
+    /// Handles the error and information about the error condition is passed as 
+    /// a parameter.
+    /// </summary>
+    /// <param name="message">The message associated with the error.</param>
+    /// <param name="e">The <see cref="Exception" /> that was thrown when the error occurred.</param>
+    /// <param name="errorCode">The error code associated with the error.</param>
+    /// <remarks>
+    /// <para>
+    /// Handles the error and information about the error condition is passed as 
+    /// a parameter.
+    /// </para>
+    /// </remarks>
+    void Error(string message, Exception e, ErrorCode errorCode);
 
-		/// <summary>
-		/// Prints the error message passed as a parameter.
-		/// </summary>
-		/// <param name="message">The message associated with the error.</param>
-		/// <param name="e">The <see cref="Exception" /> that was thrown when the error occurred.</param>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="M:Error(string,Exception,ErrorCode)"/>.
-		/// </para>
-		/// </remarks>
-		void Error(string message, Exception e);
+    /// <summary>
+    /// Prints the error message passed as a parameter.
+    /// </summary>
+    /// <param name="message">The message associated with the error.</param>
+    /// <param name="e">The <see cref="Exception" /> that was thrown when the error occurred.</param>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="M:Error(string,Exception,ErrorCode)"/>.
+    /// </para>
+    /// </remarks>
+    void Error(string message, Exception e);
 
-		/// <summary>
-		/// Prints the error message passed as a parameter.
-		/// </summary>
-		/// <param name="message">The message associated with the error.</param>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="M:Error(string,Exception,ErrorCode)"/>.
-		/// </para>
-		/// </remarks>
-		void Error(string message);
-	}
+    /// <summary>
+    /// Prints the error message passed as a parameter.
+    /// </summary>
+    /// <param name="message">The message associated with the error.</param>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="M:Error(string,Exception,ErrorCode)"/>.
+    /// </para>
+    /// </remarks>
+    void Error(string message);
+  }
 }
diff --git a/src/log4net/Core/IFixingRequired.cs b/src/log4net/Core/IFixingRequired.cs
index 9f05b14..58e84cf 100644
--- a/src/log4net/Core/IFixingRequired.cs
+++ b/src/log4net/Core/IFixingRequired.cs
@@ -21,38 +21,38 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Interface for objects that require fixing.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface that indicates that the object requires fixing before it
-	/// can be taken outside the context of the appender's 
-	/// <see cref="log4net.Appender.IAppender.DoAppend"/> method.
-	/// </para>
-	/// <para>
-	/// When objects that implement this interface are stored 
-	/// in the context properties maps <see cref="log4net.GlobalContext"/>
-	/// <see cref="log4net.GlobalContext.Properties"/> and <see cref="log4net.ThreadContext"/>
-	/// <see cref="log4net.ThreadContext.Properties"/> are fixed 
-	/// (see <see cref="LoggingEvent.Fix"/>) the <see cref="GetFixedObject"/>
-	/// method will be called.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public interface IFixingRequired
-	{
-		/// <summary>
-		/// Get a portable version of this object
-		/// </summary>
-		/// <returns>the portable instance of this object</returns>
-		/// <remarks>
-		/// <para>
-		/// Get a portable instance object that represents the current
-		/// state of this object. The portable object can be stored
-		/// and logged from any thread with identical results.
-		/// </para>
-		/// </remarks>
-		object GetFixedObject();
-	}
+  /// <summary>
+  /// Interface for objects that require fixing.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface that indicates that the object requires fixing before it
+  /// can be taken outside the context of the appender's 
+  /// <see cref="log4net.Appender.IAppender.DoAppend"/> method.
+  /// </para>
+  /// <para>
+  /// When objects that implement this interface are stored 
+  /// in the context properties maps <see cref="log4net.GlobalContext"/>
+  /// <see cref="log4net.GlobalContext.Properties"/> and <see cref="log4net.ThreadContext"/>
+  /// <see cref="log4net.ThreadContext.Properties"/> are fixed 
+  /// (see <see cref="LoggingEvent.Fix"/>) the <see cref="GetFixedObject"/>
+  /// method will be called.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public interface IFixingRequired
+  {
+    /// <summary>
+    /// Get a portable version of this object
+    /// </summary>
+    /// <returns>the portable instance of this object</returns>
+    /// <remarks>
+    /// <para>
+    /// Get a portable instance object that represents the current
+    /// state of this object. The portable object can be stored
+    /// and logged from any thread with identical results.
+    /// </para>
+    /// </remarks>
+    object GetFixedObject();
+  }
 }
diff --git a/src/log4net/Core/ILogger.cs b/src/log4net/Core/ILogger.cs
index bbb152c..289a33f 100644
--- a/src/log4net/Core/ILogger.cs
+++ b/src/log4net/Core/ILogger.cs
@@ -24,92 +24,92 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Interface that all loggers implement
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This interface supports logging events and testing if a level
-	/// is enabled for logging.
-	/// </para>
-	/// <para>
-	/// These methods will not throw exceptions. Note to implementor, ensure
-	/// that the implementation of these methods cannot allow an exception
-	/// to be thrown to the caller.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface ILogger
-	{
-		/// <summary>
-		/// Gets the name of the logger.
-		/// </summary>
-		/// <value>
-		/// The name of the logger.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of this logger
-		/// </para>
-		/// </remarks>
-		string Name { get; }
+  /// <summary>
+  /// Interface that all loggers implement
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This interface supports logging events and testing if a level
+  /// is enabled for logging.
+  /// </para>
+  /// <para>
+  /// These methods will not throw exceptions. Note to implementor, ensure
+  /// that the implementation of these methods cannot allow an exception
+  /// to be thrown to the caller.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface ILogger
+  {
+    /// <summary>
+    /// Gets the name of the logger.
+    /// </summary>
+    /// <value>
+    /// The name of the logger.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of this logger
+    /// </para>
+    /// </remarks>
+    string Name { get; }
 
-		/// <summary>
-		/// This generic form is intended to be used by wrappers.
-		/// </summary>
-		/// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-		/// the stack boundary into the logging system for this call.</param>
-		/// <param name="level">The level of the message to be logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">the exception to log, including its stack trace. Pass <c>null</c> to not log an exception.</param>
-		/// <remarks>
-		/// <para>
-		/// Generates a logging event for the specified <paramref name="level"/> using
-		/// the <paramref name="message"/> and <paramref name="exception"/>.
-		/// </para>
-		/// </remarks>
-		void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception);
-  
-		/// <summary>
-		/// This is the most generic printing method that is intended to be used 
-		/// by wrappers.
-		/// </summary>
-		/// <param name="logEvent">The event being logged.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs the specified logging event through this logger.
-		/// </para>
-		/// </remarks>
-		void Log(LoggingEvent logEvent);
+    /// <summary>
+    /// This generic form is intended to be used by wrappers.
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <param name="level">The level of the message to be logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">the exception to log, including its stack trace. Pass <c>null</c> to not log an exception.</param>
+    /// <remarks>
+    /// <para>
+    /// Generates a logging event for the specified <paramref name="level"/> using
+    /// the <paramref name="message"/> and <paramref name="exception"/>.
+    /// </para>
+    /// </remarks>
+    void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception);
 
-		/// <summary>
-		/// Checks if this logger is enabled for a given <see cref="Level"/> passed as parameter.
-		/// </summary>
-		/// <param name="level">The level to check.</param>
-		/// <returns>
-		/// <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Test if this logger is going to log events of the specified <paramref name="level"/>.
-		/// </para>
-		/// </remarks>
-		bool IsEnabledFor(Level level);
+    /// <summary>
+    /// This is the most generic printing method that is intended to be used 
+    /// by wrappers.
+    /// </summary>
+    /// <param name="logEvent">The event being logged.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs the specified logging event through this logger.
+    /// </para>
+    /// </remarks>
+    void Log(LoggingEvent logEvent);
 
-		/// <summary>
-		/// Gets the <see cref="ILoggerRepository"/> where this 
-		/// <c>Logger</c> instance is attached to.
-		/// </summary>
-		/// <value>
-		/// The <see cref="ILoggerRepository" /> that this logger belongs to.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> where this 
-		/// <c>Logger</c> instance is attached to.
-		/// </para>
-		/// </remarks>
-		ILoggerRepository Repository { get; }
-	}
+    /// <summary>
+    /// Checks if this logger is enabled for a given <see cref="Level"/> passed as parameter.
+    /// </summary>
+    /// <param name="level">The level to check.</param>
+    /// <returns>
+    /// <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Test if this logger is going to log events of the specified <paramref name="level"/>.
+    /// </para>
+    /// </remarks>
+    bool IsEnabledFor(Level level);
+
+    /// <summary>
+    /// Gets the <see cref="ILoggerRepository"/> where this 
+    /// <c>Logger</c> instance is attached to.
+    /// </summary>
+    /// <value>
+    /// The <see cref="ILoggerRepository" /> that this logger belongs to.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> where this 
+    /// <c>Logger</c> instance is attached to.
+    /// </para>
+    /// </remarks>
+    ILoggerRepository Repository { get; }
+  }
 }
diff --git a/src/log4net/Core/ILoggerWrapper.cs b/src/log4net/Core/ILoggerWrapper.cs
index 735e368..fefbd20 100644
--- a/src/log4net/Core/ILoggerWrapper.cs
+++ b/src/log4net/Core/ILoggerWrapper.cs
@@ -25,35 +25,35 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Base interface for all wrappers
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Base interface for all wrappers.
-	/// </para>
-	/// <para>
-	/// All wrappers must implement this interface.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public interface ILoggerWrapper
-	{
-		/// <summary>
-		/// Get the implementation behind this wrapper object.
-		/// </summary>
-		/// <value>
-		/// The <see cref="ILogger"/> object that in implementing this object.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILogger"/> object that in implementing this
-		/// object. The <c>Logger</c> object may not 
-		/// be the same object as this object because of logger decorators.
-		/// This gets the actual underlying objects that is used to process
-		/// the log events.
-		/// </para>
-		/// </remarks>
-		ILogger Logger { get; }
-	}
+  /// <summary>
+  /// Base interface for all wrappers
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Base interface for all wrappers.
+  /// </para>
+  /// <para>
+  /// All wrappers must implement this interface.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public interface ILoggerWrapper
+  {
+    /// <summary>
+    /// Get the implementation behind this wrapper object.
+    /// </summary>
+    /// <value>
+    /// The <see cref="ILogger"/> object that in implementing this object.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILogger"/> object that in implementing this
+    /// object. The <c>Logger</c> object may not 
+    /// be the same object as this object because of logger decorators.
+    /// This gets the actual underlying objects that is used to process
+    /// the log events.
+    /// </para>
+    /// </remarks>
+    ILogger Logger { get; }
+  }
 }
diff --git a/src/log4net/Core/IOptionHandler.cs b/src/log4net/Core/IOptionHandler.cs
index cdc4682..6d73ee1 100644
--- a/src/log4net/Core/IOptionHandler.cs
+++ b/src/log4net/Core/IOptionHandler.cs
@@ -21,38 +21,38 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Interface used to delay activate a configured object.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This allows an object to defer activation of its options until all
-	/// options have been set. This is required for components which have
-	/// related options that remain ambiguous until all are set.
-	/// </para>
-	/// <para>
-	/// If a component implements this interface then the <see cref="ActivateOptions"/> method 
-	/// must be called by the container after its all the configured properties have been set 
-	/// and before the component can be used.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public interface IOptionHandler
-	{
-		/// <summary>
-		/// Activate the options that were previously set with calls to properties.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This allows an object to defer activation of its options until all
-		/// options have been set. This is required for components which have
-		/// related options that remain ambiguous until all are set.
-		/// </para>
-		/// <para>
-		/// If a component implements this interface then this method must be called
-		/// after its properties have been set before the component can be used.
-		/// </para>
-		/// </remarks>
-		void ActivateOptions();
-	}
+  /// <summary>
+  /// Interface used to delay activate a configured object.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This allows an object to defer activation of its options until all
+  /// options have been set. This is required for components which have
+  /// related options that remain ambiguous until all are set.
+  /// </para>
+  /// <para>
+  /// If a component implements this interface then the <see cref="ActivateOptions"/> method 
+  /// must be called by the container after its all the configured properties have been set 
+  /// and before the component can be used.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public interface IOptionHandler
+  {
+    /// <summary>
+    /// Activate the options that were previously set with calls to properties.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This allows an object to defer activation of its options until all
+    /// options have been set. This is required for components which have
+    /// related options that remain ambiguous until all are set.
+    /// </para>
+    /// <para>
+    /// If a component implements this interface then this method must be called
+    /// after its properties have been set before the component can be used.
+    /// </para>
+    /// </remarks>
+    void ActivateOptions();
+  }
 }
diff --git a/src/log4net/Core/IRepositorySelector.cs b/src/log4net/Core/IRepositorySelector.cs
index 55e393a..4e34839 100644
--- a/src/log4net/Core/IRepositorySelector.cs
+++ b/src/log4net/Core/IRepositorySelector.cs
@@ -24,190 +24,190 @@
 
 namespace log4net.Core
 {
-	#region LoggerRepositoryCreationEvent
+  #region LoggerRepositoryCreationEvent
 
-	/// <summary>
-	/// Delegate used to handle logger repository creation event notifications
-	/// </summary>
-	/// <param name="sender">The <see cref="IRepositorySelector"/> which created the repository.</param>
-	/// <param name="e">The <see cref="LoggerRepositoryCreationEventArgs"/> event args
-	/// that holds the <see cref="ILoggerRepository"/> instance that has been created.</param>
-	/// <remarks>
-	/// <para>
-	/// Delegate used to handle logger repository creation event notifications.
-	/// </para>
-	/// </remarks>
-	public delegate void LoggerRepositoryCreationEventHandler(object sender, LoggerRepositoryCreationEventArgs e);
+  /// <summary>
+  /// Delegate used to handle logger repository creation event notifications
+  /// </summary>
+  /// <param name="sender">The <see cref="IRepositorySelector"/> which created the repository.</param>
+  /// <param name="e">The <see cref="LoggerRepositoryCreationEventArgs"/> event args
+  /// that holds the <see cref="ILoggerRepository"/> instance that has been created.</param>
+  /// <remarks>
+  /// <para>
+  /// Delegate used to handle logger repository creation event notifications.
+  /// </para>
+  /// </remarks>
+  public delegate void LoggerRepositoryCreationEventHandler(object sender, LoggerRepositoryCreationEventArgs e);
 
-	/// <summary>
-	/// Provides data for the <see cref="IRepositorySelector.LoggerRepositoryCreatedEvent"/> event.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A <see cref="IRepositorySelector.LoggerRepositoryCreatedEvent"/> 
-	/// event is raised every time a <see cref="ILoggerRepository"/> is created.
-	/// </para>
-	/// </remarks>
-	public class LoggerRepositoryCreationEventArgs : EventArgs
-	{
-		/// <summary>
-		/// The <see cref="ILoggerRepository"/> created
-		/// </summary>
-		private ILoggerRepository m_repository;
+  /// <summary>
+  /// Provides data for the <see cref="IRepositorySelector.LoggerRepositoryCreatedEvent"/> event.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A <see cref="IRepositorySelector.LoggerRepositoryCreatedEvent"/> 
+  /// event is raised every time a <see cref="ILoggerRepository"/> is created.
+  /// </para>
+  /// </remarks>
+  public class LoggerRepositoryCreationEventArgs : EventArgs
+  {
+    /// <summary>
+    /// The <see cref="ILoggerRepository"/> created
+    /// </summary>
+    private ILoggerRepository m_repository;
 
-		/// <summary>
-		/// Construct instance using <see cref="ILoggerRepository"/> specified
-		/// </summary>
-		/// <param name="repository">the <see cref="ILoggerRepository"/> that has been created</param>
-		/// <remarks>
-		/// <para>
-		/// Construct instance using <see cref="ILoggerRepository"/> specified
-		/// </para>
-		/// </remarks>
-		public LoggerRepositoryCreationEventArgs(ILoggerRepository repository)
-		{
-			m_repository = repository;
-		}
+    /// <summary>
+    /// Construct instance using <see cref="ILoggerRepository"/> specified
+    /// </summary>
+    /// <param name="repository">the <see cref="ILoggerRepository"/> that has been created</param>
+    /// <remarks>
+    /// <para>
+    /// Construct instance using <see cref="ILoggerRepository"/> specified
+    /// </para>
+    /// </remarks>
+    public LoggerRepositoryCreationEventArgs(ILoggerRepository repository)
+    {
+      m_repository = repository;
+    }
 
-		/// <summary>
-		/// The <see cref="ILoggerRepository"/> that has been created
-		/// </summary>
-		/// <value>
-		/// The <see cref="ILoggerRepository"/> that has been created
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> that has been created
-		/// </para>
-		/// </remarks>
-		public ILoggerRepository LoggerRepository
-		{
-			get { return m_repository; }
-		}
-	}
+    /// <summary>
+    /// The <see cref="ILoggerRepository"/> that has been created
+    /// </summary>
+    /// <value>
+    /// The <see cref="ILoggerRepository"/> that has been created
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> that has been created
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository LoggerRepository
+    {
+      get { return m_repository; }
+    }
+  }
 
-	#endregion
+  #endregion
 
-	/// <summary>
-	/// Interface used by the <see cref="LogManager"/> to select the <see cref="ILoggerRepository"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <see cref="LogManager"/> uses a <see cref="IRepositorySelector"/> 
-	/// to specify the policy for selecting the correct <see cref="ILoggerRepository"/> 
-	/// to return to the caller.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IRepositorySelector
-	{
-		/// <summary>
-		/// Gets the <see cref="ILoggerRepository"/> for the specified assembly.
-		/// </summary>
-		/// <param name="assembly">The assembly to use to lookup to the <see cref="ILoggerRepository"/></param>
-		/// <returns>The <see cref="ILoggerRepository"/> for the assembly.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the specified assembly.
-		/// </para>
-		/// <para>
-		/// How the association between <see cref="Assembly"/> and <see cref="ILoggerRepository"/>
-		/// is made is not defined. The implementation may choose any method for
-		/// this association. The results of this method must be repeatable, i.e.
-		/// when called again with the same arguments the result must be the
-		/// save value.
-		/// </para>
-		/// </remarks>
-		ILoggerRepository GetRepository(Assembly assembly);
+  /// <summary>
+  /// Interface used by the <see cref="LogManager"/> to select the <see cref="ILoggerRepository"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <see cref="LogManager"/> uses a <see cref="IRepositorySelector"/> 
+  /// to specify the policy for selecting the correct <see cref="ILoggerRepository"/> 
+  /// to return to the caller.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IRepositorySelector
+  {
+    /// <summary>
+    /// Gets the <see cref="ILoggerRepository"/> for the specified assembly.
+    /// </summary>
+    /// <param name="assembly">The assembly to use to lookup to the <see cref="ILoggerRepository"/></param>
+    /// <returns>The <see cref="ILoggerRepository"/> for the assembly.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the specified assembly.
+    /// </para>
+    /// <para>
+    /// How the association between <see cref="Assembly"/> and <see cref="ILoggerRepository"/>
+    /// is made is not defined. The implementation may choose any method for
+    /// this association. The results of this method must be repeatable, i.e.
+    /// when called again with the same arguments the result must be the
+    /// save value.
+    /// </para>
+    /// </remarks>
+    ILoggerRepository GetRepository(Assembly assembly);
 
-		/// <summary>
-		/// Gets the named <see cref="ILoggerRepository"/>.
-		/// </summary>
-		/// <param name="repositoryName">The name to use to lookup to the <see cref="ILoggerRepository"/>.</param>
-		/// <returns>The named <see cref="ILoggerRepository"/></returns>
-		/// <remarks>
-		/// Lookup a named <see cref="ILoggerRepository"/>. This is the repository created by
-		/// calling <see cref="M:CreateRepository(string,Type)"/>.
-		/// </remarks>
-		ILoggerRepository GetRepository(string repositoryName);
+    /// <summary>
+    /// Gets the named <see cref="ILoggerRepository"/>.
+    /// </summary>
+    /// <param name="repositoryName">The name to use to lookup to the <see cref="ILoggerRepository"/>.</param>
+    /// <returns>The named <see cref="ILoggerRepository"/></returns>
+    /// <remarks>
+    /// Lookup a named <see cref="ILoggerRepository"/>. This is the repository created by
+    /// calling <see cref="M:CreateRepository(string,Type)"/>.
+    /// </remarks>
+    ILoggerRepository GetRepository(string repositoryName);
 
-		/// <summary>
-		/// Creates a new repository for the assembly specified.
-		/// </summary>
-		/// <param name="assembly">The assembly to use to create the domain to associate with the <see cref="ILoggerRepository"/>.</param>
-		/// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
-		/// <returns>The repository created.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the domain
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// <para>
-		/// How the association between <see cref="Assembly"/> and <see cref="ILoggerRepository"/>
-		/// is made is not defined. The implementation may choose any method for
-		/// this association.
-		/// </para>
-		/// </remarks>
-		ILoggerRepository CreateRepository(Assembly assembly, Type repositoryType);
+    /// <summary>
+    /// Creates a new repository for the assembly specified.
+    /// </summary>
+    /// <param name="assembly">The assembly to use to create the domain to associate with the <see cref="ILoggerRepository"/>.</param>
+    /// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
+    /// <returns>The repository created.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the domain
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// <para>
+    /// How the association between <see cref="Assembly"/> and <see cref="ILoggerRepository"/>
+    /// is made is not defined. The implementation may choose any method for
+    /// this association.
+    /// </para>
+    /// </remarks>
+    ILoggerRepository CreateRepository(Assembly assembly, Type repositoryType);
 
-		/// <summary>
-		/// Creates a new repository with the name specified.
-		/// </summary>
-		/// <param name="repositoryName">The name to associate with the <see cref="ILoggerRepository"/>.</param>
-		/// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
-		/// <returns>The repository created.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the name
-		/// specified such that a call to <see cref="M:GetRepository(string)"/> with the
-		/// same name will return the same repository instance.
-		/// </para>
-		/// </remarks>
-		ILoggerRepository CreateRepository(string repositoryName, Type repositoryType);
+    /// <summary>
+    /// Creates a new repository with the name specified.
+    /// </summary>
+    /// <param name="repositoryName">The name to associate with the <see cref="ILoggerRepository"/>.</param>
+    /// <param name="repositoryType">The type of repository to create, must implement <see cref="ILoggerRepository"/>.</param>
+    /// <returns>The repository created.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the name
+    /// specified such that a call to <see cref="M:GetRepository(string)"/> with the
+    /// same name will return the same repository instance.
+    /// </para>
+    /// </remarks>
+    ILoggerRepository CreateRepository(string repositoryName, Type repositoryType);
 
-		/// <summary>
-		/// Test if a named repository exists
-		/// </summary>
-		/// <param name="repositoryName">the named repository to check</param>
-		/// <returns><c>true</c> if the repository exists</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if a named repository exists. Use <see cref="M:CreateRepository(Assembly, Type)"/>
-		/// to create a new repository and <see cref="M:GetRepository(Assembly)"/> to retrieve 
-		/// a repository.
-		/// </para>
-		/// </remarks>
-		bool ExistsRepository(string repositoryName);
+    /// <summary>
+    /// Test if a named repository exists
+    /// </summary>
+    /// <param name="repositoryName">the named repository to check</param>
+    /// <returns><c>true</c> if the repository exists</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if a named repository exists. Use <see cref="M:CreateRepository(Assembly, Type)"/>
+    /// to create a new repository and <see cref="M:GetRepository(Assembly)"/> to retrieve 
+    /// a repository.
+    /// </para>
+    /// </remarks>
+    bool ExistsRepository(string repositoryName);
 
-		/// <summary>
-		/// Gets an array of all currently defined repositories.
-		/// </summary>
-		/// <returns>
-		/// An array of the <see cref="ILoggerRepository"/> instances created by 
-		/// this <see cref="IRepositorySelector"/>.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets an array of all of the repositories created by this selector.
-		/// </para>
-		/// </remarks>
-		ILoggerRepository[] GetAllRepositories();
+    /// <summary>
+    /// Gets an array of all currently defined repositories.
+    /// </summary>
+    /// <returns>
+    /// An array of the <see cref="ILoggerRepository"/> instances created by 
+    /// this <see cref="IRepositorySelector"/>.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets an array of all of the repositories created by this selector.
+    /// </para>
+    /// </remarks>
+    ILoggerRepository[] GetAllRepositories();
 
-		/// <summary>
-		/// Event to notify that a logger repository has been created.
-		/// </summary>
-		/// <value>
-		/// Event to notify that a logger repository has been created.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when a new repository is created.
-		/// The event source will be this selector. The event args will
-		/// be a <see cref="LoggerRepositoryCreationEventArgs"/> which
-		/// holds the newly created <see cref="ILoggerRepository"/>.
-		/// </para>
-		/// </remarks>
-		event LoggerRepositoryCreationEventHandler LoggerRepositoryCreatedEvent;
-	}
+    /// <summary>
+    /// Event to notify that a logger repository has been created.
+    /// </summary>
+    /// <value>
+    /// Event to notify that a logger repository has been created.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when a new repository is created.
+    /// The event source will be this selector. The event args will
+    /// be a <see cref="LoggerRepositoryCreationEventArgs"/> which
+    /// holds the newly created <see cref="ILoggerRepository"/>.
+    /// </para>
+    /// </remarks>
+    event LoggerRepositoryCreationEventHandler LoggerRepositoryCreatedEvent;
+  }
 }
diff --git a/src/log4net/Core/ITriggeringEventEvaluator.cs b/src/log4net/Core/ITriggeringEventEvaluator.cs
index baa7536..2063c34 100644
--- a/src/log4net/Core/ITriggeringEventEvaluator.cs
+++ b/src/log4net/Core/ITriggeringEventEvaluator.cs
@@ -21,31 +21,31 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Test if an <see cref="LoggingEvent"/> triggers an action
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Implementations of this interface allow certain appenders to decide
-	/// when to perform an appender specific action.
-	/// </para>
-	/// <para>
-	/// The action or behavior triggered is defined by the implementation.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public interface ITriggeringEventEvaluator
-	{
-		/// <summary>
-		/// Test if this event triggers the action
-		/// </summary>
-		/// <param name="loggingEvent">The event to check</param>
-		/// <returns><c>true</c> if this event triggers the action, otherwise <c>false</c></returns>
-		/// <remarks>
-		/// <para>
-		/// Return <c>true</c> if this event triggers the action
-		/// </para>
-		/// </remarks>
-		bool IsTriggeringEvent(LoggingEvent loggingEvent);
-	}
+  /// <summary>
+  /// Test if an <see cref="LoggingEvent"/> triggers an action
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Implementations of this interface allow certain appenders to decide
+  /// when to perform an appender specific action.
+  /// </para>
+  /// <para>
+  /// The action or behavior triggered is defined by the implementation.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public interface ITriggeringEventEvaluator
+  {
+    /// <summary>
+    /// Test if this event triggers the action
+    /// </summary>
+    /// <param name="loggingEvent">The event to check</param>
+    /// <returns><c>true</c> if this event triggers the action, otherwise <c>false</c></returns>
+    /// <remarks>
+    /// <para>
+    /// Return <c>true</c> if this event triggers the action
+    /// </para>
+    /// </remarks>
+    bool IsTriggeringEvent(LoggingEvent loggingEvent);
+  }
 }
diff --git a/src/log4net/Core/Level.cs b/src/log4net/Core/Level.cs
index 767d03e..a200e2a 100644
--- a/src/log4net/Core/Level.cs
+++ b/src/log4net/Core/Level.cs
@@ -22,594 +22,594 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Defines the default set of levels recognized by the system.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Each <see cref="LoggingEvent"/> has an associated <see cref="Level"/>.
-	/// </para>
-	/// <para>
-	/// Levels have a numeric <see cref="Level.Value"/> that defines the relative 
-	/// ordering between levels. Two Levels with the same <see cref="Level.Value"/> 
-	/// are deemed to be equivalent.
-	/// </para>
-	/// <para>
-	/// The levels that are recognized by log4net are set for each <see cref="log4net.Repository.ILoggerRepository"/>
-	/// and each repository can have different levels defined. The levels are stored
-	/// in the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/> on the repository. Levels are
-	/// looked up by name from the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/>.
-	/// </para>
-	/// <para>
-	/// When logging at level INFO the actual level used is not <see cref="Level.Info"/> but
-	/// the value of <c>LoggerRepository.LevelMap["INFO"]</c>. The default value for this is
-	/// <see cref="Level.Info"/>, but this can be changed by reconfiguring the level map.
-	/// </para>
-	/// <para>
-	/// Each level has a <see cref="DisplayName"/> in addition to its <see cref="Name"/>. The 
-	/// <see cref="DisplayName"/> is the string that is written into the output log. By default
-	/// the display name is the same as the level name, but this can be used to alias levels
-	/// or to localize the log output.
-	/// </para>
-	/// <para>
-	/// Some of the predefined levels recognized by the system are:
-	/// </para>
-	/// <list type="bullet">
-	///		<item>
-	///			<description><see cref="Off"/>.</description>
-	///		</item>
-	///		<item>
-	///			<description><see cref="Fatal"/>.</description>
-	///		</item>
-	///		<item>
-	///			<description><see cref="Error"/>.</description>
-	///		</item>
-	///		<item>
-	///			<description><see cref="Warn"/>.</description>
-	///		</item>
-	///		<item>
-	///			<description><see cref="Info"/>.</description>
-	///		</item>
-	///		<item>
-	///			<description><see cref="Debug"/>.</description>
-	///		</item>
-	///		<item>
-	///			<description><see cref="All"/>.</description>
-	///		</item>
-	/// </list>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// Defines the default set of levels recognized by the system.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Each <see cref="LoggingEvent"/> has an associated <see cref="Level"/>.
+  /// </para>
+  /// <para>
+  /// Levels have a numeric <see cref="Level.Value"/> that defines the relative 
+  /// ordering between levels. Two Levels with the same <see cref="Level.Value"/> 
+  /// are deemed to be equivalent.
+  /// </para>
+  /// <para>
+  /// The levels that are recognized by log4net are set for each <see cref="log4net.Repository.ILoggerRepository"/>
+  /// and each repository can have different levels defined. The levels are stored
+  /// in the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/> on the repository. Levels are
+  /// looked up by name from the <see cref="log4net.Repository.ILoggerRepository.LevelMap"/>.
+  /// </para>
+  /// <para>
+  /// When logging at level INFO the actual level used is not <see cref="Level.Info"/> but
+  /// the value of <c>LoggerRepository.LevelMap["INFO"]</c>. The default value for this is
+  /// <see cref="Level.Info"/>, but this can be changed by reconfiguring the level map.
+  /// </para>
+  /// <para>
+  /// Each level has a <see cref="DisplayName"/> in addition to its <see cref="Name"/>. The 
+  /// <see cref="DisplayName"/> is the string that is written into the output log. By default
+  /// the display name is the same as the level name, but this can be used to alias levels
+  /// or to localize the log output.
+  /// </para>
+  /// <para>
+  /// Some of the predefined levels recognized by the system are:
+  /// </para>
+  /// <list type="bullet">
+  ///    <item>
+  ///      <description><see cref="Off"/>.</description>
+  ///    </item>
+  ///    <item>
+  ///      <description><see cref="Fatal"/>.</description>
+  ///    </item>
+  ///    <item>
+  ///      <description><see cref="Error"/>.</description>
+  ///    </item>
+  ///    <item>
+  ///      <description><see cref="Warn"/>.</description>
+  ///    </item>
+  ///    <item>
+  ///      <description><see cref="Info"/>.</description>
+  ///    </item>
+  ///    <item>
+  ///      <description><see cref="Debug"/>.</description>
+  ///    </item>
+  ///    <item>
+  ///      <description><see cref="All"/>.</description>
+  ///    </item>
+  /// </list>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
-	public sealed class Level : IComparable
-	{
-		#region Public Instance Constructors
+  public sealed class Level : IComparable
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="level">Integer value for this level, higher values represent more severe levels.</param>
-		/// <param name="levelName">The string name of this level.</param>
-		/// <param name="displayName">The display name for this level. This may be localized or otherwise different from the name</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Level" /> class with
-		/// the specified level name and value.
-		/// </para>
-		/// </remarks>
-		public Level(int level, string levelName, string displayName) 
-		{
-			if (levelName == null)
-			{
-				throw new ArgumentNullException("levelName");
-			}
-			if (displayName == null)
-			{
-				throw new ArgumentNullException("displayName");
-			}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="level">Integer value for this level, higher values represent more severe levels.</param>
+    /// <param name="levelName">The string name of this level.</param>
+    /// <param name="displayName">The display name for this level. This may be localized or otherwise different from the name</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Level" /> class with
+    /// the specified level name and value.
+    /// </para>
+    /// </remarks>
+    public Level(int level, string levelName, string displayName)
+    {
+      if (levelName == null)
+      {
+        throw new ArgumentNullException("levelName");
+      }
+      if (displayName == null)
+      {
+        throw new ArgumentNullException("displayName");
+      }
 
-			m_levelValue = level;
+      m_levelValue = level;
 #if NETSTANDARD1_3
-			m_levelName = levelName;
+      m_levelName = levelName;
 #else
-			m_levelName = string.Intern(levelName);
+      m_levelName = string.Intern(levelName);
 #endif
-			m_levelDisplayName = displayName;
-		}
+      m_levelDisplayName = displayName;
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="level">Integer value for this level, higher values represent more severe levels.</param>
-		/// <param name="levelName">The string name of this level.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Level" /> class with
-		/// the specified level name and value.
-		/// </para>
-		/// </remarks>
-		public Level(int level, string levelName) : this(level, levelName, levelName)
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="level">Integer value for this level, higher values represent more severe levels.</param>
+    /// <param name="levelName">The string name of this level.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Level" /> class with
+    /// the specified level name and value.
+    /// </para>
+    /// </remarks>
+    public Level(int level, string levelName) : this(level, levelName, levelName)
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the name of this level.
-		/// </summary>
-		/// <value>
-		/// The name of this level.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the name of this level.
-		/// </para>
-		/// </remarks>
-		public string Name
-		{
-			get { return m_levelName; }
-		}
+    /// <summary>
+    /// Gets the name of this level.
+    /// </summary>
+    /// <value>
+    /// The name of this level.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the name of this level.
+    /// </para>
+    /// </remarks>
+    public string Name
+    {
+      get { return m_levelName; }
+    }
 
-		/// <summary>
-		/// Gets the value of this level.
-		/// </summary>
-		/// <value>
-		/// The value of this level.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the value of this level.
-		/// </para>
-		/// </remarks>
-		public int Value
-		{
-			get { return m_levelValue; }
-		}
+    /// <summary>
+    /// Gets the value of this level.
+    /// </summary>
+    /// <value>
+    /// The value of this level.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the value of this level.
+    /// </para>
+    /// </remarks>
+    public int Value
+    {
+      get { return m_levelValue; }
+    }
 
-		/// <summary>
-		/// Gets the display name of this level.
-		/// </summary>
-		/// <value>
-		/// The display name of this level.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the display name of this level.
-		/// </para>
-		/// </remarks>
-		public string DisplayName
-		{
-			get { return m_levelDisplayName; }
-		}
+    /// <summary>
+    /// Gets the display name of this level.
+    /// </summary>
+    /// <value>
+    /// The display name of this level.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the display name of this level.
+    /// </para>
+    /// </remarks>
+    public string DisplayName
+    {
+      get { return m_levelDisplayName; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override implementation of Object
+    #region Override implementation of Object
 
-		/// <summary>
-		/// Returns the <see cref="string" /> representation of the current 
-		/// <see cref="Level" />.
-		/// </summary>
-		/// <returns>
-		/// A <see cref="string" /> representation of the current <see cref="Level" />.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the level <see cref="Name"/>.
-		/// </para>
-		/// </remarks>
-		public override string ToString() 
-		{
-			return m_levelName;
-		}
+    /// <summary>
+    /// Returns the <see cref="string" /> representation of the current 
+    /// <see cref="Level" />.
+    /// </summary>
+    /// <returns>
+    /// A <see cref="string" /> representation of the current <see cref="Level" />.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the level <see cref="Name"/>.
+    /// </para>
+    /// </remarks>
+    public override string ToString()
+    {
+      return m_levelName;
+    }
 
-		/// <summary>
-		/// Compares levels.
-		/// </summary>
-		/// <param name="o">The object to compare against.</param>
-		/// <returns><c>true</c> if the objects are equal.</returns>
-		/// <remarks>
-		/// <para>
-		/// Compares the levels of <see cref="Level" /> instances, and 
-		/// defers to base class if the target object is not a <see cref="Level" />
-		/// instance.
-		/// </para>
-		/// </remarks>
-		public override bool Equals(object o)
-		{
-			Level otherLevel = o as Level;
-			if (otherLevel != null)
-			{
-				return m_levelValue == otherLevel.m_levelValue;
-			}
-			else
-			{
-				return base.Equals(o);
-			}
-		}
+    /// <summary>
+    /// Compares levels.
+    /// </summary>
+    /// <param name="o">The object to compare against.</param>
+    /// <returns><c>true</c> if the objects are equal.</returns>
+    /// <remarks>
+    /// <para>
+    /// Compares the levels of <see cref="Level" /> instances, and 
+    /// defers to base class if the target object is not a <see cref="Level" />
+    /// instance.
+    /// </para>
+    /// </remarks>
+    public override bool Equals(object o)
+    {
+      Level otherLevel = o as Level;
+      if (otherLevel != null)
+      {
+        return m_levelValue == otherLevel.m_levelValue;
+      }
+      else
+      {
+        return base.Equals(o);
+      }
+    }
 
-		/// <summary>
-		/// Returns a hash code
-		/// </summary>
-		/// <returns>A hash code for the current <see cref="Level" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns a hash code suitable for use in hashing algorithms and data 
-		/// structures like a hash table.
-		/// </para>
-		/// <para>
-		/// Returns the hash code of the level <see cref="Value"/>.
-		/// </para>
-		/// </remarks>
-		public override int GetHashCode()
-		{
-			return m_levelValue;
-		}
+    /// <summary>
+    /// Returns a hash code
+    /// </summary>
+    /// <returns>A hash code for the current <see cref="Level" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns a hash code suitable for use in hashing algorithms and data 
+    /// structures like a hash table.
+    /// </para>
+    /// <para>
+    /// Returns the hash code of the level <see cref="Value"/>.
+    /// </para>
+    /// </remarks>
+    public override int GetHashCode()
+    {
+      return m_levelValue;
+    }
 
-		#endregion Override implementation of Object
+    #endregion Override implementation of Object
 
-		#region Implementation of IComparable
+    #region Implementation of IComparable
 
-		/// <summary>
-		/// Compares this instance to a specified object and returns an 
-		/// indication of their relative values.
-		/// </summary>
-		/// <param name="r">A <see cref="Level"/> instance or <see langword="null" /> to compare with this instance.</param>
-		/// <returns>
-		/// A 32-bit signed integer that indicates the relative order of the 
-		/// values compared. The return value has these meanings:
-		/// <list type="table">
-		///		<listheader>
-		///			<term>Value</term>
-		///			<description>Meaning</description>
-		///		</listheader>
-		///		<item>
-		///			<term>Less than zero</term>
-		///			<description>This instance is less than <paramref name="r" />.</description>
-		///		</item>
-		///		<item>
-		///			<term>Zero</term>
-		///			<description>This instance is equal to <paramref name="r" />.</description>
-		///		</item>
-		///		<item>
-		///			<term>Greater than zero</term>
-		///			<description>
-		///				<para>This instance is greater than <paramref name="r" />.</para>
-		///				<para>-or-</para>
-		///				<para><paramref name="r" /> is <see langword="null" />.</para>
-		///				</description>
-		///		</item>
-		/// </list>
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// <paramref name="r" /> must be an instance of <see cref="Level" /> 
-		/// or <see langword="null" />; otherwise, an exception is thrown.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentException"><paramref name="r" /> is not a <see cref="Level" />.</exception>
-		public int CompareTo(object r)
-		{
-			Level target = r as Level;
-			if (target != null)
-			{
-				return Compare(this, target);
-			}
-			throw new ArgumentException("Parameter: r, Value: [" + r + "] is not an instance of Level");
-		}
+    /// <summary>
+    /// Compares this instance to a specified object and returns an 
+    /// indication of their relative values.
+    /// </summary>
+    /// <param name="r">A <see cref="Level"/> instance or <see langword="null" /> to compare with this instance.</param>
+    /// <returns>
+    /// A 32-bit signed integer that indicates the relative order of the 
+    /// values compared. The return value has these meanings:
+    /// <list type="table">
+    ///    <listheader>
+    ///      <term>Value</term>
+    ///      <description>Meaning</description>
+    ///    </listheader>
+    ///    <item>
+    ///      <term>Less than zero</term>
+    ///      <description>This instance is less than <paramref name="r" />.</description>
+    ///    </item>
+    ///    <item>
+    ///      <term>Zero</term>
+    ///      <description>This instance is equal to <paramref name="r" />.</description>
+    ///    </item>
+    ///    <item>
+    ///      <term>Greater than zero</term>
+    ///      <description>
+    ///        <para>This instance is greater than <paramref name="r" />.</para>
+    ///        <para>-or-</para>
+    ///        <para><paramref name="r" /> is <see langword="null" />.</para>
+    ///        </description>
+    ///    </item>
+    /// </list>
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// <paramref name="r" /> must be an instance of <see cref="Level" /> 
+    /// or <see langword="null" />; otherwise, an exception is thrown.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentException"><paramref name="r" /> is not a <see cref="Level" />.</exception>
+    public int CompareTo(object r)
+    {
+      Level target = r as Level;
+      if (target != null)
+      {
+        return Compare(this, target);
+      }
+      throw new ArgumentException("Parameter: r, Value: [" + r + "] is not an instance of Level");
+    }
 
-		#endregion Implementation of IComparable
+    #endregion Implementation of IComparable
 
-		#region Operators
+    #region Operators
 
-		/// <summary>
-		/// Returns a value indicating whether a specified <see cref="Level" /> 
-		/// is greater than another specified <see cref="Level" />.
-		/// </summary>
-		/// <param name="l">A <see cref="Level" /></param>
-		/// <param name="r">A <see cref="Level" /></param>
-		/// <returns>
-		/// <c>true</c> if <paramref name="l" /> is greater than 
-		/// <paramref name="r" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static bool operator > (Level l, Level r)
-		{
-			return l.m_levelValue > r.m_levelValue;
-		}
+    /// <summary>
+    /// Returns a value indicating whether a specified <see cref="Level" /> 
+    /// is greater than another specified <see cref="Level" />.
+    /// </summary>
+    /// <param name="l">A <see cref="Level" /></param>
+    /// <param name="r">A <see cref="Level" /></param>
+    /// <returns>
+    /// <c>true</c> if <paramref name="l" /> is greater than 
+    /// <paramref name="r" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static bool operator >(Level l, Level r)
+    {
+      return l.m_levelValue > r.m_levelValue;
+    }
 
-		/// <summary>
-		/// Returns a value indicating whether a specified <see cref="Level" /> 
-		/// is less than another specified <see cref="Level" />.
-		/// </summary>
-		/// <param name="l">A <see cref="Level" /></param>
-		/// <param name="r">A <see cref="Level" /></param>
-		/// <returns>
-		/// <c>true</c> if <paramref name="l" /> is less than 
-		/// <paramref name="r" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static bool operator < (Level l, Level r)
-		{
-			return l.m_levelValue < r.m_levelValue;
-		}
+    /// <summary>
+    /// Returns a value indicating whether a specified <see cref="Level" /> 
+    /// is less than another specified <see cref="Level" />.
+    /// </summary>
+    /// <param name="l">A <see cref="Level" /></param>
+    /// <param name="r">A <see cref="Level" /></param>
+    /// <returns>
+    /// <c>true</c> if <paramref name="l" /> is less than 
+    /// <paramref name="r" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static bool operator <(Level l, Level r)
+    {
+      return l.m_levelValue < r.m_levelValue;
+    }
 
-		/// <summary>
-		/// Returns a value indicating whether a specified <see cref="Level" /> 
-		/// is greater than or equal to another specified <see cref="Level" />.
-		/// </summary>
-		/// <param name="l">A <see cref="Level" /></param>
-		/// <param name="r">A <see cref="Level" /></param>
-		/// <returns>
-		/// <c>true</c> if <paramref name="l" /> is greater than or equal to 
-		/// <paramref name="r" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static bool operator >= (Level l, Level r)
-		{
-			return l.m_levelValue >= r.m_levelValue;
-		}
+    /// <summary>
+    /// Returns a value indicating whether a specified <see cref="Level" /> 
+    /// is greater than or equal to another specified <see cref="Level" />.
+    /// </summary>
+    /// <param name="l">A <see cref="Level" /></param>
+    /// <param name="r">A <see cref="Level" /></param>
+    /// <returns>
+    /// <c>true</c> if <paramref name="l" /> is greater than or equal to 
+    /// <paramref name="r" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static bool operator >=(Level l, Level r)
+    {
+      return l.m_levelValue >= r.m_levelValue;
+    }
 
-		/// <summary>
-		/// Returns a value indicating whether a specified <see cref="Level" /> 
-		/// is less than or equal to another specified <see cref="Level" />.
-		/// </summary>
-		/// <param name="l">A <see cref="Level" /></param>
-		/// <param name="r">A <see cref="Level" /></param>
-		/// <returns>
-		/// <c>true</c> if <paramref name="l" /> is less than or equal to 
-		/// <paramref name="r" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static bool operator <= (Level l, Level r)
-		{
-			return l.m_levelValue <= r.m_levelValue;
-		}
+    /// <summary>
+    /// Returns a value indicating whether a specified <see cref="Level" /> 
+    /// is less than or equal to another specified <see cref="Level" />.
+    /// </summary>
+    /// <param name="l">A <see cref="Level" /></param>
+    /// <param name="r">A <see cref="Level" /></param>
+    /// <returns>
+    /// <c>true</c> if <paramref name="l" /> is less than or equal to 
+    /// <paramref name="r" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static bool operator <=(Level l, Level r)
+    {
+      return l.m_levelValue <= r.m_levelValue;
+    }
 
-		/// <summary>
-		/// Returns a value indicating whether two specified <see cref="Level" /> 
-		/// objects have the same value.
-		/// </summary>
-		/// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param>
-		/// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param>
-		/// <returns>
-		/// <c>true</c> if the value of <paramref name="l" /> is the same as the 
-		/// value of <paramref name="r" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static bool operator == (Level l, Level r)
-		{
-			if (((object)l) != null && ((object)r) != null)
-			{
-				return l.m_levelValue == r.m_levelValue;
-			}
-			else
-			{
-				return ((object) l) == ((object) r);
-			}
-		}
+    /// <summary>
+    /// Returns a value indicating whether two specified <see cref="Level" /> 
+    /// objects have the same value.
+    /// </summary>
+    /// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param>
+    /// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param>
+    /// <returns>
+    /// <c>true</c> if the value of <paramref name="l" /> is the same as the 
+    /// value of <paramref name="r" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static bool operator ==(Level l, Level r)
+    {
+      if (((object)l) != null && ((object)r) != null)
+      {
+        return l.m_levelValue == r.m_levelValue;
+      }
+      else
+      {
+        return ((object)l) == ((object)r);
+      }
+    }
 
-		/// <summary>
-		/// Returns a value indicating whether two specified <see cref="Level" /> 
-		/// objects have different values.
-		/// </summary>
-		/// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param>
-		/// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param>
-		/// <returns>
-		/// <c>true</c> if the value of <paramref name="l" /> is different from
-		/// the value of <paramref name="r" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static bool operator != (Level l, Level r)
-		{
-			return !(l==r);
-		}
+    /// <summary>
+    /// Returns a value indicating whether two specified <see cref="Level" /> 
+    /// objects have different values.
+    /// </summary>
+    /// <param name="l">A <see cref="Level" /> or <see langword="null" />.</param>
+    /// <param name="r">A <see cref="Level" /> or <see langword="null" />.</param>
+    /// <returns>
+    /// <c>true</c> if the value of <paramref name="l" /> is different from
+    /// the value of <paramref name="r" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static bool operator !=(Level l, Level r)
+    {
+      return !(l == r);
+    }
 
-		#endregion Operators
+    #endregion Operators
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Compares two specified <see cref="Level"/> instances.
-		/// </summary>
-		/// <param name="l">The first <see cref="Level"/> to compare.</param>
-		/// <param name="r">The second <see cref="Level"/> to compare.</param>
-		/// <returns>
-		/// A 32-bit signed integer that indicates the relative order of the 
-		/// two values compared. The return value has these meanings:
-		/// <list type="table">
-		///		<listheader>
-		///			<term>Value</term>
-		///			<description>Meaning</description>
-		///		</listheader>
-		///		<item>
-		///			<term>Less than zero</term>
-		///			<description><paramref name="l" /> is less than <paramref name="r" />.</description>
-		///		</item>
-		///		<item>
-		///			<term>Zero</term>
-		///			<description><paramref name="l" /> is equal to <paramref name="r" />.</description>
-		///		</item>
-		///		<item>
-		///			<term>Greater than zero</term>
-		///			<description><paramref name="l" /> is greater than <paramref name="r" />.</description>
-		///		</item>
-		/// </list>
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares two levels.
-		/// </para>
-		/// </remarks>
-		public static int Compare(Level l, Level r)
-		{
-			// Reference equals
-			if ((object)l == (object)r)
-			{
-				return 0;
-			}
+    /// <summary>
+    /// Compares two specified <see cref="Level"/> instances.
+    /// </summary>
+    /// <param name="l">The first <see cref="Level"/> to compare.</param>
+    /// <param name="r">The second <see cref="Level"/> to compare.</param>
+    /// <returns>
+    /// A 32-bit signed integer that indicates the relative order of the 
+    /// two values compared. The return value has these meanings:
+    /// <list type="table">
+    ///    <listheader>
+    ///      <term>Value</term>
+    ///      <description>Meaning</description>
+    ///    </listheader>
+    ///    <item>
+    ///      <term>Less than zero</term>
+    ///      <description><paramref name="l" /> is less than <paramref name="r" />.</description>
+    ///    </item>
+    ///    <item>
+    ///      <term>Zero</term>
+    ///      <description><paramref name="l" /> is equal to <paramref name="r" />.</description>
+    ///    </item>
+    ///    <item>
+    ///      <term>Greater than zero</term>
+    ///      <description><paramref name="l" /> is greater than <paramref name="r" />.</description>
+    ///    </item>
+    /// </list>
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares two levels.
+    /// </para>
+    /// </remarks>
+    public static int Compare(Level l, Level r)
+    {
+      // Reference equals
+      if ((object)l == (object)r)
+      {
+        return 0;
+      }
 
-			if (l == null && r == null)
-			{
-				return 0;
-			}
-			if (l == null)
-			{
-				return -1;
-			}
-			if (r == null)
-			{
-				return 1;
-			}
+      if (l == null && r == null)
+      {
+        return 0;
+      }
+      if (l == null)
+      {
+        return -1;
+      }
+      if (r == null)
+      {
+        return 1;
+      }
 
-			return l.m_levelValue.CompareTo(r.m_levelValue);
-		}
+      return l.m_levelValue.CompareTo(r.m_levelValue);
+    }
 
-		#endregion Public Static Methods
+    #endregion Public Static Methods
 
-		#region Public Static Fields
+    #region Public Static Fields
 
-		/// <summary>
-		/// The <see cref="Off" /> level designates a higher level than all the rest.
-		/// </summary>
-		public static readonly Level Off = new Level(int.MaxValue, "OFF");
+    /// <summary>
+    /// The <see cref="Off" /> level designates a higher level than all the rest.
+    /// </summary>
+    public static readonly Level Off = new Level(int.MaxValue, "OFF");
 
-        /// <summary>
-        /// The <see cref="Emergency" /> level designates very severe error events. 
-        /// System unusable, emergencies.
-        /// </summary>
-        public static readonly Level Log4Net_Debug = new Level(120000, "log4net:DEBUG");
+    /// <summary>
+    /// The <see cref="Emergency" /> level designates very severe error events. 
+    /// System unusable, emergencies.
+    /// </summary>
+    public static readonly Level Log4Net_Debug = new Level(120000, "log4net:DEBUG");
 
-		/// <summary>
-		/// The <see cref="Emergency" /> level designates very severe error events. 
-		/// System unusable, emergencies.
-		/// </summary>
-		public static readonly Level Emergency = new Level(120000, "EMERGENCY");
+    /// <summary>
+    /// The <see cref="Emergency" /> level designates very severe error events. 
+    /// System unusable, emergencies.
+    /// </summary>
+    public static readonly Level Emergency = new Level(120000, "EMERGENCY");
 
-		/// <summary>
-		/// The <see cref="Fatal" /> level designates very severe error events 
-		/// that will presumably lead the application to abort.
-		/// </summary>
-		public static readonly Level Fatal = new Level(110000, "FATAL");
+    /// <summary>
+    /// The <see cref="Fatal" /> level designates very severe error events 
+    /// that will presumably lead the application to abort.
+    /// </summary>
+    public static readonly Level Fatal = new Level(110000, "FATAL");
 
-		/// <summary>
-		/// The <see cref="Alert" /> level designates very severe error events. 
-		/// Take immediate action, alerts.
-		/// </summary>
-		public static readonly Level Alert = new Level(100000, "ALERT");
+    /// <summary>
+    /// The <see cref="Alert" /> level designates very severe error events. 
+    /// Take immediate action, alerts.
+    /// </summary>
+    public static readonly Level Alert = new Level(100000, "ALERT");
 
-		/// <summary>
-		/// The <see cref="Critical" /> level designates very severe error events. 
-		/// Critical condition, critical.
-		/// </summary>
-		public static readonly Level Critical = new Level(90000, "CRITICAL");
+    /// <summary>
+    /// The <see cref="Critical" /> level designates very severe error events. 
+    /// Critical condition, critical.
+    /// </summary>
+    public static readonly Level Critical = new Level(90000, "CRITICAL");
 
-		/// <summary>
-		/// The <see cref="Severe" /> level designates very severe error events.
-		/// </summary>
-		public static readonly Level Severe = new Level(80000, "SEVERE");
+    /// <summary>
+    /// The <see cref="Severe" /> level designates very severe error events.
+    /// </summary>
+    public static readonly Level Severe = new Level(80000, "SEVERE");
 
-		/// <summary>
-		/// The <see cref="Error" /> level designates error events that might 
-		/// still allow the application to continue running.
-		/// </summary>
-		public static readonly Level Error = new Level(70000, "ERROR");
+    /// <summary>
+    /// The <see cref="Error" /> level designates error events that might 
+    /// still allow the application to continue running.
+    /// </summary>
+    public static readonly Level Error = new Level(70000, "ERROR");
 
-		/// <summary>
-		/// The <see cref="Warn" /> level designates potentially harmful 
-		/// situations.
-		/// </summary>
-		public static readonly Level Warn  = new Level(60000, "WARN");
+    /// <summary>
+    /// The <see cref="Warn" /> level designates potentially harmful 
+    /// situations.
+    /// </summary>
+    public static readonly Level Warn = new Level(60000, "WARN");
 
-		/// <summary>
-		/// The <see cref="Notice" /> level designates informational messages 
-		/// that highlight the progress of the application at the highest level.
-		/// </summary>
-		public static readonly Level Notice  = new Level(50000, "NOTICE");
+    /// <summary>
+    /// The <see cref="Notice" /> level designates informational messages 
+    /// that highlight the progress of the application at the highest level.
+    /// </summary>
+    public static readonly Level Notice = new Level(50000, "NOTICE");
 
-		/// <summary>
-		/// The <see cref="Info" /> level designates informational messages that 
-		/// highlight the progress of the application at coarse-grained level.
-		/// </summary>
-		public static readonly Level Info  = new Level(40000, "INFO");
+    /// <summary>
+    /// The <see cref="Info" /> level designates informational messages that 
+    /// highlight the progress of the application at coarse-grained level.
+    /// </summary>
+    public static readonly Level Info = new Level(40000, "INFO");
 
-		/// <summary>
-		/// The <see cref="Debug" /> level designates fine-grained informational 
-		/// events that are most useful to debug an application.
-		/// </summary>
-		public static readonly Level Debug = new Level(30000, "DEBUG");
+    /// <summary>
+    /// The <see cref="Debug" /> level designates fine-grained informational 
+    /// events that are most useful to debug an application.
+    /// </summary>
+    public static readonly Level Debug = new Level(30000, "DEBUG");
 
-		/// <summary>
-		/// The <see cref="Fine" /> level designates fine-grained informational 
-		/// events that are most useful to debug an application.
-		/// </summary>
-		public static readonly Level Fine = new Level(30000, "FINE");
+    /// <summary>
+    /// The <see cref="Fine" /> level designates fine-grained informational 
+    /// events that are most useful to debug an application.
+    /// </summary>
+    public static readonly Level Fine = new Level(30000, "FINE");
 
-		/// <summary>
-		/// The <see cref="Trace" /> level designates fine-grained informational 
-		/// events that are most useful to debug an application.
-		/// </summary>
-		public static readonly Level Trace = new Level(20000, "TRACE");
+    /// <summary>
+    /// The <see cref="Trace" /> level designates fine-grained informational 
+    /// events that are most useful to debug an application.
+    /// </summary>
+    public static readonly Level Trace = new Level(20000, "TRACE");
 
-		/// <summary>
-		/// The <see cref="Finer" /> level designates fine-grained informational 
-		/// events that are most useful to debug an application.
-		/// </summary>
-		public static readonly Level Finer = new Level(20000, "FINER");
+    /// <summary>
+    /// The <see cref="Finer" /> level designates fine-grained informational 
+    /// events that are most useful to debug an application.
+    /// </summary>
+    public static readonly Level Finer = new Level(20000, "FINER");
 
-		/// <summary>
-		/// The <see cref="Verbose" /> level designates fine-grained informational 
-		/// events that are most useful to debug an application.
-		/// </summary>
-		public static readonly Level Verbose = new Level(10000, "VERBOSE");
+    /// <summary>
+    /// The <see cref="Verbose" /> level designates fine-grained informational 
+    /// events that are most useful to debug an application.
+    /// </summary>
+    public static readonly Level Verbose = new Level(10000, "VERBOSE");
 
-		/// <summary>
-		/// The <see cref="Finest" /> level designates fine-grained informational 
-		/// events that are most useful to debug an application.
-		/// </summary>
-		public static readonly Level Finest = new Level(10000, "FINEST");
+    /// <summary>
+    /// The <see cref="Finest" /> level designates fine-grained informational 
+    /// events that are most useful to debug an application.
+    /// </summary>
+    public static readonly Level Finest = new Level(10000, "FINEST");
 
-		/// <summary>
-		/// The <see cref="All" /> level designates the lowest level possible.
-		/// </summary>
-		public static readonly Level All = new Level(int.MinValue, "ALL");
+    /// <summary>
+    /// The <see cref="All" /> level designates the lowest level possible.
+    /// </summary>
+    public static readonly Level All = new Level(int.MinValue, "ALL");
 
-		#endregion Public Static Fields
+    #endregion Public Static Fields
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private readonly int m_levelValue;
-		private readonly string m_levelName;
-		private readonly string m_levelDisplayName;
+    private readonly int m_levelValue;
+    private readonly string m_levelName;
+    private readonly string m_levelDisplayName;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Core/LevelCollection.cs b/src/log4net/Core/LevelCollection.cs
index d51bd0d..4f35882 100644
--- a/src/log4net/Core/LevelCollection.cs
+++ b/src/log4net/Core/LevelCollection.cs
@@ -22,839 +22,839 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// A strongly-typed collection of <see cref="Level"/> objects.
-	/// </summary>
-	/// <author>Nicko Cadell</author>
-	public class LevelCollection : ICollection, IList, IEnumerable
+  /// <summary>
+  /// A strongly-typed collection of <see cref="Level"/> objects.
+  /// </summary>
+  /// <author>Nicko Cadell</author>
+  public class LevelCollection : ICollection, IList, IEnumerable
 #if !NETSTANDARD1_3
-		, ICloneable
+    , ICloneable
 #endif
-	{
-		#region Interfaces
+  {
+    #region Interfaces
 
-		/// <summary>
-		/// Supports type-safe iteration over a <see cref="LevelCollection"/>.
-		/// </summary>
-		public interface ILevelCollectionEnumerator
-		{
-			/// <summary>
-			/// Gets the current element in the collection.
-			/// </summary>
-			Level Current { get; }
+    /// <summary>
+    /// Supports type-safe iteration over a <see cref="LevelCollection"/>.
+    /// </summary>
+    public interface ILevelCollectionEnumerator
+    {
+      /// <summary>
+      /// Gets the current element in the collection.
+      /// </summary>
+      Level Current { get; }
 
-			/// <summary>
-			/// Advances the enumerator to the next element in the collection.
-			/// </summary>
-			/// <returns>
-			/// <c>true</c> if the enumerator was successfully advanced to the next element; 
-			/// <c>false</c> if the enumerator has passed the end of the collection.
-			/// </returns>
-			/// <exception cref="InvalidOperationException">
-			/// The collection was modified after the enumerator was created.
-			/// </exception>
-			bool MoveNext();
+      /// <summary>
+      /// Advances the enumerator to the next element in the collection.
+      /// </summary>
+      /// <returns>
+      /// <c>true</c> if the enumerator was successfully advanced to the next element; 
+      /// <c>false</c> if the enumerator has passed the end of the collection.
+      /// </returns>
+      /// <exception cref="InvalidOperationException">
+      /// The collection was modified after the enumerator was created.
+      /// </exception>
+      bool MoveNext();
 
-			/// <summary>
-			/// Sets the enumerator to its initial position, before the first element in the collection.
-			/// </summary>
-			void Reset();
-		}
+      /// <summary>
+      /// Sets the enumerator to its initial position, before the first element in the collection.
+      /// </summary>
+      void Reset();
+    }
 
-		#endregion
+    #endregion
 
-		private const int DEFAULT_CAPACITY = 16;
+    private const int DEFAULT_CAPACITY = 16;
 
-		#region Implementation (data)
+    #region Implementation (data)
 
-		private Level[] m_array;
-		private int m_count = 0;
-		private int m_version = 0;
+    private Level[] m_array;
+    private int m_count = 0;
+    private int m_version = 0;
 
-		#endregion
-	
-		#region Static Wrappers
+    #endregion
 
-		/// <summary>
-		/// Creates a read-only wrapper for a <c>LevelCollection</c> instance.
-		/// </summary>
-		/// <param name="list">list to create a readonly wrapper arround</param>
-		/// <returns>
-		/// A <c>LevelCollection</c> wrapper that is read-only.
-		/// </returns>
-		public static LevelCollection ReadOnly(LevelCollection list)
-		{
-			if(list==null) throw new ArgumentNullException("list");
+    #region Static Wrappers
 
-			return new ReadOnlyLevelCollection(list);
-		}
+    /// <summary>
+    /// Creates a read-only wrapper for a <c>LevelCollection</c> instance.
+    /// </summary>
+    /// <param name="list">list to create a readonly wrapper arround</param>
+    /// <returns>
+    /// A <c>LevelCollection</c> wrapper that is read-only.
+    /// </returns>
+    public static LevelCollection ReadOnly(LevelCollection list)
+    {
+      if (list == null) throw new ArgumentNullException("list");
 
-		#endregion
+      return new ReadOnlyLevelCollection(list);
+    }
 
-		#region Constructors
+    #endregion
 
-		/// <summary>
-		/// Initializes a new instance of the <c>LevelCollection</c> class
-		/// that is empty and has the default initial capacity.
-		/// </summary>
-		public LevelCollection()
-		{
-			m_array = new Level[DEFAULT_CAPACITY];
-		}
-		
-		/// <summary>
-		/// Initializes a new instance of the <c>LevelCollection</c> class
-		/// that has the specified initial capacity.
-		/// </summary>
-		/// <param name="capacity">
-		/// The number of elements that the new <c>LevelCollection</c> is initially capable of storing.
-		/// </param>
-		public LevelCollection(int capacity)
-		{
-			m_array = new Level[capacity];
-		}
+    #region Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <c>LevelCollection</c> class
-		/// that contains elements copied from the specified <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="c">The <c>LevelCollection</c> whose elements are copied to the new collection.</param>
-		public LevelCollection(LevelCollection c)
-		{
-			m_array = new Level[c.Count];
-			AddRange(c);
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>LevelCollection</c> class
+    /// that is empty and has the default initial capacity.
+    /// </summary>
+    public LevelCollection()
+    {
+      m_array = new Level[DEFAULT_CAPACITY];
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <c>LevelCollection</c> class
-		/// that contains elements copied from the specified <see cref="Level"/> array.
-		/// </summary>
-		/// <param name="a">The <see cref="Level"/> array whose elements are copied to the new list.</param>
-		public LevelCollection(Level[] a)
-		{
-			m_array = new Level[a.Length];
-			AddRange(a);
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>LevelCollection</c> class
+    /// that has the specified initial capacity.
+    /// </summary>
+    /// <param name="capacity">
+    /// The number of elements that the new <c>LevelCollection</c> is initially capable of storing.
+    /// </param>
+    public LevelCollection(int capacity)
+    {
+      m_array = new Level[capacity];
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <c>LevelCollection</c> class
-		/// that contains elements copied from the specified <see cref="Level"/> collection.
-		/// </summary>
-		/// <param name="col">The <see cref="Level"/> collection whose elements are copied to the new list.</param>
-		public LevelCollection(ICollection col)
-		{
-			m_array = new Level[col.Count];
-			AddRange(col);
-		}
-		
-		/// <summary>
-		/// Type visible only to our subclasses
-		/// Used to access protected constructor
-		/// </summary>
-		protected internal enum Tag 
-		{
-			/// <summary>
-			/// A value
-			/// </summary>
-			Default
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>LevelCollection</c> class
+    /// that contains elements copied from the specified <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="c">The <c>LevelCollection</c> whose elements are copied to the new collection.</param>
+    public LevelCollection(LevelCollection c)
+    {
+      m_array = new Level[c.Count];
+      AddRange(c);
+    }
 
-		/// <summary>
-		/// Allow subclasses to avoid our default constructors
-		/// </summary>
-		/// <param name="tag"></param>
-		protected internal LevelCollection(Tag tag)
-		{
-			m_array = null;
-		}
-		#endregion
-		
-		#region Operations (type-safe ICollection)
+    /// <summary>
+    /// Initializes a new instance of the <c>LevelCollection</c> class
+    /// that contains elements copied from the specified <see cref="Level"/> array.
+    /// </summary>
+    /// <param name="a">The <see cref="Level"/> array whose elements are copied to the new list.</param>
+    public LevelCollection(Level[] a)
+    {
+      m_array = new Level[a.Length];
+      AddRange(a);
+    }
 
-		/// <summary>
-		/// Gets the number of elements actually contained in the <c>LevelCollection</c>.
-		/// </summary>
-		public virtual int Count
-		{
-			get { return m_count; }
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>LevelCollection</c> class
+    /// that contains elements copied from the specified <see cref="Level"/> collection.
+    /// </summary>
+    /// <param name="col">The <see cref="Level"/> collection whose elements are copied to the new list.</param>
+    public LevelCollection(ICollection col)
+    {
+      m_array = new Level[col.Count];
+      AddRange(col);
+    }
 
-		/// <summary>
-		/// Copies the entire <c>LevelCollection</c> to a one-dimensional
-		/// <see cref="Level"/> array.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="Level"/> array to copy to.</param>
-		public virtual void CopyTo(Level[] array)
-		{
-			this.CopyTo(array, 0);
-		}
+    /// <summary>
+    /// Type visible only to our subclasses
+    /// Used to access protected constructor
+    /// </summary>
+    protected internal enum Tag
+    {
+      /// <summary>
+      /// A value
+      /// </summary>
+      Default
+    }
 
-		/// <summary>
-		/// Copies the entire <c>LevelCollection</c> to a one-dimensional
-		/// <see cref="Level"/> array, starting at the specified index of the target array.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="Level"/> array to copy to.</param>
-		/// <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
-		public virtual void CopyTo(Level[] array, int start)
-		{
-			if (m_count > array.GetUpperBound(0) + 1 - start)
-			{
-				throw new System.ArgumentException("Destination array was not long enough.");
-			}
-			
-			Array.Copy(m_array, 0, array, start, m_count); 
-		}
+    /// <summary>
+    /// Allow subclasses to avoid our default constructors
+    /// </summary>
+    /// <param name="tag"></param>
+    protected internal LevelCollection(Tag tag)
+    {
+      m_array = null;
+    }
+    #endregion
 
-		/// <summary>
-		/// Gets a value indicating whether access to the collection is synchronized (thread-safe).
-		/// </summary>
-		/// <returns>false, because the backing type is an array, which is never thread-safe.</returns>
-		public virtual bool IsSynchronized
-		{
-			get { return false; }
-		}
+    #region Operations (type-safe ICollection)
 
-		/// <summary>
-		/// Gets an object that can be used to synchronize access to the collection.
-		/// </summary>
-		public virtual object SyncRoot
-		{
-			get { return m_array; }
-		}
+    /// <summary>
+    /// Gets the number of elements actually contained in the <c>LevelCollection</c>.
+    /// </summary>
+    public virtual int Count
+    {
+      get { return m_count; }
+    }
 
-		#endregion
-		
-		#region Operations (type-safe IList)
+    /// <summary>
+    /// Copies the entire <c>LevelCollection</c> to a one-dimensional
+    /// <see cref="Level"/> array.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="Level"/> array to copy to.</param>
+    public virtual void CopyTo(Level[] array)
+    {
+      this.CopyTo(array, 0);
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="Level"/> at the specified index.
-		/// </summary>
-		/// <param name="index">The zero-based index of the element to get or set.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
-		/// </exception>
-		public virtual Level this[int index]
-		{
-			get
-			{
-				ValidateIndex(index); // throws
-				return m_array[index]; 
-			}
-			set
-			{
-				ValidateIndex(index); // throws
-				++m_version; 
-				m_array[index] = value; 
-			}
-		}
+    /// <summary>
+    /// Copies the entire <c>LevelCollection</c> to a one-dimensional
+    /// <see cref="Level"/> array, starting at the specified index of the target array.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="Level"/> array to copy to.</param>
+    /// <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+    public virtual void CopyTo(Level[] array, int start)
+    {
+      if (m_count > array.GetUpperBound(0) + 1 - start)
+      {
+        throw new System.ArgumentException("Destination array was not long enough.");
+      }
 
-		/// <summary>
-		/// Adds a <see cref="Level"/> to the end of the <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="Level"/> to be added to the end of the <c>LevelCollection</c>.</param>
-		/// <returns>The index at which the value has been added.</returns>
-		public virtual int Add(Level item)
-		{
-			if (m_count == m_array.Length)
-			{
-				EnsureCapacity(m_count + 1);
-			}
+      Array.Copy(m_array, 0, array, start, m_count);
+    }
 
-			m_array[m_count] = item;
-			m_version++;
+    /// <summary>
+    /// Gets a value indicating whether access to the collection is synchronized (thread-safe).
+    /// </summary>
+    /// <returns>false, because the backing type is an array, which is never thread-safe.</returns>
+    public virtual bool IsSynchronized
+    {
+      get { return false; }
+    }
 
-			return m_count++;
-		}
-		
-		/// <summary>
-		/// Removes all elements from the <c>LevelCollection</c>.
-		/// </summary>
-		public virtual void Clear()
-		{
-			++m_version;
-			m_array = new Level[DEFAULT_CAPACITY];
-			m_count = 0;
-		}
-		
-		/// <summary>
-		/// Creates a shallow copy of the <see cref="LevelCollection"/>.
-		/// </summary>
-		/// <returns>A new <see cref="LevelCollection"/> with a shallow copy of the collection data.</returns>
-		public virtual object Clone()
-		{
-			LevelCollection newCol = new LevelCollection(m_count);
-			Array.Copy(m_array, 0, newCol.m_array, 0, m_count);
-			newCol.m_count = m_count;
-			newCol.m_version = m_version;
+    /// <summary>
+    /// Gets an object that can be used to synchronize access to the collection.
+    /// </summary>
+    public virtual object SyncRoot
+    {
+      get { return m_array; }
+    }
 
-			return newCol;
-		}
+    #endregion
 
-		/// <summary>
-		/// Determines whether a given <see cref="Level"/> is in the <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="Level"/> to check for.</param>
-		/// <returns><c>true</c> if <paramref name="item"/> is found in the <c>LevelCollection</c>; otherwise, <c>false</c>.</returns>
-		public virtual bool Contains(Level item)
-		{
-			for (int i=0; i != m_count; ++i)
-			{
-				if (m_array[i].Equals(item))
-				{
-					return true;
-				}
-			}
-			return false;
-		}
+    #region Operations (type-safe IList)
 
-		/// <summary>
-		/// Returns the zero-based index of the first occurrence of a <see cref="Level"/>
-		/// in the <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="Level"/> to locate in the <c>LevelCollection</c>.</param>
-		/// <returns>
-		/// The zero-based index of the first occurrence of <paramref name="item"/> 
-		/// in the entire <c>LevelCollection</c>, if found; otherwise, -1.
-		///	</returns>
-		public virtual int IndexOf(Level item)
-		{
-			for (int i=0; i != m_count; ++i)
-			{
-				if (m_array[i].Equals(item))
-				{
-					return i;
-				}
-			}
-			return -1;
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="Level"/> at the specified index.
+    /// </summary>
+    /// <param name="index">The zero-based index of the element to get or set.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
+    /// </exception>
+    public virtual Level this[int index]
+    {
+      get
+      {
+        ValidateIndex(index); // throws
+        return m_array[index];
+      }
+      set
+      {
+        ValidateIndex(index); // throws
+        ++m_version;
+        m_array[index] = value;
+      }
+    }
 
-		/// <summary>
-		/// Inserts an element into the <c>LevelCollection</c> at the specified index.
-		/// </summary>
-		/// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
-		/// <param name="item">The <see cref="Level"/> to insert.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
-		/// </exception>
-		public virtual void Insert(int index, Level item)
-		{
-			ValidateIndex(index, true); // throws
-			
-			if (m_count == m_array.Length)
-			{
-				EnsureCapacity(m_count + 1);
-			}
+    /// <summary>
+    /// Adds a <see cref="Level"/> to the end of the <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="Level"/> to be added to the end of the <c>LevelCollection</c>.</param>
+    /// <returns>The index at which the value has been added.</returns>
+    public virtual int Add(Level item)
+    {
+      if (m_count == m_array.Length)
+      {
+        EnsureCapacity(m_count + 1);
+      }
 
-			if (index < m_count)
-			{
-				Array.Copy(m_array, index, m_array, index + 1, m_count - index);
-			}
+      m_array[m_count] = item;
+      m_version++;
+
+      return m_count++;
+    }
+
+    /// <summary>
+    /// Removes all elements from the <c>LevelCollection</c>.
+    /// </summary>
+    public virtual void Clear()
+    {
+      ++m_version;
+      m_array = new Level[DEFAULT_CAPACITY];
+      m_count = 0;
+    }
+
+    /// <summary>
+    /// Creates a shallow copy of the <see cref="LevelCollection"/>.
+    /// </summary>
+    /// <returns>A new <see cref="LevelCollection"/> with a shallow copy of the collection data.</returns>
+    public virtual object Clone()
+    {
+      LevelCollection newCol = new LevelCollection(m_count);
+      Array.Copy(m_array, 0, newCol.m_array, 0, m_count);
+      newCol.m_count = m_count;
+      newCol.m_version = m_version;
+
+      return newCol;
+    }
+
+    /// <summary>
+    /// Determines whether a given <see cref="Level"/> is in the <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="Level"/> to check for.</param>
+    /// <returns><c>true</c> if <paramref name="item"/> is found in the <c>LevelCollection</c>; otherwise, <c>false</c>.</returns>
+    public virtual bool Contains(Level item)
+    {
+      for (int i = 0; i != m_count; ++i)
+      {
+        if (m_array[i].Equals(item))
+        {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    /// <summary>
+    /// Returns the zero-based index of the first occurrence of a <see cref="Level"/>
+    /// in the <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="Level"/> to locate in the <c>LevelCollection</c>.</param>
+    /// <returns>
+    /// The zero-based index of the first occurrence of <paramref name="item"/> 
+    /// in the entire <c>LevelCollection</c>, if found; otherwise, -1.
+    ///  </returns>
+    public virtual int IndexOf(Level item)
+    {
+      for (int i = 0; i != m_count; ++i)
+      {
+        if (m_array[i].Equals(item))
+        {
+          return i;
+        }
+      }
+      return -1;
+    }
+
+    /// <summary>
+    /// Inserts an element into the <c>LevelCollection</c> at the specified index.
+    /// </summary>
+    /// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+    /// <param name="item">The <see cref="Level"/> to insert.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
+    /// </exception>
+    public virtual void Insert(int index, Level item)
+    {
+      ValidateIndex(index, true); // throws
+
+      if (m_count == m_array.Length)
+      {
+        EnsureCapacity(m_count + 1);
+      }
+
+      if (index < m_count)
+      {
+        Array.Copy(m_array, index, m_array, index + 1, m_count - index);
+      }
+
+      m_array[index] = item;
+      m_count++;
+      m_version++;
+    }
+
+    /// <summary>
+    /// Removes the first occurrence of a specific <see cref="Level"/> from the <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="Level"/> to remove from the <c>LevelCollection</c>.</param>
+    /// <exception cref="ArgumentException">
+    /// The specified <see cref="Level"/> was not found in the <c>LevelCollection</c>.
+    /// </exception>
+    public virtual void Remove(Level item)
+    {
+      int i = IndexOf(item);
+      if (i < 0)
+      {
+        throw new System.ArgumentException("Cannot remove the specified item because it was not found in the specified Collection.");
+      }
+
+      ++m_version;
+      RemoveAt(i);
+    }
+
+    /// <summary>
+    /// Removes the element at the specified index of the <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="index">The zero-based index of the element to remove.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
+    /// </exception>
+    public virtual void RemoveAt(int index)
+    {
+      ValidateIndex(index); // throws
+
+      m_count--;
+
+      if (index < m_count)
+      {
+        Array.Copy(m_array, index + 1, m_array, index, m_count - index);
+      }
+
+      // We can't set the deleted entry equal to null, because it might be a value type.
+      // Instead, we'll create an empty single-element array of the right type and copy it 
+      // over the entry we want to erase.
+      Level[] temp = new Level[1];
+      Array.Copy(temp, 0, m_array, m_count, 1);
+      m_version++;
+    }
+
+    /// <summary>
+    /// Gets a value indicating whether the collection has a fixed size.
+    /// </summary>
+    /// <value>true if the collection has a fixed size; otherwise, false. The default is false</value>
+    public virtual bool IsFixedSize
+    {
+      get { return false; }
+    }
+
+    /// <summary>
+    /// Gets a value indicating whether the IList is read-only.
+    /// </summary>
+    /// <value>true if the collection is read-only; otherwise, false. The default is false</value>
+    public virtual bool IsReadOnly
+    {
+      get { return false; }
+    }
+
+    #endregion
+
+    #region Operations (type-safe IEnumerable)
+
+    /// <summary>
+    /// Returns an enumerator that can iterate through the <c>LevelCollection</c>.
+    /// </summary>
+    /// <returns>An <see cref="Enumerator"/> for the entire <c>LevelCollection</c>.</returns>
+    public virtual ILevelCollectionEnumerator GetEnumerator()
+    {
+      return new Enumerator(this);
+    }
+
+    #endregion
+
+    #region Public helpers (just to mimic some nice features of ArrayList)
+
+    /// <summary>
+    /// Gets or sets the number of elements the <c>LevelCollection</c> can contain.
+    /// </summary>
+    public virtual int Capacity
+    {
+      get
+      {
+        return m_array.Length;
+      }
+      set
+      {
+        if (value < m_count)
+        {
+          value = m_count;
+        }
+
+        if (value != m_array.Length)
+        {
+          if (value > 0)
+          {
+            Level[] temp = new Level[value];
+            Array.Copy(m_array, 0, temp, 0, m_count);
+            m_array = temp;
+          }
+          else
+          {
+            m_array = new Level[DEFAULT_CAPACITY];
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Adds the elements of another <c>LevelCollection</c> to the current <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="x">The <c>LevelCollection</c> whose elements should be added to the end of the current <c>LevelCollection</c>.</param>
+    /// <returns>The new <see cref="LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
+    public virtual int AddRange(LevelCollection x)
+    {
+      if (m_count + x.Count >= m_array.Length)
+      {
+        EnsureCapacity(m_count + x.Count);
+      }
+
+      Array.Copy(x.m_array, 0, m_array, m_count, x.Count);
+      m_count += x.Count;
+      m_version++;
 
-			m_array[index] = item;
-			m_count++;
-			m_version++;
-		}
+      return m_count;
+    }
 
-		/// <summary>
-		/// Removes the first occurrence of a specific <see cref="Level"/> from the <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="Level"/> to remove from the <c>LevelCollection</c>.</param>
-		/// <exception cref="ArgumentException">
-		/// The specified <see cref="Level"/> was not found in the <c>LevelCollection</c>.
-		/// </exception>
-		public virtual void Remove(Level item)
-		{		   
-			int i = IndexOf(item);
-			if (i < 0)
-			{
-				throw new System.ArgumentException("Cannot remove the specified item because it was not found in the specified Collection.");
-			}
-			
-			++m_version;
-			RemoveAt(i);
-		}
+    /// <summary>
+    /// Adds the elements of a <see cref="Level"/> array to the current <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="x">The <see cref="Level"/> array whose elements should be added to the end of the <c>LevelCollection</c>.</param>
+    /// <returns>The new <see cref="LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
+    public virtual int AddRange(Level[] x)
+    {
+      if (m_count + x.Length >= m_array.Length)
+      {
+        EnsureCapacity(m_count + x.Length);
+      }
 
-		/// <summary>
-		/// Removes the element at the specified index of the <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="index">The zero-based index of the element to remove.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
-		/// </exception>
-		public virtual void RemoveAt(int index)
-		{
-			ValidateIndex(index); // throws
-			
-			m_count--;
+      Array.Copy(x, 0, m_array, m_count, x.Length);
+      m_count += x.Length;
+      m_version++;
 
-			if (index < m_count)
-			{
-				Array.Copy(m_array, index + 1, m_array, index, m_count - index);
-			}
-			
-			// We can't set the deleted entry equal to null, because it might be a value type.
-			// Instead, we'll create an empty single-element array of the right type and copy it 
-			// over the entry we want to erase.
-			Level[] temp = new Level[1];
-			Array.Copy(temp, 0, m_array, m_count, 1);
-			m_version++;
-		}
+      return m_count;
+    }
 
-		/// <summary>
-		/// Gets a value indicating whether the collection has a fixed size.
-		/// </summary>
-		/// <value>true if the collection has a fixed size; otherwise, false. The default is false</value>
-		public virtual bool IsFixedSize
-		{
-			get { return false; }
-		}
+    /// <summary>
+    /// Adds the elements of a <see cref="Level"/> collection to the current <c>LevelCollection</c>.
+    /// </summary>
+    /// <param name="col">The <see cref="Level"/> collection whose elements should be added to the end of the <c>LevelCollection</c>.</param>
+    /// <returns>The new <see cref="LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
+    public virtual int AddRange(ICollection col)
+    {
+      if (m_count + col.Count >= m_array.Length)
+      {
+        EnsureCapacity(m_count + col.Count);
+      }
 
-		/// <summary>
-		/// Gets a value indicating whether the IList is read-only.
-		/// </summary>
-		/// <value>true if the collection is read-only; otherwise, false. The default is false</value>
-		public virtual bool IsReadOnly
-		{
-			get { return false; }
-		}
+      foreach (object item in col)
+      {
+        Add((Level)item);
+      }
 
-		#endregion
+      return m_count;
+    }
 
-		#region Operations (type-safe IEnumerable)
-		
-		/// <summary>
-		/// Returns an enumerator that can iterate through the <c>LevelCollection</c>.
-		/// </summary>
-		/// <returns>An <see cref="Enumerator"/> for the entire <c>LevelCollection</c>.</returns>
-		public virtual ILevelCollectionEnumerator GetEnumerator()
-		{
-			return new Enumerator(this);
-		}
+    /// <summary>
+    /// Sets the capacity to the actual number of elements.
+    /// </summary>
+    public virtual void TrimToSize()
+    {
+      this.Capacity = m_count;
+    }
 
-		#endregion
+    #endregion
 
-		#region Public helpers (just to mimic some nice features of ArrayList)
-		
-		/// <summary>
-		/// Gets or sets the number of elements the <c>LevelCollection</c> can contain.
-		/// </summary>
-		public virtual int Capacity
-		{
-			get 
-			{ 
-				return m_array.Length; 
-			}
-			set
-			{
-				if (value < m_count)
-				{
-					value = m_count;
-				}
+    #region Implementation (helpers)
 
-				if (value != m_array.Length)
-				{
-					if (value > 0)
-					{
-						Level[] temp = new Level[value];
-						Array.Copy(m_array, 0, temp, 0, m_count);
-						m_array = temp;
-					}
-					else
-					{
-						m_array = new Level[DEFAULT_CAPACITY];
-					}
-				}
-			}
-		}
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="i"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="i"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
+    /// </exception>
+    private void ValidateIndex(int i)
+    {
+      ValidateIndex(i, false);
+    }
 
-		/// <summary>
-		/// Adds the elements of another <c>LevelCollection</c> to the current <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="x">The <c>LevelCollection</c> whose elements should be added to the end of the current <c>LevelCollection</c>.</param>
-		/// <returns>The new <see cref="LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
-		public virtual int AddRange(LevelCollection x)
-		{
-			if (m_count + x.Count >= m_array.Length)
-			{
-				EnsureCapacity(m_count + x.Count);
-			}
-			
-			Array.Copy(x.m_array, 0, m_array, m_count, x.Count);
-			m_count += x.Count;
-			m_version++;
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="i"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="i"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
+    /// </exception>
+    private void ValidateIndex(int i, bool allowEqualEnd)
+    {
+      int max = (allowEqualEnd) ? (m_count) : (m_count - 1);
+      if (i < 0 || i > max)
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("i", (object)i, "Index was out of range. Must be non-negative and less than the size of the collection. [" + (object)i + "] Specified argument was out of the range of valid values.");
+      }
+    }
 
-			return m_count;
-		}
+    private void EnsureCapacity(int min)
+    {
+      int newCapacity = ((m_array.Length == 0) ? DEFAULT_CAPACITY : m_array.Length * 2);
+      if (newCapacity < min)
+      {
+        newCapacity = min;
+      }
 
-		/// <summary>
-		/// Adds the elements of a <see cref="Level"/> array to the current <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="x">The <see cref="Level"/> array whose elements should be added to the end of the <c>LevelCollection</c>.</param>
-		/// <returns>The new <see cref="LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
-		public virtual int AddRange(Level[] x)
-		{
-			if (m_count + x.Length >= m_array.Length)
-			{
-				EnsureCapacity(m_count + x.Length);
-			}
+      this.Capacity = newCapacity;
+    }
 
-			Array.Copy(x, 0, m_array, m_count, x.Length);
-			m_count += x.Length;
-			m_version++;
+    #endregion
 
-			return m_count;
-		}
+    #region Implementation (ICollection)
 
-		/// <summary>
-		/// Adds the elements of a <see cref="Level"/> collection to the current <c>LevelCollection</c>.
-		/// </summary>
-		/// <param name="col">The <see cref="Level"/> collection whose elements should be added to the end of the <c>LevelCollection</c>.</param>
-		/// <returns>The new <see cref="LevelCollection.Count"/> of the <c>LevelCollection</c>.</returns>
-		public virtual int AddRange(ICollection col)
-		{
-			if (m_count + col.Count >= m_array.Length)
-			{
-				EnsureCapacity(m_count + col.Count);
-			}
+    void ICollection.CopyTo(Array array, int start)
+    {
+      Array.Copy(m_array, 0, array, start, m_count);
+    }
 
-			foreach(object item in col)
-			{
-				Add((Level)item);
-			}
+    #endregion
 
-			return m_count;
-		}
-		
-		/// <summary>
-		/// Sets the capacity to the actual number of elements.
-		/// </summary>
-		public virtual void TrimToSize()
-		{
-			this.Capacity = m_count;
-		}
+    #region Implementation (IList)
 
-		#endregion
+    object IList.this[int i]
+    {
+      get { return (object)this[i]; }
+      set { this[i] = (Level)value; }
+    }
 
-		#region Implementation (helpers)
+    int IList.Add(object x)
+    {
+      return this.Add((Level)x);
+    }
 
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="i"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="i"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
-		/// </exception>
-		private void ValidateIndex(int i)
-		{
-			ValidateIndex(i, false);
-		}
+    bool IList.Contains(object x)
+    {
+      return this.Contains((Level)x);
+    }
 
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="i"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="i"/> is equal to or greater than <see cref="LevelCollection.Count"/>.</para>
-		/// </exception>
-		private void ValidateIndex(int i, bool allowEqualEnd)
-		{
-			int max = (allowEqualEnd) ? (m_count) : (m_count-1);
-			if (i < 0 || i > max)
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("i", (object)i, "Index was out of range. Must be non-negative and less than the size of the collection. [" + (object)i + "] Specified argument was out of the range of valid values.");
-			}
-		}
+    int IList.IndexOf(object x)
+    {
+      return this.IndexOf((Level)x);
+    }
 
-		private void EnsureCapacity(int min)
-		{
-			int newCapacity = ((m_array.Length == 0) ? DEFAULT_CAPACITY : m_array.Length * 2);
-			if (newCapacity < min)
-			{
-				newCapacity = min;
-			}
+    void IList.Insert(int pos, object x)
+    {
+      this.Insert(pos, (Level)x);
+    }
 
-			this.Capacity = newCapacity;
-		}
+    void IList.Remove(object x)
+    {
+      this.Remove((Level)x);
+    }
 
-		#endregion
-		
-		#region Implementation (ICollection)
+    void IList.RemoveAt(int pos)
+    {
+      this.RemoveAt(pos);
+    }
 
-		void ICollection.CopyTo(Array array, int start)
-		{
-			Array.Copy(m_array, 0, array, start, m_count);
-		}
+    #endregion
 
-		#endregion
+    #region Implementation (IEnumerable)
 
-		#region Implementation (IList)
+    IEnumerator IEnumerable.GetEnumerator()
+    {
+      return (IEnumerator)(this.GetEnumerator());
+    }
 
-		object IList.this[int i]
-		{
-			get { return (object)this[i]; }
-			set { this[i] = (Level)value; }
-		}
+    #endregion
 
-		int IList.Add(object x)
-		{
-			return this.Add((Level)x);
-		}
+    #region Nested enumerator class
 
-		bool IList.Contains(object x)
-		{
-			return this.Contains((Level)x);
-		}
+    /// <summary>
+    /// Supports simple iteration over a <see cref="LevelCollection"/>.
+    /// </summary>
+    private sealed class Enumerator : IEnumerator, ILevelCollectionEnumerator
+    {
+      #region Implementation (data)
 
-		int IList.IndexOf(object x)
-		{
-			return this.IndexOf((Level)x);
-		}
+      private readonly LevelCollection m_collection;
+      private int m_index;
+      private int m_version;
 
-		void IList.Insert(int pos, object x)
-		{
-			this.Insert(pos, (Level)x);
-		}
+      #endregion
 
-		void IList.Remove(object x)
-		{
-			this.Remove((Level)x);
-		}
+      #region Construction
 
-		void IList.RemoveAt(int pos)
-		{
-			this.RemoveAt(pos);
-		}
+      /// <summary>
+      /// Initializes a new instance of the <c>Enumerator</c> class.
+      /// </summary>
+      /// <param name="tc"></param>
+      internal Enumerator(LevelCollection tc)
+      {
+        m_collection = tc;
+        m_index = -1;
+        m_version = tc.m_version;
+      }
 
-		#endregion
+      #endregion
 
-		#region Implementation (IEnumerable)
+      #region Operations (type-safe IEnumerator)
 
-		IEnumerator IEnumerable.GetEnumerator()
-		{
-			return (IEnumerator)(this.GetEnumerator());
-		}
+      /// <summary>
+      /// Gets the current element in the collection.
+      /// </summary>
+      public Level Current
+      {
+        get { return m_collection[m_index]; }
+      }
 
-		#endregion
+      /// <summary>
+      /// Advances the enumerator to the next element in the collection.
+      /// </summary>
+      /// <returns>
+      /// <c>true</c> if the enumerator was successfully advanced to the next element; 
+      /// <c>false</c> if the enumerator has passed the end of the collection.
+      /// </returns>
+      /// <exception cref="InvalidOperationException">
+      /// The collection was modified after the enumerator was created.
+      /// </exception>
+      public bool MoveNext()
+      {
+        if (m_version != m_collection.m_version)
+        {
+          throw new System.InvalidOperationException("Collection was modified; enumeration operation may not execute.");
+        }
 
-		#region Nested enumerator class
+        ++m_index;
+        return (m_index < m_collection.Count);
+      }
 
-		/// <summary>
-		/// Supports simple iteration over a <see cref="LevelCollection"/>.
-		/// </summary>
-		private sealed class Enumerator : IEnumerator, ILevelCollectionEnumerator
-		{
-			#region Implementation (data)
-			
-			private readonly LevelCollection m_collection;
-			private int m_index;
-			private int m_version;
-			
-			#endregion
-		
-			#region Construction
-			
-			/// <summary>
-			/// Initializes a new instance of the <c>Enumerator</c> class.
-			/// </summary>
-			/// <param name="tc"></param>
-			internal Enumerator(LevelCollection tc)
-			{
-				m_collection = tc;
-				m_index = -1;
-				m_version = tc.m_version;
-			}
-			
-			#endregion
-	
-			#region Operations (type-safe IEnumerator)
-			
-			/// <summary>
-			/// Gets the current element in the collection.
-			/// </summary>
-			public Level Current
-			{
-				get { return m_collection[m_index]; }
-			}
+      /// <summary>
+      /// Sets the enumerator to its initial position, before the first element in the collection.
+      /// </summary>
+      public void Reset()
+      {
+        m_index = -1;
+      }
 
-			/// <summary>
-			/// Advances the enumerator to the next element in the collection.
-			/// </summary>
-			/// <returns>
-			/// <c>true</c> if the enumerator was successfully advanced to the next element; 
-			/// <c>false</c> if the enumerator has passed the end of the collection.
-			/// </returns>
-			/// <exception cref="InvalidOperationException">
-			/// The collection was modified after the enumerator was created.
-			/// </exception>
-			public bool MoveNext()
-			{
-				if (m_version != m_collection.m_version)
-				{
-					throw new System.InvalidOperationException("Collection was modified; enumeration operation may not execute.");
-				}
+      #endregion
 
-				++m_index;
-				return (m_index < m_collection.Count);
-			}
+      #region Implementation (IEnumerator)
 
-			/// <summary>
-			/// Sets the enumerator to its initial position, before the first element in the collection.
-			/// </summary>
-			public void Reset()
-			{
-				m_index = -1;
-			}
+      object IEnumerator.Current
+      {
+        get { return this.Current; }
+      }
 
-			#endregion
-	
-			#region Implementation (IEnumerator)
-			
-			object IEnumerator.Current
-			{
-				get { return this.Current; }
-			}
-			
-			#endregion
-		}
+      #endregion
+    }
 
-		#endregion
+    #endregion
 
-		#region Nested Read Only Wrapper class
+    #region Nested Read Only Wrapper class
 
-		private sealed class ReadOnlyLevelCollection : LevelCollection
-		{
-			#region Implementation (data)
+    private sealed class ReadOnlyLevelCollection : LevelCollection
+    {
+      #region Implementation (data)
 
-			private readonly LevelCollection m_collection;
+      private readonly LevelCollection m_collection;
 
-			#endregion
+      #endregion
 
-			#region Construction
+      #region Construction
 
-			internal ReadOnlyLevelCollection(LevelCollection list) : base(Tag.Default)
-			{
-				m_collection = list;
-			}
+      internal ReadOnlyLevelCollection(LevelCollection list) : base(Tag.Default)
+      {
+        m_collection = list;
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe ICollection
+      #region Type-safe ICollection
 
-			public override void CopyTo(Level[] array)
-			{
-				m_collection.CopyTo(array);
-			}
+      public override void CopyTo(Level[] array)
+      {
+        m_collection.CopyTo(array);
+      }
 
-			public override void CopyTo(Level[] array, int start)
-			{
-				m_collection.CopyTo(array,start);
-			}
-			public override int Count
-			{
-				get { return m_collection.Count; }
-			}
+      public override void CopyTo(Level[] array, int start)
+      {
+        m_collection.CopyTo(array, start);
+      }
+      public override int Count
+      {
+        get { return m_collection.Count; }
+      }
 
-			public override bool IsSynchronized
-			{
-				get { return m_collection.IsSynchronized; }
-			}
+      public override bool IsSynchronized
+      {
+        get { return m_collection.IsSynchronized; }
+      }
 
-			public override object SyncRoot
-			{
-				get { return this.m_collection.SyncRoot; }
-			}
+      public override object SyncRoot
+      {
+        get { return this.m_collection.SyncRoot; }
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe IList
+      #region Type-safe IList
 
-			public override Level this[int i]
-			{
-				get { return m_collection[i]; }
-				set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
-			}
+      public override Level this[int i]
+      {
+        get { return m_collection[i]; }
+        set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
+      }
 
-			public override int Add(Level x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int Add(Level x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void Clear()
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Clear()
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override bool Contains(Level x)
-			{
-				return m_collection.Contains(x);
-			}
+      public override bool Contains(Level x)
+      {
+        return m_collection.Contains(x);
+      }
 
-			public override int IndexOf(Level x)
-			{
-				return m_collection.IndexOf(x);
-			}
+      public override int IndexOf(Level x)
+      {
+        return m_collection.IndexOf(x);
+      }
 
-			public override void Insert(int pos, Level x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Insert(int pos, Level x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void Remove(Level x)
-			{           
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Remove(Level x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void RemoveAt(int pos)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void RemoveAt(int pos)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override bool IsFixedSize
-			{
-				get { return true; }
-			}
+      public override bool IsFixedSize
+      {
+        get { return true; }
+      }
 
-			public override bool IsReadOnly
-			{
-				get { return true; }
-			}
+      public override bool IsReadOnly
+      {
+        get { return true; }
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe IEnumerable
+      #region Type-safe IEnumerable
 
-			public override ILevelCollectionEnumerator GetEnumerator()
-			{
-				return m_collection.GetEnumerator();
-			}
+      public override ILevelCollectionEnumerator GetEnumerator()
+      {
+        return m_collection.GetEnumerator();
+      }
 
-			#endregion
+      #endregion
 
-			#region Public Helpers
+      #region Public Helpers
 
-			// (just to mimic some nice features of ArrayList)
-			public override int Capacity
-			{
-				get { return m_collection.Capacity; }
-				set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
-			}
+      // (just to mimic some nice features of ArrayList)
+      public override int Capacity
+      {
+        get { return m_collection.Capacity; }
+        set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
+      }
 
-			public override int AddRange(LevelCollection x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int AddRange(LevelCollection x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override int AddRange(Level[] x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int AddRange(Level[] x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			#endregion
-		}
+      #endregion
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 
 }
diff --git a/src/log4net/Core/LevelEvaluator.cs b/src/log4net/Core/LevelEvaluator.cs
index 35706df..eac2d4e 100644
--- a/src/log4net/Core/LevelEvaluator.cs
+++ b/src/log4net/Core/LevelEvaluator.cs
@@ -23,111 +23,111 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// An evaluator that triggers at a threshold level
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This evaluator will trigger if the level of the event
-	/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-	/// is equal to or greater than the <see cref="Threshold"/>
-	/// level.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class LevelEvaluator : ITriggeringEventEvaluator 
-	{
-		/// <summary>
-		/// The threshold for triggering
-		/// </summary>
-		private Level m_threshold;
+  /// <summary>
+  /// An evaluator that triggers at a threshold level
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This evaluator will trigger if the level of the event
+  /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+  /// is equal to or greater than the <see cref="Threshold"/>
+  /// level.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class LevelEvaluator : ITriggeringEventEvaluator
+  {
+    /// <summary>
+    /// The threshold for triggering
+    /// </summary>
+    private Level m_threshold;
 
-		/// <summary>
-		/// Create a new evaluator using the <see cref="Level.Off"/> threshold.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Create a new evaluator using the <see cref="Level.Off"/> threshold.
-		/// </para>
-		/// <para>
-		/// This evaluator will trigger if the level of the event
-		/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-		/// is equal to or greater than the <see cref="Threshold"/>
-		/// level.
-		/// </para>
-		/// </remarks>
-		public LevelEvaluator() : this(Level.Off)
-		{
-		}
+    /// <summary>
+    /// Create a new evaluator using the <see cref="Level.Off"/> threshold.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Create a new evaluator using the <see cref="Level.Off"/> threshold.
+    /// </para>
+    /// <para>
+    /// This evaluator will trigger if the level of the event
+    /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+    /// is equal to or greater than the <see cref="Threshold"/>
+    /// level.
+    /// </para>
+    /// </remarks>
+    public LevelEvaluator() : this(Level.Off)
+    {
+    }
 
-		/// <summary>
-		/// Create a new evaluator using the specified <see cref="Level"/> threshold.
-		/// </summary>
-		/// <param name="threshold">the threshold to trigger at</param>
-		/// <remarks>
-		/// <para>
-		/// Create a new evaluator using the specified <see cref="Level"/> threshold.
-		/// </para>
-		/// <para>
-		/// This evaluator will trigger if the level of the event
-		/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-		/// is equal to or greater than the <see cref="Threshold"/>
-		/// level.
-		/// </para>
-		/// </remarks>
-		public LevelEvaluator(Level threshold)
-		{
-			if (threshold == null)
-			{
-				throw new ArgumentNullException("threshold");
-			}
+    /// <summary>
+    /// Create a new evaluator using the specified <see cref="Level"/> threshold.
+    /// </summary>
+    /// <param name="threshold">the threshold to trigger at</param>
+    /// <remarks>
+    /// <para>
+    /// Create a new evaluator using the specified <see cref="Level"/> threshold.
+    /// </para>
+    /// <para>
+    /// This evaluator will trigger if the level of the event
+    /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+    /// is equal to or greater than the <see cref="Threshold"/>
+    /// level.
+    /// </para>
+    /// </remarks>
+    public LevelEvaluator(Level threshold)
+    {
+      if (threshold == null)
+      {
+        throw new ArgumentNullException("threshold");
+      }
 
-			m_threshold = threshold;
-		}
+      m_threshold = threshold;
+    }
 
-		/// <summary>
-		/// the threshold to trigger at
-		/// </summary>
-		/// <value>
-		/// The <see cref="Level"/> that will cause this evaluator to trigger
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This evaluator will trigger if the level of the event
-		/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-		/// is equal to or greater than the <see cref="Threshold"/>
-		/// level.
-		/// </para>
-		/// </remarks>
-		public Level Threshold
-		{
-			get { return m_threshold; }
-			set { m_threshold = value; }
-		}
+    /// <summary>
+    /// the threshold to trigger at
+    /// </summary>
+    /// <value>
+    /// The <see cref="Level"/> that will cause this evaluator to trigger
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This evaluator will trigger if the level of the event
+    /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+    /// is equal to or greater than the <see cref="Threshold"/>
+    /// level.
+    /// </para>
+    /// </remarks>
+    public Level Threshold
+    {
+      get { return m_threshold; }
+      set { m_threshold = value; }
+    }
 
-		/// <summary>
-		/// Is this <paramref name="loggingEvent"/> the triggering event?
-		/// </summary>
-		/// <param name="loggingEvent">The event to check</param>
-		/// <returns>This method returns <c>true</c>, if the event level
-		/// is equal or higher than the <see cref="Threshold"/>. 
-		/// Otherwise it returns <c>false</c></returns>
-		/// <remarks>
-		/// <para>
-		/// This evaluator will trigger if the level of the event
-		/// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
-		/// is equal to or greater than the <see cref="Threshold"/>
-		/// level.
-		/// </para>
-		/// </remarks>
-		public bool IsTriggeringEvent(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Is this <paramref name="loggingEvent"/> the triggering event?
+    /// </summary>
+    /// <param name="loggingEvent">The event to check</param>
+    /// <returns>This method returns <c>true</c>, if the event level
+    /// is equal or higher than the <see cref="Threshold"/>. 
+    /// Otherwise it returns <c>false</c></returns>
+    /// <remarks>
+    /// <para>
+    /// This evaluator will trigger if the level of the event
+    /// passed to <see cref="M:IsTriggeringEvent(LoggingEvent)"/>
+    /// is equal to or greater than the <see cref="Threshold"/>
+    /// level.
+    /// </para>
+    /// </remarks>
+    public bool IsTriggeringEvent(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			return (loggingEvent.Level >= m_threshold); 
-		}
-	}
+      return (loggingEvent.Level >= m_threshold);
+    }
+  }
 }
diff --git a/src/log4net/Core/LevelMap.cs b/src/log4net/Core/LevelMap.cs
index d458533..75a2abb 100644
--- a/src/log4net/Core/LevelMap.cs
+++ b/src/log4net/Core/LevelMap.cs
@@ -25,205 +25,205 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Mapping between string name and Level object
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Mapping between string name and <see cref="Level"/> object.
-	/// This mapping is held separately for each <see cref="log4net.Repository.ILoggerRepository"/>.
-	/// The level name is case insensitive.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class LevelMap
-	{
-		#region Member Variables
+  /// <summary>
+  /// Mapping between string name and Level object
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Mapping between string name and <see cref="Level"/> object.
+  /// This mapping is held separately for each <see cref="log4net.Repository.ILoggerRepository"/>.
+  /// The level name is case insensitive.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class LevelMap
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// Mapping from level name to Level object. The
-		/// level name is case insensitive
-		/// </summary>
-		private Hashtable m_mapName2Level = SystemInfo.CreateCaseInsensitiveHashtable();
+    /// <summary>
+    /// Mapping from level name to Level object. The
+    /// level name is case insensitive
+    /// </summary>
+    private Hashtable m_mapName2Level = SystemInfo.CreateCaseInsensitiveHashtable();
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Construct the level map
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Construct the level map.
-		/// </para>
-		/// </remarks>
-		public LevelMap()
-		{
-		}
+    /// <summary>
+    /// Construct the level map
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Construct the level map.
+    /// </para>
+    /// </remarks>
+    public LevelMap()
+    {
+    }
 
-		/// <summary>
-		/// Clear the internal maps of all levels
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clear the internal maps of all levels
-		/// </para>
-		/// </remarks>
-		public void Clear()
-		{
-			// Clear all current levels
-			m_mapName2Level.Clear();
-		}
+    /// <summary>
+    /// Clear the internal maps of all levels
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clear the internal maps of all levels
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      // Clear all current levels
+      m_mapName2Level.Clear();
+    }
 
-		/// <summary>
-		/// Lookup a <see cref="Level"/> by name
-		/// </summary>
-		/// <param name="name">The name of the Level to lookup</param>
-		/// <returns>a Level from the map with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the <see cref="Level"/> from the
-		/// map with the name specified. If the no level is
-		/// found then <c>null</c> is returned.
-		/// </para>
-		/// </remarks>
-		public Level this[string name]
-		{
-			get
-			{
-				if (name == null)
-				{
-					throw new ArgumentNullException("name");
-				}
+    /// <summary>
+    /// Lookup a <see cref="Level"/> by name
+    /// </summary>
+    /// <param name="name">The name of the Level to lookup</param>
+    /// <returns>a Level from the map with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the <see cref="Level"/> from the
+    /// map with the name specified. If the no level is
+    /// found then <c>null</c> is returned.
+    /// </para>
+    /// </remarks>
+    public Level this[string name]
+    {
+      get
+      {
+        if (name == null)
+        {
+          throw new ArgumentNullException("name");
+        }
 
-				lock(this)
-				{
-					return (Level)m_mapName2Level[name];
-				}
-			}
-		}
+        lock (this)
+        {
+          return (Level)m_mapName2Level[name];
+        }
+      }
+    }
 
-		/// <summary>
-		/// Create a new Level and add it to the map
-		/// </summary>
-		/// <param name="name">the string to display for the Level</param>
-		/// <param name="value">the level value to give to the Level</param>
-		/// <remarks>
-		/// <para>
-		/// Create a new Level and add it to the map
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Add(string,int,string)"/>
-		public void Add(string name, int value)
-		{
-			Add(name, value, null);
-		}
+    /// <summary>
+    /// Create a new Level and add it to the map
+    /// </summary>
+    /// <param name="name">the string to display for the Level</param>
+    /// <param name="value">the level value to give to the Level</param>
+    /// <remarks>
+    /// <para>
+    /// Create a new Level and add it to the map
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Add(string,int,string)"/>
+    public void Add(string name, int value)
+    {
+      Add(name, value, null);
+    }
 
-		/// <summary>
-		/// Create a new Level and add it to the map
-		/// </summary>
-		/// <param name="name">the string to display for the Level</param>
-		/// <param name="value">the level value to give to the Level</param>
-		/// <param name="displayName">the display name to give to the Level</param>
-		/// <remarks>
-		/// <para>
-		/// Create a new Level and add it to the map
-		/// </para>
-		/// </remarks>
-		public void Add(string name, int value, string displayName)
-		{
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-			if (name.Length == 0)
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("name", name, "Parameter: name, Value: ["+name+"] out of range. Level name must not be empty");
-			}
+    /// <summary>
+    /// Create a new Level and add it to the map
+    /// </summary>
+    /// <param name="name">the string to display for the Level</param>
+    /// <param name="value">the level value to give to the Level</param>
+    /// <param name="displayName">the display name to give to the Level</param>
+    /// <remarks>
+    /// <para>
+    /// Create a new Level and add it to the map
+    /// </para>
+    /// </remarks>
+    public void Add(string name, int value, string displayName)
+    {
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+      if (name.Length == 0)
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("name", name, "Parameter: name, Value: [" + name + "] out of range. Level name must not be empty");
+      }
 
-			if (displayName == null || displayName.Length == 0)
-			{
-				displayName = name;
-			}
+      if (displayName == null || displayName.Length == 0)
+      {
+        displayName = name;
+      }
 
-			Add(new Level(value, name, displayName));
-		}
+      Add(new Level(value, name, displayName));
+    }
 
-		/// <summary>
-		/// Add a Level to the map
-		/// </summary>
-		/// <param name="level">the Level to add</param>
-		/// <remarks>
-		/// <para>
-		/// Add a Level to the map
-		/// </para>
-		/// </remarks>
-		public void Add(Level level)
-		{
-			if (level == null)
-			{
-				throw new ArgumentNullException("level");
-			}
-			lock(this)
-			{
-				m_mapName2Level[level.Name] = level;
-			}
-		}
+    /// <summary>
+    /// Add a Level to the map
+    /// </summary>
+    /// <param name="level">the Level to add</param>
+    /// <remarks>
+    /// <para>
+    /// Add a Level to the map
+    /// </para>
+    /// </remarks>
+    public void Add(Level level)
+    {
+      if (level == null)
+      {
+        throw new ArgumentNullException("level");
+      }
+      lock (this)
+      {
+        m_mapName2Level[level.Name] = level;
+      }
+    }
 
-		/// <summary>
-		/// Return all possible levels as a list of Level objects.
-		/// </summary>
-		/// <returns>all possible levels as a list of Level objects</returns>
-		/// <remarks>
-		/// <para>
-		/// Return all possible levels as a list of Level objects.
-		/// </para>
-		/// </remarks>
-		public LevelCollection AllLevels
-		{
-			get
-			{
-				lock(this)
-				{
-					return new LevelCollection(m_mapName2Level.Values);
-				}
-			}
-		}
+    /// <summary>
+    /// Return all possible levels as a list of Level objects.
+    /// </summary>
+    /// <returns>all possible levels as a list of Level objects</returns>
+    /// <remarks>
+    /// <para>
+    /// Return all possible levels as a list of Level objects.
+    /// </para>
+    /// </remarks>
+    public LevelCollection AllLevels
+    {
+      get
+      {
+        lock (this)
+        {
+          return new LevelCollection(m_mapName2Level.Values);
+        }
+      }
+    }
 
-		/// <summary>
-		/// Lookup a named level from the map
-		/// </summary>
-		/// <param name="defaultLevel">the name of the level to lookup is taken from this level. 
-		/// If the level is not set on the map then this level is added</param>
-		/// <returns>the level in the map with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Lookup a named level from the map. The name of the level to lookup is taken
-		/// from the <see cref="Level.Name"/> property of the <paramref name="defaultLevel"/>
-		/// argument.
-		/// </para>
-		/// <para>
-		/// If no level with the specified name is found then the 
-		/// <paramref name="defaultLevel"/> argument is added to the level map
-		/// and returned.
-		/// </para>
-		/// </remarks>
-		public Level LookupWithDefault(Level defaultLevel)
-		{
-			if (defaultLevel == null)
-			{
-				throw new ArgumentNullException("defaultLevel");
-			}
+    /// <summary>
+    /// Lookup a named level from the map
+    /// </summary>
+    /// <param name="defaultLevel">the name of the level to lookup is taken from this level. 
+    /// If the level is not set on the map then this level is added</param>
+    /// <returns>the level in the map with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Lookup a named level from the map. The name of the level to lookup is taken
+    /// from the <see cref="Level.Name"/> property of the <paramref name="defaultLevel"/>
+    /// argument.
+    /// </para>
+    /// <para>
+    /// If no level with the specified name is found then the 
+    /// <paramref name="defaultLevel"/> argument is added to the level map
+    /// and returned.
+    /// </para>
+    /// </remarks>
+    public Level LookupWithDefault(Level defaultLevel)
+    {
+      if (defaultLevel == null)
+      {
+        throw new ArgumentNullException("defaultLevel");
+      }
 
-			lock(this)
-			{
-				Level level = (Level)m_mapName2Level[defaultLevel.Name];
-				if (level == null)
-				{
-					m_mapName2Level[defaultLevel.Name] = defaultLevel;
-					return defaultLevel;
-				}
-				return level;
-			}
-		}
-	}
+      lock (this)
+      {
+        Level level = (Level)m_mapName2Level[defaultLevel.Name];
+        if (level == null)
+        {
+          m_mapName2Level[defaultLevel.Name] = defaultLevel;
+          return defaultLevel;
+        }
+        return level;
+      }
+    }
+  }
 }
diff --git a/src/log4net/Core/LocationInfo.cs b/src/log4net/Core/LocationInfo.cs
index d364f9d..a3633fd 100644
--- a/src/log4net/Core/LocationInfo.cs
+++ b/src/log4net/Core/LocationInfo.cs
@@ -27,295 +27,295 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// The internal representation of caller location information.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class uses the <c>System.Diagnostics.StackTrace</c> class to generate
-	/// a call stack. The caller's information is then extracted from this stack.
-	/// </para>
-	/// <para>
-	/// The <c>System.Diagnostics.StackTrace</c> class is not supported on the 
-	/// .NET Compact Framework 1.0 therefore caller location information is not
-	/// available on that framework.
-	/// </para>
-	/// <para>
-	/// The <c>System.Diagnostics.StackTrace</c> class has this to say about Release builds:
-	/// </para>
-	/// <para>
-	/// "StackTrace information will be most informative with Debug build configurations. 
-	/// By default, Debug builds include debug symbols, while Release builds do not. The 
-	/// debug symbols contain most of the file, method name, line number, and column 
-	/// information used in constructing StackFrame and StackTrace objects. StackTrace 
-	/// might not report as many method calls as expected, due to code transformations 
-	/// that occur during optimization."
-	/// </para>
-	/// <para>
-	/// This means that in a Release build the caller information may be incomplete or may 
-	/// not exist at all! Therefore caller location information cannot be relied upon in a Release build.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// The internal representation of caller location information.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class uses the <c>System.Diagnostics.StackTrace</c> class to generate
+  /// a call stack. The caller's information is then extracted from this stack.
+  /// </para>
+  /// <para>
+  /// The <c>System.Diagnostics.StackTrace</c> class is not supported on the 
+  /// .NET Compact Framework 1.0 therefore caller location information is not
+  /// available on that framework.
+  /// </para>
+  /// <para>
+  /// The <c>System.Diagnostics.StackTrace</c> class has this to say about Release builds:
+  /// </para>
+  /// <para>
+  /// "StackTrace information will be most informative with Debug build configurations. 
+  /// By default, Debug builds include debug symbols, while Release builds do not. The 
+  /// debug symbols contain most of the file, method name, line number, and column 
+  /// information used in constructing StackFrame and StackTrace objects. StackTrace 
+  /// might not report as many method calls as expected, due to code transformations 
+  /// that occur during optimization."
+  /// </para>
+  /// <para>
+  /// This means that in a Release build the caller information may be incomplete or may 
+  /// not exist at all! Therefore caller location information cannot be relied upon in a Release build.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
-	public class LocationInfo
-	{
-		#region Public Instance Constructors
+  public class LocationInfo
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-		/// the stack boundary into the logging system for this call.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LocationInfo" />
-		/// class based on the current thread.
-		/// </para>
-		/// </remarks>
-		public LocationInfo(Type callerStackBoundaryDeclaringType) 
-		{
-			// Initialize all fields
-			m_className = NA;
-			m_fileName = NA;
-			m_lineNumber = NA;
-			m_methodName = NA;
-			m_fullInfo = NA;
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LocationInfo" />
+    /// class based on the current thread.
+    /// </para>
+    /// </remarks>
+    public LocationInfo(Type callerStackBoundaryDeclaringType)
+    {
+      // Initialize all fields
+      m_className = NA;
+      m_fileName = NA;
+      m_lineNumber = NA;
+      m_methodName = NA;
+      m_fullInfo = NA;
 
 #if !NETCF && !NETSTANDARD1_3 // StackTrace isn't fully implemented for NETSTANDARD1_3 https://github.com/dotnet/corefx/issues/1797
-			if (callerStackBoundaryDeclaringType != null)
-			{
-				try
-				{
-					StackTrace st = new StackTrace(true);
-					int frameIndex = 0;
-																				
-					// skip frames not from fqnOfCallingClass
-					while (frameIndex < st.FrameCount)
-					{
-						StackFrame frame = st.GetFrame(frameIndex);
-						if (frame != null && frame.GetMethod().DeclaringType == callerStackBoundaryDeclaringType)
-						{
-							break;
-						}
-						frameIndex++;
-					}
+      if (callerStackBoundaryDeclaringType != null)
+      {
+        try
+        {
+          StackTrace st = new StackTrace(true);
+          int frameIndex = 0;
 
-					// skip frames from fqnOfCallingClass
-					while (frameIndex < st.FrameCount)
-					{
-						StackFrame frame = st.GetFrame(frameIndex);
-						if (frame != null && frame.GetMethod().DeclaringType != callerStackBoundaryDeclaringType)
-						{
-							break;
-						}
-						frameIndex++;
-					}
+          // skip frames not from fqnOfCallingClass
+          while (frameIndex < st.FrameCount)
+          {
+            StackFrame frame = st.GetFrame(frameIndex);
+            if (frame != null && frame.GetMethod().DeclaringType == callerStackBoundaryDeclaringType)
+            {
+              break;
+            }
+            frameIndex++;
+          }
 
-					if (frameIndex < st.FrameCount)
-					{
-						// take into account the frames we skip above
-						int adjustedFrameCount = st.FrameCount - frameIndex;
-                        ArrayList stackFramesList = new ArrayList(adjustedFrameCount);
-						m_stackFrames = new StackFrameItem[adjustedFrameCount];
-						for (int i=frameIndex; i < st.FrameCount; i++) 
-						{
-							stackFramesList.Add(new StackFrameItem(st.GetFrame(i)));
-						}
-												
-						stackFramesList.CopyTo(m_stackFrames, 0);
-						
-						// now frameIndex is the first 'user' caller frame
-						StackFrame locationFrame = st.GetFrame(frameIndex);
+          // skip frames from fqnOfCallingClass
+          while (frameIndex < st.FrameCount)
+          {
+            StackFrame frame = st.GetFrame(frameIndex);
+            if (frame != null && frame.GetMethod().DeclaringType != callerStackBoundaryDeclaringType)
+            {
+              break;
+            }
+            frameIndex++;
+          }
 
-						if (locationFrame != null)
-						{
-							System.Reflection.MethodBase method = locationFrame.GetMethod();
+          if (frameIndex < st.FrameCount)
+          {
+            // take into account the frames we skip above
+            int adjustedFrameCount = st.FrameCount - frameIndex;
+            ArrayList stackFramesList = new ArrayList(adjustedFrameCount);
+            m_stackFrames = new StackFrameItem[adjustedFrameCount];
+            for (int i = frameIndex; i < st.FrameCount; i++)
+            {
+              stackFramesList.Add(new StackFrameItem(st.GetFrame(i)));
+            }
 
-							if (method != null)
-							{
-								m_methodName =  method.Name;
-								if (method.DeclaringType != null)
-								{
-									m_className = method.DeclaringType.FullName;
-								}
-							}
-							m_fileName = locationFrame.GetFileName();
-							m_lineNumber = locationFrame.GetFileLineNumber().ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
+            stackFramesList.CopyTo(m_stackFrames, 0);
 
-							// Combine all location info
-							m_fullInfo =  m_className + '.' + m_methodName + '(' + m_fileName + ':' + m_lineNumber + ')';
-						}
-					}
-				}
-				catch(System.Security.SecurityException)
-				{
-					// This security exception will occur if the caller does not have 
-					// some undefined set of SecurityPermission flags.
-					LogLog.Debug(declaringType, "Security exception while trying to get caller stack frame. Error Ignored. Location Information Not Available.");
-				}
-			}
+            // now frameIndex is the first 'user' caller frame
+            StackFrame locationFrame = st.GetFrame(frameIndex);
+
+            if (locationFrame != null)
+            {
+              System.Reflection.MethodBase method = locationFrame.GetMethod();
+
+              if (method != null)
+              {
+                m_methodName = method.Name;
+                if (method.DeclaringType != null)
+                {
+                  m_className = method.DeclaringType.FullName;
+                }
+              }
+              m_fileName = locationFrame.GetFileName();
+              m_lineNumber = locationFrame.GetFileLineNumber().ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
+
+              // Combine all location info
+              m_fullInfo = m_className + '.' + m_methodName + '(' + m_fileName + ':' + m_lineNumber + ')';
+            }
+          }
+        }
+        catch (System.Security.SecurityException)
+        {
+          // This security exception will occur if the caller does not have 
+          // some undefined set of SecurityPermission flags.
+          LogLog.Debug(declaringType, "Security exception while trying to get caller stack frame. Error Ignored. Location Information Not Available.");
+        }
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="className">The fully qualified class name.</param>
-		/// <param name="methodName">The method name.</param>
-		/// <param name="fileName">The file name.</param>
-		/// <param name="lineNumber">The line number of the method within the file.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LocationInfo" />
-		/// class with the specified data.
-		/// </para>
-		/// </remarks>
-		public LocationInfo(string className, string methodName, string fileName, string lineNumber)
-		{
-			m_className = className;
-			m_fileName = fileName;
-			m_lineNumber = lineNumber;
-			m_methodName = methodName;
-			m_fullInfo = m_className + '.' + m_methodName + '(' + m_fileName + 
-				':' + m_lineNumber + ')';
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="className">The fully qualified class name.</param>
+    /// <param name="methodName">The method name.</param>
+    /// <param name="fileName">The file name.</param>
+    /// <param name="lineNumber">The line number of the method within the file.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LocationInfo" />
+    /// class with the specified data.
+    /// </para>
+    /// </remarks>
+    public LocationInfo(string className, string methodName, string fileName, string lineNumber)
+    {
+      m_className = className;
+      m_fileName = fileName;
+      m_lineNumber = lineNumber;
+      m_methodName = methodName;
+      m_fullInfo = m_className + '.' + m_methodName + '(' + m_fileName +
+        ':' + m_lineNumber + ')';
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the fully qualified class name of the caller making the logging 
-		/// request.
-		/// </summary>
-		/// <value>
-		/// The fully qualified class name of the caller making the logging 
-		/// request.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the fully qualified class name of the caller making the logging 
-		/// request.
-		/// </para>
-		/// </remarks>
-		public string ClassName
-		{
-			get { return m_className; }
-		}
+    /// <summary>
+    /// Gets the fully qualified class name of the caller making the logging 
+    /// request.
+    /// </summary>
+    /// <value>
+    /// The fully qualified class name of the caller making the logging 
+    /// request.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the fully qualified class name of the caller making the logging 
+    /// request.
+    /// </para>
+    /// </remarks>
+    public string ClassName
+    {
+      get { return m_className; }
+    }
 
-		/// <summary>
-		/// Gets the file name of the caller.
-		/// </summary>
-		/// <value>
-		/// The file name of the caller.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the file name of the caller.
-		/// </para>
-		/// </remarks>
-		public string FileName
-		{
-			get { return m_fileName; }
-		}
+    /// <summary>
+    /// Gets the file name of the caller.
+    /// </summary>
+    /// <value>
+    /// The file name of the caller.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the file name of the caller.
+    /// </para>
+    /// </remarks>
+    public string FileName
+    {
+      get { return m_fileName; }
+    }
 
-		/// <summary>
-		/// Gets the line number of the caller.
-		/// </summary>
-		/// <value>
-		/// The line number of the caller.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the line number of the caller.
-		/// </para>
-		/// </remarks>
-		public string LineNumber
-		{
-			get { return m_lineNumber; }
-		}
+    /// <summary>
+    /// Gets the line number of the caller.
+    /// </summary>
+    /// <value>
+    /// The line number of the caller.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the line number of the caller.
+    /// </para>
+    /// </remarks>
+    public string LineNumber
+    {
+      get { return m_lineNumber; }
+    }
 
-		/// <summary>
-		/// Gets the method name of the caller.
-		/// </summary>
-		/// <value>
-		/// The method name of the caller.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the method name of the caller.
-		/// </para>
-		/// </remarks>
-		public string MethodName
-		{
-			get { return m_methodName; }
-		}
+    /// <summary>
+    /// Gets the method name of the caller.
+    /// </summary>
+    /// <value>
+    /// The method name of the caller.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the method name of the caller.
+    /// </para>
+    /// </remarks>
+    public string MethodName
+    {
+      get { return m_methodName; }
+    }
 
-		/// <summary>
-		/// Gets all available caller information
-		/// </summary>
-		/// <value>
-		/// All available caller information, in the format
-		/// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets all available caller information, in the format
-		/// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
-		/// </para>
-		/// </remarks>
-		public string FullInfo
-		{
-			get { return m_fullInfo; }
-		}
-		
+    /// <summary>
+    /// Gets all available caller information
+    /// </summary>
+    /// <value>
+    /// All available caller information, in the format
+    /// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets all available caller information, in the format
+    /// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
+    /// </para>
+    /// </remarks>
+    public string FullInfo
+    {
+      get { return m_fullInfo; }
+    }
+
 #if !NETCF && !NETSTANDARD1_3
-		/// <summary>
-		/// Gets the stack frames from the stack trace of the caller making the log request
-		/// </summary>
-		public StackFrameItem[] StackFrames
-		{
-			get { return m_stackFrames; }
-		}
+    /// <summary>
+    /// Gets the stack frames from the stack trace of the caller making the log request
+    /// </summary>
+    public StackFrameItem[] StackFrames
+    {
+      get { return m_stackFrames; }
+    }
 #endif
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private readonly string m_className;
-		private readonly string m_fileName;
-		private readonly string m_lineNumber;
-		private readonly string m_methodName;
-		private readonly string m_fullInfo;
+    private readonly string m_className;
+    private readonly string m_fileName;
+    private readonly string m_lineNumber;
+    private readonly string m_methodName;
+    private readonly string m_fullInfo;
 #if !NETCF && !NETSTANDARD1_3
-		private readonly StackFrameItem[] m_stackFrames;
+    private readonly StackFrameItem[] m_stackFrames;
 #endif
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the LocationInfo class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(LocationInfo);
+    /// <summary>
+    /// The fully qualified type of the LocationInfo class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(LocationInfo);
 
-		/// <summary>
-		/// When location information is not available the constant
-		/// <c>NA</c> is returned. Current value of this string
-		/// constant is <b>?</b>.
-		/// </summary>
-		private const string NA = "?";
+    /// <summary>
+    /// When location information is not available the constant
+    /// <c>NA</c> is returned. Current value of this string
+    /// constant is <b>?</b>.
+    /// </summary>
+    private const string NA = "?";
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Core/LogException.cs b/src/log4net/Core/LogException.cs
index 32a64ff..f9b8e25 100644
--- a/src/log4net/Core/LogException.cs
+++ b/src/log4net/Core/LogException.cs
@@ -24,91 +24,91 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Exception base type for log4net.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This type extends <see cref="ApplicationException"/>. It
-	/// does not add any new functionality but does differentiate the
-	/// type of exception being thrown.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// Exception base type for log4net.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This type extends <see cref="ApplicationException"/>. It
+  /// does not add any new functionality but does differentiate the
+  /// type of exception being thrown.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
 #if NETSTANDARD1_3
-	public class LogException : Exception
+  public class LogException : Exception
 #else
-	public class LogException : ApplicationException 
+  public class LogException : ApplicationException
 #endif
-	{
-		#region Public Instance Constructors
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LogException" /> class.
-		/// </para>
-		/// </remarks>
-		public LogException()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LogException" /> class.
+    /// </para>
+    /// </remarks>
+    public LogException()
+    {
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="message">A message to include with the exception.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LogException" /> class with
-		/// the specified message.
-		/// </para>
-		/// </remarks>
-		public LogException(String message) : base(message) 
-		{
-		}
-		
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="message">A message to include with the exception.</param>
-		/// <param name="innerException">A nested exception to include.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LogException" /> class
-		/// with the specified message and inner exception.
-		/// </para>
-		/// </remarks>
-		public LogException(String message, Exception innerException) : base(message, innerException) 
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="message">A message to include with the exception.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LogException" /> class with
+    /// the specified message.
+    /// </para>
+    /// </remarks>
+    public LogException(String message) : base(message)
+    {
+    }
 
-		#endregion Public Instance Constructors
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="message">A message to include with the exception.</param>
+    /// <param name="innerException">A nested exception to include.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LogException" /> class
+    /// with the specified message and inner exception.
+    /// </para>
+    /// </remarks>
+    public LogException(String message, Exception innerException) : base(message, innerException)
+    {
+    }
 
-		#region Protected Instance Constructors
+    #endregion Public Instance Constructors
+
+    #region Protected Instance Constructors
 
 #if !NETCF && !NETSTANDARD1_3
-		/// <summary>
-		/// Serialization constructor
-		/// </summary>
-		/// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data about the exception being thrown.</param>
-		/// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LogException" /> class 
-		/// with serialized data.
-		/// </para>
-		/// </remarks>
-		protected LogException(SerializationInfo info, StreamingContext context) : base(info, context) 
-		{
-		}
+    /// <summary>
+    /// Serialization constructor
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data about the exception being thrown.</param>
+    /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LogException" /> class 
+    /// with serialized data.
+    /// </para>
+    /// </remarks>
+    protected LogException(SerializationInfo info, StreamingContext context) : base(info, context)
+    {
+    }
 #endif
 
-		#endregion Protected Instance Constructors
-	}
+    #endregion Protected Instance Constructors
+  }
 }
diff --git a/src/log4net/Core/LogImpl.cs b/src/log4net/Core/LogImpl.cs
index f997ac3..6eae4fa 100644
--- a/src/log4net/Core/LogImpl.cs
+++ b/src/log4net/Core/LogImpl.cs
@@ -25,1272 +25,1272 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Implementation of <see cref="ILog"/> wrapper interface.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This implementation of the <see cref="ILog"/> interface
-	/// forwards to the <see cref="ILogger"/> held by the base class.
-	/// </para>
-	/// <para>
-	/// This logger has methods to allow the caller to log at the following
-	/// levels:
-	/// </para>
-	/// <list type="definition">
-	///   <item>
-	///     <term>DEBUG</term>
-	///     <description>
-	///     The <see cref="M:Debug(object)"/> and <see cref="M:DebugFormat(string, object[])"/> methods log messages
-	///     at the <c>DEBUG</c> level. That is the level with that name defined in the
-	///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
-	///     for this level is <see cref="Level.Debug"/>. The <see cref="IsDebugEnabled"/>
-	///     property tests if this level is enabled for logging.
-	///     </description>
-	///   </item>
-	///   <item>
-	///     <term>INFO</term>
-	///     <description>
-	///     The <see cref="M:Info(object)"/> and <see cref="M:InfoFormat(string, object[])"/> methods log messages
-	///     at the <c>INFO</c> level. That is the level with that name defined in the
-	///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
-	///     for this level is <see cref="Level.Info"/>. The <see cref="IsInfoEnabled"/>
-	///     property tests if this level is enabled for logging.
-	///     </description>
-	///   </item>
-	///   <item>
-	///     <term>WARN</term>
-	///     <description>
-	///     The <see cref="M:Warn(object)"/> and <see cref="M:WarnFormat(string, object[])"/> methods log messages
-	///     at the <c>WARN</c> level. That is the level with that name defined in the
-	///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
-	///     for this level is <see cref="Level.Warn"/>. The <see cref="IsWarnEnabled"/>
-	///     property tests if this level is enabled for logging.
-	///     </description>
-	///   </item>
-	///   <item>
-	///     <term>ERROR</term>
-	///     <description>
-	///     The <see cref="M:Error(object)"/> and <see cref="M:ErrorFormat(string, object[])"/> methods log messages
-	///     at the <c>ERROR</c> level. That is the level with that name defined in the
-	///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
-	///     for this level is <see cref="Level.Error"/>. The <see cref="IsErrorEnabled"/>
-	///     property tests if this level is enabled for logging.
-	///     </description>
-	///   </item>
-	///   <item>
-	///     <term>FATAL</term>
-	///     <description>
-	///     The <see cref="M:Fatal(object)"/> and <see cref="M:FatalFormat(string, object[])"/> methods log messages
-	///     at the <c>FATAL</c> level. That is the level with that name defined in the
-	///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
-	///     for this level is <see cref="Level.Fatal"/>. The <see cref="IsFatalEnabled"/>
-	///     property tests if this level is enabled for logging.
-	///     </description>
-	///   </item>
-	/// </list>
-	/// <para>
-	/// The values for these levels and their semantic meanings can be changed by 
-	/// configuring the <see cref="ILoggerRepository.LevelMap"/> for the repository.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class LogImpl : LoggerWrapperImpl, ILog
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Implementation of <see cref="ILog"/> wrapper interface.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This implementation of the <see cref="ILog"/> interface
+  /// forwards to the <see cref="ILogger"/> held by the base class.
+  /// </para>
+  /// <para>
+  /// This logger has methods to allow the caller to log at the following
+  /// levels:
+  /// </para>
+  /// <list type="definition">
+  ///   <item>
+  ///     <term>DEBUG</term>
+  ///     <description>
+  ///     The <see cref="M:Debug(object)"/> and <see cref="M:DebugFormat(string, object[])"/> methods log messages
+  ///     at the <c>DEBUG</c> level. That is the level with that name defined in the
+  ///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
+  ///     for this level is <see cref="Level.Debug"/>. The <see cref="IsDebugEnabled"/>
+  ///     property tests if this level is enabled for logging.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>INFO</term>
+  ///     <description>
+  ///     The <see cref="M:Info(object)"/> and <see cref="M:InfoFormat(string, object[])"/> methods log messages
+  ///     at the <c>INFO</c> level. That is the level with that name defined in the
+  ///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
+  ///     for this level is <see cref="Level.Info"/>. The <see cref="IsInfoEnabled"/>
+  ///     property tests if this level is enabled for logging.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>WARN</term>
+  ///     <description>
+  ///     The <see cref="M:Warn(object)"/> and <see cref="M:WarnFormat(string, object[])"/> methods log messages
+  ///     at the <c>WARN</c> level. That is the level with that name defined in the
+  ///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
+  ///     for this level is <see cref="Level.Warn"/>. The <see cref="IsWarnEnabled"/>
+  ///     property tests if this level is enabled for logging.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>ERROR</term>
+  ///     <description>
+  ///     The <see cref="M:Error(object)"/> and <see cref="M:ErrorFormat(string, object[])"/> methods log messages
+  ///     at the <c>ERROR</c> level. That is the level with that name defined in the
+  ///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
+  ///     for this level is <see cref="Level.Error"/>. The <see cref="IsErrorEnabled"/>
+  ///     property tests if this level is enabled for logging.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>FATAL</term>
+  ///     <description>
+  ///     The <see cref="M:Fatal(object)"/> and <see cref="M:FatalFormat(string, object[])"/> methods log messages
+  ///     at the <c>FATAL</c> level. That is the level with that name defined in the
+  ///     repositories <see cref="ILoggerRepository.LevelMap"/>. The default value
+  ///     for this level is <see cref="Level.Fatal"/>. The <see cref="IsFatalEnabled"/>
+  ///     property tests if this level is enabled for logging.
+  ///     </description>
+  ///   </item>
+  /// </list>
+  /// <para>
+  /// The values for these levels and their semantic meanings can be changed by 
+  /// configuring the <see cref="ILoggerRepository.LevelMap"/> for the repository.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class LogImpl : LoggerWrapperImpl, ILog
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Construct a new wrapper for the specified logger.
-		/// </summary>
-		/// <param name="logger">The logger to wrap.</param>
-		/// <remarks>
-		/// <para>
-		/// Construct a new wrapper for the specified logger.
-		/// </para>
-		/// </remarks>
-		public LogImpl(ILogger logger) : base(logger)
-		{
-			// Listen for changes to the repository
-			logger.Repository.ConfigurationChanged += new LoggerRepositoryConfigurationChangedEventHandler(LoggerRepositoryConfigurationChanged);
+    /// <summary>
+    /// Construct a new wrapper for the specified logger.
+    /// </summary>
+    /// <param name="logger">The logger to wrap.</param>
+    /// <remarks>
+    /// <para>
+    /// Construct a new wrapper for the specified logger.
+    /// </para>
+    /// </remarks>
+    public LogImpl(ILogger logger) : base(logger)
+    {
+      // Listen for changes to the repository
+      logger.Repository.ConfigurationChanged += new LoggerRepositoryConfigurationChangedEventHandler(LoggerRepositoryConfigurationChanged);
 
-			// load the current levels
-			ReloadLevels(logger.Repository);
-		}
+      // load the current levels
+      ReloadLevels(logger.Repository);
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		/// <summary>
-		/// Virtual method called when the configuration of the repository changes
-		/// </summary>
-		/// <param name="repository">the repository holding the levels</param>
-		/// <remarks>
-		/// <para>
-		/// Virtual method called when the configuration of the repository changes
-		/// </para>
-		/// </remarks>
-		protected virtual void ReloadLevels(ILoggerRepository repository)
-		{
-			LevelMap levelMap = repository.LevelMap;
+    /// <summary>
+    /// Virtual method called when the configuration of the repository changes
+    /// </summary>
+    /// <param name="repository">the repository holding the levels</param>
+    /// <remarks>
+    /// <para>
+    /// Virtual method called when the configuration of the repository changes
+    /// </para>
+    /// </remarks>
+    protected virtual void ReloadLevels(ILoggerRepository repository)
+    {
+      LevelMap levelMap = repository.LevelMap;
 
-			m_levelDebug = levelMap.LookupWithDefault(Level.Debug);
-			m_levelInfo = levelMap.LookupWithDefault(Level.Info);
-			m_levelWarn = levelMap.LookupWithDefault(Level.Warn);
-			m_levelError = levelMap.LookupWithDefault(Level.Error);
-			m_levelFatal = levelMap.LookupWithDefault(Level.Fatal);
-		}
+      m_levelDebug = levelMap.LookupWithDefault(Level.Debug);
+      m_levelInfo = levelMap.LookupWithDefault(Level.Info);
+      m_levelWarn = levelMap.LookupWithDefault(Level.Warn);
+      m_levelError = levelMap.LookupWithDefault(Level.Error);
+      m_levelFatal = levelMap.LookupWithDefault(Level.Fatal);
+    }
 
-		#region Implementation of ILog
+    #region Implementation of ILog
 
-		/// <summary>
-		/// Logs a message object with the <c>DEBUG</c> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>DEBUG</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <c>DEBUG</c> level. If this logger is
-		/// <c>DEBUG</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para>
-		/// <b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Debug(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		public virtual void Debug(object message) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelDebug, message, null);
-		}
+    /// <summary>
+    /// Logs a message object with the <c>DEBUG</c> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>DEBUG</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <c>DEBUG</c> level. If this logger is
+    /// <c>DEBUG</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para>
+    /// <b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Debug(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    public virtual void Debug(object message)
+    {
+      Logger.Log(ThisDeclaringType, m_levelDebug, message, null);
+    }
 
-		/// <summary>
-		/// Logs a message object with the <c>DEBUG</c> level
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs a message object with the <c>DEBUG</c> level including
-		/// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> passed
-		/// as a parameter.
-		/// </para>
-		/// <para>
-		/// See the <see cref="M:Debug(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		public virtual void Debug(object message, Exception exception) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelDebug, message, exception);
-		}
+    /// <summary>
+    /// Logs a message object with the <c>DEBUG</c> level
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs a message object with the <c>DEBUG</c> level including
+    /// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> passed
+    /// as a parameter.
+    /// </para>
+    /// <para>
+    /// See the <see cref="M:Debug(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    public virtual void Debug(object message, Exception exception)
+    {
+      Logger.Log(ThisDeclaringType, m_levelDebug, message, exception);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>DEBUG</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void DebugFormat(string format, params object[] args) 
-		{
-			if (IsDebugEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>DEBUG</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void DebugFormat(string format, params object[] args)
+    {
+      if (IsDebugEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>DEBUG</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void DebugFormat(string format, object arg0) 
-		{
-			if (IsDebugEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>DEBUG</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void DebugFormat(string format, object arg0)
+    {
+      if (IsDebugEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>DEBUG</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void DebugFormat(string format, object arg0, object arg1) 
-		{
-			if (IsDebugEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>DEBUG</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void DebugFormat(string format, object arg0, object arg1)
+    {
+      if (IsDebugEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>DEBUG</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void DebugFormat(string format, object arg0, object arg1, object arg2) 
-		{
-			if (IsDebugEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>DEBUG</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:DebugFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void DebugFormat(string format, object arg0, object arg1, object arg2)
+    {
+      if (IsDebugEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>DEBUG</c> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void DebugFormat(IFormatProvider provider, string format, params object[] args) 
-		{
-			if (IsDebugEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(provider, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>DEBUG</c> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void DebugFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      if (IsDebugEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(provider, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a message object with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>INFO</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <c>INFO</c> level. If this logger is
-		/// <c>INFO</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para>
-		/// <b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Info(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		public virtual void Info(object message) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelInfo, message, null);
-		}
-  
-		/// <summary>
-		/// Logs a message object with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs a message object with the <c>INFO</c> level including
-		/// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
-		/// passed as a parameter.
-		/// </para>
-		/// <para>
-		/// See the <see cref="M:Info(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object)"/>
-		public virtual void Info(object message, Exception exception) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelInfo, message, exception);
-		}
+    /// <summary>
+    /// Logs a message object with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>INFO</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <c>INFO</c> level. If this logger is
+    /// <c>INFO</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para>
+    /// <b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Info(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    public virtual void Info(object message)
+    {
+      Logger.Log(ThisDeclaringType, m_levelInfo, message, null);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void InfoFormat(string format, params object[] args) 
-		{
-			if (IsInfoEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs a message object with the <c>INFO</c> level including
+    /// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
+    /// passed as a parameter.
+    /// </para>
+    /// <para>
+    /// See the <see cref="M:Info(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object)"/>
+    public virtual void Info(object message, Exception exception)
+    {
+      Logger.Log(ThisDeclaringType, m_levelInfo, message, exception);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void InfoFormat(string format, object arg0) 
-		{
-			if (IsInfoEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void InfoFormat(string format, params object[] args)
+    {
+      if (IsInfoEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void InfoFormat(string format, object arg0, object arg1) 
-		{
-			if (IsInfoEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void InfoFormat(string format, object arg0)
+    {
+      if (IsInfoEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void InfoFormat(string format, object arg0, object arg1, object arg2) 
-		{
-			if (IsInfoEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void InfoFormat(string format, object arg0, object arg1)
+    {
+      if (IsInfoEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>INFO</c> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void InfoFormat(IFormatProvider provider, string format, params object[] args) 
-		{
-			if (IsInfoEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(provider, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:InfoFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void InfoFormat(string format, object arg0, object arg1, object arg2)
+    {
+      if (IsInfoEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a message object with the <c>WARN</c> level.
-		/// </summary>
-		/// <param name="message">the message object to log</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>WARN</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <c>WARN</c> level. If this logger is
-		/// <c>WARN</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger and 
-		/// also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para>
-		/// <b>WARNING</b> Note that passing an <see cref="Exception"/> to this
-		/// method will print the name of the <see cref="Exception"/> but no
-		/// stack trace. To print a stack trace use the 
-		/// <see cref="M:Warn(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		public virtual void Warn(object message) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelWarn, message, null);
-		}
-  
-		/// <summary>
-		/// Logs a message object with the <c>WARN</c> level
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs a message object with the <c>WARN</c> level including
-		/// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
-		/// passed as a parameter.
-		/// </para>
-		/// <para>
-		/// See the <see cref="M:Warn(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object)"/>
-		public virtual void Warn(object message, Exception exception) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelWarn, message, exception);
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>INFO</c> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void InfoFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      if (IsInfoEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelInfo, new SystemStringFormat(provider, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>WARN</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void WarnFormat(string format, params object[] args) 
-		{
-			if (IsWarnEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>WARN</c> level.
+    /// </summary>
+    /// <param name="message">the message object to log</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>WARN</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <c>WARN</c> level. If this logger is
+    /// <c>WARN</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger and 
+    /// also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para>
+    /// <b>WARNING</b> Note that passing an <see cref="Exception"/> to this
+    /// method will print the name of the <see cref="Exception"/> but no
+    /// stack trace. To print a stack trace use the 
+    /// <see cref="M:Warn(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    public virtual void Warn(object message)
+    {
+      Logger.Log(ThisDeclaringType, m_levelWarn, message, null);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>WARN</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void WarnFormat(string format, object arg0) 
-		{
-			if (IsWarnEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>WARN</c> level
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs a message object with the <c>WARN</c> level including
+    /// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
+    /// passed as a parameter.
+    /// </para>
+    /// <para>
+    /// See the <see cref="M:Warn(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object)"/>
+    public virtual void Warn(object message, Exception exception)
+    {
+      Logger.Log(ThisDeclaringType, m_levelWarn, message, exception);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>WARN</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void WarnFormat(string format, object arg0, object arg1) 
-		{
-			if (IsWarnEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>WARN</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void WarnFormat(string format, params object[] args)
+    {
+      if (IsWarnEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>WARN</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void WarnFormat(string format, object arg0, object arg1, object arg2) 
-		{
-			if (IsWarnEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>WARN</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void WarnFormat(string format, object arg0)
+    {
+      if (IsWarnEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>WARN</c> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void WarnFormat(IFormatProvider provider, string format, params object[] args) 
-		{
-			if (IsWarnEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(provider, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>WARN</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void WarnFormat(string format, object arg0, object arg1)
+    {
+      if (IsWarnEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a message object with the <c>ERROR</c> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>ERROR</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <c>ERROR</c> level. If this logger is
-		/// <c>ERROR</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger and 
-		/// also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para>
-		/// <b>WARNING</b> Note that passing an <see cref="Exception"/> to this
-		/// method will print the name of the <see cref="Exception"/> but no
-		/// stack trace. To print a stack trace use the 
-		/// <see cref="M:Error(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		public virtual void Error(object message) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelError, message, null);
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>WARN</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:WarnFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void WarnFormat(string format, object arg0, object arg1, object arg2)
+    {
+      if (IsWarnEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a message object with the <c>ERROR</c> level
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs a message object with the <c>ERROR</c> level including
-		/// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
-		/// passed as a parameter.
-		/// </para>
-		/// <para>
-		/// See the <see cref="M:Error(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object)"/>
-		public virtual void Error(object message, Exception exception) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelError, message, exception);
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>WARN</c> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void WarnFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      if (IsWarnEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelWarn, new SystemStringFormat(provider, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>ERROR</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void ErrorFormat(string format, params object[] args) 
-		{
-			if (IsErrorEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>ERROR</c> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>ERROR</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <c>ERROR</c> level. If this logger is
+    /// <c>ERROR</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger and 
+    /// also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para>
+    /// <b>WARNING</b> Note that passing an <see cref="Exception"/> to this
+    /// method will print the name of the <see cref="Exception"/> but no
+    /// stack trace. To print a stack trace use the 
+    /// <see cref="M:Error(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    public virtual void Error(object message)
+    {
+      Logger.Log(ThisDeclaringType, m_levelError, message, null);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>ERROR</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void ErrorFormat(string format, object arg0) 
-		{
-			if (IsErrorEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>ERROR</c> level
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs a message object with the <c>ERROR</c> level including
+    /// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
+    /// passed as a parameter.
+    /// </para>
+    /// <para>
+    /// See the <see cref="M:Error(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object)"/>
+    public virtual void Error(object message, Exception exception)
+    {
+      Logger.Log(ThisDeclaringType, m_levelError, message, exception);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>ERROR</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void ErrorFormat(string format, object arg0, object arg1) 
-		{
-			if (IsErrorEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>ERROR</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void ErrorFormat(string format, params object[] args)
+    {
+      if (IsErrorEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>ERROR</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void ErrorFormat(string format, object arg0, object arg1, object arg2) 
-		{
-			if (IsErrorEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>ERROR</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void ErrorFormat(string format, object arg0)
+    {
+      if (IsErrorEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>ERROR</c> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void ErrorFormat(IFormatProvider provider, string format, params object[] args) 
-		{
-			if (IsErrorEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(provider, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>ERROR</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void ErrorFormat(string format, object arg0, object arg1)
+    {
+      if (IsErrorEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a message object with the <c>FATAL</c> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>FATAL</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <c>FATAL</c> level. If this logger is
-		/// <c>FATAL</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger and 
-		/// also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para>
-		/// <b>WARNING</b> Note that passing an <see cref="Exception"/> to this
-		/// method will print the name of the <see cref="Exception"/> but no
-		/// stack trace. To print a stack trace use the 
-		/// <see cref="M:Fatal(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		public virtual void Fatal(object message) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelFatal, message, null);
-		}
-  
-		/// <summary>
-		/// Logs a message object with the <c>FATAL</c> level
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs a message object with the <c>FATAL</c> level including
-		/// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
-		/// passed as a parameter.
-		/// </para>
-		/// <para>
-		/// See the <see cref="M:Fatal(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object)"/>
-		public virtual void Fatal(object message, Exception exception) 
-		{
-			Logger.Log(ThisDeclaringType, m_levelFatal, message, exception);
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>ERROR</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:ErrorFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void ErrorFormat(string format, object arg0, object arg1, object arg2)
+    {
+      if (IsErrorEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>FATAL</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void FatalFormat(string format, params object[] args) 
-		{
-			if (IsFatalEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>ERROR</c> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void ErrorFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      if (IsErrorEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelError, new SystemStringFormat(provider, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>FATAL</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void FatalFormat(string format, object arg0) 
-		{
-			if (IsFatalEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>FATAL</c> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>FATAL</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <c>FATAL</c> level. If this logger is
+    /// <c>FATAL</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger and 
+    /// also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para>
+    /// <b>WARNING</b> Note that passing an <see cref="Exception"/> to this
+    /// method will print the name of the <see cref="Exception"/> but no
+    /// stack trace. To print a stack trace use the 
+    /// <see cref="M:Fatal(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    public virtual void Fatal(object message)
+    {
+      Logger.Log(ThisDeclaringType, m_levelFatal, message, null);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>FATAL</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void FatalFormat(string format, object arg0, object arg1) 
-		{
-			if (IsFatalEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a message object with the <c>FATAL</c> level
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs a message object with the <c>FATAL</c> level including
+    /// the stack trace of the <see cref="Exception"/> <paramref name="exception"/> 
+    /// passed as a parameter.
+    /// </para>
+    /// <para>
+    /// See the <see cref="M:Fatal(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object)"/>
+    public virtual void Fatal(object message, Exception exception)
+    {
+      Logger.Log(ThisDeclaringType, m_levelFatal, message, exception);
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>FATAL</c> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
-		/// format provider. To specify a localized provider use the
-		/// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void FatalFormat(string format, object arg0, object arg1, object arg2) 
-		{
-			if (IsFatalEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>FATAL</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void FatalFormat(string format, params object[] args)
+    {
+      if (IsFatalEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <c>FATAL</c> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
-		/// <c>String.Format</c> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		public virtual void FatalFormat(IFormatProvider provider, string format, params object[] args) 
-		{
-			if (IsFatalEnabled)
-			{
-				Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(provider, format, args), null);
-			}
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>FATAL</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void FatalFormat(string format, object arg0)
+    {
+      if (IsFatalEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <c>DEBUG</c>
-		/// level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <c>DEBUG</c> events,
-		/// <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This function is intended to lessen the computational cost of
-		/// disabled log debug statements.
-		/// </para>
-		/// <para>
-		/// For some <c>log</c> Logger object, when you write:
-		/// </para>
-		/// <code lang="C#">
-		/// log.Debug("This is entry number: " + i );
-		/// </code>
-		/// <para>
-		/// You incur the cost constructing the message, concatenation in
-		/// this case, regardless of whether the message is logged or not.
-		/// </para>
-		/// <para>
-		/// If you are worried about speed, then you should write:
-		/// </para>
-		/// <code lang="C#">
-		/// if (log.IsDebugEnabled())
-		/// { 
-		///	 log.Debug("This is entry number: " + i );
-		/// }
-		/// </code>
-		/// <para>
-		/// This way you will not incur the cost of parameter
-		/// construction if debugging is disabled for <c>log</c>. On
-		/// the other hand, if the <c>log</c> is debug enabled, you
-		/// will incur the cost of evaluating whether the logger is debug
-		/// enabled twice. Once in <c>IsDebugEnabled</c> and once in
-		/// the <c>Debug</c>.  This is an insignificant overhead
-		/// since evaluating a logger takes about 1% of the time it
-		/// takes to actually log.
-		/// </para>
-		/// </remarks>
-		public virtual bool IsDebugEnabled
-		{
-			get { return Logger.IsEnabledFor(m_levelDebug); }
-		}
-  
-		/// <summary>
-		/// Checks if this logger is enabled for the <c>INFO</c> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <c>INFO</c> events,
-		/// <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="IsDebugEnabled"/> for more information and examples 
-		/// of using this method.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="LogImpl.IsDebugEnabled"/>
-		public virtual bool IsInfoEnabled
-		{
-			get { return Logger.IsEnabledFor(m_levelInfo); }
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>FATAL</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void FatalFormat(string format, object arg0, object arg1)
+    {
+      if (IsFatalEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <c>WARN</c> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <c>WARN</c> events,
-		/// <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="IsDebugEnabled"/> for more information and examples 
-		/// of using this method.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public virtual bool IsWarnEnabled
-		{
-			get { return Logger.IsEnabledFor(m_levelWarn); }
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>FATAL</c> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// The string is formatted using the <see cref="CultureInfo.InvariantCulture"/>
+    /// format provider. To specify a localized provider use the
+    /// <see cref="M:FatalFormat(IFormatProvider,string,object[])"/> method.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void FatalFormat(string format, object arg0, object arg1, object arg2)
+    {
+      if (IsFatalEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(CultureInfo.InvariantCulture, format, new object[] { arg0, arg1, arg2 }), null);
+      }
+    }
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <c>ERROR</c> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <c>ERROR</c> events,
-		/// <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="IsDebugEnabled"/> for more information and examples of using this method.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public virtual bool IsErrorEnabled
-		{
-			get { return Logger.IsEnabledFor(m_levelError); }
-		}
+    /// <summary>
+    /// Logs a formatted message string with the <c>FATAL</c> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <see cref="M:String.Format(IFormatProvider, string, object[])"/> method. See
+    /// <c>String.Format</c> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    public virtual void FatalFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      if (IsFatalEnabled)
+      {
+        Logger.Log(ThisDeclaringType, m_levelFatal, new SystemStringFormat(provider, format, args), null);
+      }
+    }
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <c>FATAL</c> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <c>FATAL</c> events,
-		/// <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="IsDebugEnabled"/> for more information and examples of using this method.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public virtual bool IsFatalEnabled
-		{
-			get { return Logger.IsEnabledFor(m_levelFatal); }
-		}
+    /// <summary>
+    /// Checks if this logger is enabled for the <c>DEBUG</c>
+    /// level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <c>DEBUG</c> events,
+    /// <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This function is intended to lessen the computational cost of
+    /// disabled log debug statements.
+    /// </para>
+    /// <para>
+    /// For some <c>log</c> Logger object, when you write:
+    /// </para>
+    /// <code lang="C#">
+    /// log.Debug("This is entry number: " + i );
+    /// </code>
+    /// <para>
+    /// You incur the cost constructing the message, concatenation in
+    /// this case, regardless of whether the message is logged or not.
+    /// </para>
+    /// <para>
+    /// If you are worried about speed, then you should write:
+    /// </para>
+    /// <code lang="C#">
+    /// if (log.IsDebugEnabled())
+    /// { 
+    ///   log.Debug("This is entry number: " + i );
+    /// }
+    /// </code>
+    /// <para>
+    /// This way you will not incur the cost of parameter
+    /// construction if debugging is disabled for <c>log</c>. On
+    /// the other hand, if the <c>log</c> is debug enabled, you
+    /// will incur the cost of evaluating whether the logger is debug
+    /// enabled twice. Once in <c>IsDebugEnabled</c> and once in
+    /// the <c>Debug</c>.  This is an insignificant overhead
+    /// since evaluating a logger takes about 1% of the time it
+    /// takes to actually log.
+    /// </para>
+    /// </remarks>
+    public virtual bool IsDebugEnabled
+    {
+      get { return Logger.IsEnabledFor(m_levelDebug); }
+    }
 
-		#endregion Implementation of ILog
+    /// <summary>
+    /// Checks if this logger is enabled for the <c>INFO</c> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <c>INFO</c> events,
+    /// <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="IsDebugEnabled"/> for more information and examples 
+    /// of using this method.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="LogImpl.IsDebugEnabled"/>
+    public virtual bool IsInfoEnabled
+    {
+      get { return Logger.IsEnabledFor(m_levelInfo); }
+    }
 
-		#region Private Methods
+    /// <summary>
+    /// Checks if this logger is enabled for the <c>WARN</c> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <c>WARN</c> events,
+    /// <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="IsDebugEnabled"/> for more information and examples 
+    /// of using this method.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public virtual bool IsWarnEnabled
+    {
+      get { return Logger.IsEnabledFor(m_levelWarn); }
+    }
 
-		/// <summary>
-		/// Event handler for the <see cref="log4net.Repository.ILoggerRepository.ConfigurationChanged"/> event
-		/// </summary>
-		/// <param name="sender">the repository</param>
-		/// <param name="e">Empty</param>
-		private void LoggerRepositoryConfigurationChanged(object sender, EventArgs e)
-		{
-			ILoggerRepository repository = sender as ILoggerRepository;
-			if (repository != null)
-			{
-				ReloadLevels(repository);
-			}
-		}
+    /// <summary>
+    /// Checks if this logger is enabled for the <c>ERROR</c> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <c>ERROR</c> events,
+    /// <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="IsDebugEnabled"/> for more information and examples of using this method.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public virtual bool IsErrorEnabled
+    {
+      get { return Logger.IsEnabledFor(m_levelError); }
+    }
 
-		#endregion
+    /// <summary>
+    /// Checks if this logger is enabled for the <c>FATAL</c> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <c>FATAL</c> events,
+    /// <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="IsDebugEnabled"/> for more information and examples of using this method.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public virtual bool IsFatalEnabled
+    {
+      get { return Logger.IsEnabledFor(m_levelFatal); }
+    }
 
-		#region Private Static Instance Fields
+    #endregion Implementation of ILog
 
-		/// <summary>
-		/// The fully qualified name of this declaring type not the type of any subclass.
-		/// </summary>
-		private static readonly Type ThisDeclaringType = typeof(LogImpl);
+    #region Private Methods
 
-		#endregion Private Static Instance Fields
+    /// <summary>
+    /// Event handler for the <see cref="log4net.Repository.ILoggerRepository.ConfigurationChanged"/> event
+    /// </summary>
+    /// <param name="sender">the repository</param>
+    /// <param name="e">Empty</param>
+    private void LoggerRepositoryConfigurationChanged(object sender, EventArgs e)
+    {
+      ILoggerRepository repository = sender as ILoggerRepository;
+      if (repository != null)
+      {
+        ReloadLevels(repository);
+      }
+    }
 
-		#region Private Fields
+    #endregion
 
-		private Level m_levelDebug;
-		private Level m_levelInfo;
-		private Level m_levelWarn;
-		private Level m_levelError;
-		private Level m_levelFatal;
+    #region Private Static Instance Fields
 
-		#endregion
-	}
+    /// <summary>
+    /// The fully qualified name of this declaring type not the type of any subclass.
+    /// </summary>
+    private static readonly Type ThisDeclaringType = typeof(LogImpl);
+
+    #endregion Private Static Instance Fields
+
+    #region Private Fields
+
+    private Level m_levelDebug;
+    private Level m_levelInfo;
+    private Level m_levelWarn;
+    private Level m_levelError;
+    private Level m_levelFatal;
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Core/LoggerManager.cs b/src/log4net/Core/LoggerManager.cs
index 98a2fe8..565cd6a 100644
--- a/src/log4net/Core/LoggerManager.cs
+++ b/src/log4net/Core/LoggerManager.cs
@@ -28,851 +28,851 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Static manager that controls the creation of repositories
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Static manager that controls the creation of repositories
-	/// </para>
-	/// <para>
-	/// This class is used by the wrapper managers (e.g. <see cref="log4net.LogManager"/>)
-	/// to provide access to the <see cref="ILogger"/> objects.
-	/// </para>
-	/// <para>
-	/// This manager also holds the <see cref="IRepositorySelector"/> that is used to
-	/// lookup and create repositories. The selector can be set either programmatically using
-	/// the <see cref="RepositorySelector"/> property, or by setting the <c>log4net.RepositorySelector</c>
-	/// AppSetting in the applications config file to the fully qualified type name of the
-	/// selector to use. 
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class LoggerManager
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// Static manager that controls the creation of repositories
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Static manager that controls the creation of repositories
+  /// </para>
+  /// <para>
+  /// This class is used by the wrapper managers (e.g. <see cref="log4net.LogManager"/>)
+  /// to provide access to the <see cref="ILogger"/> objects.
+  /// </para>
+  /// <para>
+  /// This manager also holds the <see cref="IRepositorySelector"/> that is used to
+  /// lookup and create repositories. The selector can be set either programmatically using
+  /// the <see cref="RepositorySelector"/> property, or by setting the <c>log4net.RepositorySelector</c>
+  /// AppSetting in the applications config file to the fully qualified type name of the
+  /// selector to use. 
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class LoggerManager
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private constructor to prevent instances. Only static methods should be used.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Private constructor to prevent instances. Only static methods should be used.
-		/// </para>
-		/// </remarks>
-		private LoggerManager() 
-		{
-		}
+    /// <summary>
+    /// Private constructor to prevent instances. Only static methods should be used.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Private constructor to prevent instances. Only static methods should be used.
+    /// </para>
+    /// </remarks>
+    private LoggerManager()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Static Constructor
+    #region Static Constructor
 
-		/// <summary>
-		/// Hook the shutdown event
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// On the full .NET runtime, the static constructor hooks up the 
-		/// <c>AppDomain.ProcessExit</c> and <c>AppDomain.DomainUnload</c>> events. 
-		/// These are used to shutdown the log4net system as the application exits.
-		/// </para>
-		/// </remarks>
-		static LoggerManager()
-		{
-			try
-			{
-				// Register the AppDomain events, note we have to do this with a
-				// method call rather than directly here because the AppDomain
-				// makes a LinkDemand which throws the exception during the JIT phase.
-				RegisterAppDomainEvents();
-			}
-			catch(System.Security.SecurityException)
-			{
-				LogLog.Debug(declaringType, "Security Exception (ControlAppDomain LinkDemand) while trying "+
-					"to register Shutdown handler with the AppDomain. LoggerManager.Shutdown() "+
-					"will not be called automatically when the AppDomain exits. It must be called "+
-					"programmatically.");
-			}
+    /// <summary>
+    /// Hook the shutdown event
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// On the full .NET runtime, the static constructor hooks up the 
+    /// <c>AppDomain.ProcessExit</c> and <c>AppDomain.DomainUnload</c>> events. 
+    /// These are used to shutdown the log4net system as the application exits.
+    /// </para>
+    /// </remarks>
+    static LoggerManager()
+    {
+      try
+      {
+        // Register the AppDomain events, note we have to do this with a
+        // method call rather than directly here because the AppDomain
+        // makes a LinkDemand which throws the exception during the JIT phase.
+        RegisterAppDomainEvents();
+      }
+      catch (System.Security.SecurityException)
+      {
+        LogLog.Debug(declaringType, "Security Exception (ControlAppDomain LinkDemand) while trying " +
+          "to register Shutdown handler with the AppDomain. LoggerManager.Shutdown() " +
+          "will not be called automatically when the AppDomain exits. It must be called " +
+          "programmatically.");
+      }
 
-			// Dump out our assembly version into the log if debug is enabled
-            LogLog.Debug(declaringType, GetVersionInfo());
+      // Dump out our assembly version into the log if debug is enabled
+      LogLog.Debug(declaringType, GetVersionInfo());
 
-			// Set the default repository selector
+      // Set the default repository selector
 #if NETCF
-			s_repositorySelector = new CompactRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
-			return;
+      s_repositorySelector = new CompactRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
+      return;
 #elif !NETSTANDARD1_3
-			// Look for the RepositorySelector type specified in the AppSettings 'log4net.RepositorySelector'
-			string appRepositorySelectorTypeName = SystemInfo.GetAppSetting("log4net.RepositorySelector");
-			if (appRepositorySelectorTypeName != null && appRepositorySelectorTypeName.Length > 0)
-			{
-				// Resolve the config string into a Type
-				Type appRepositorySelectorType = null;
-				try
-				{
-					appRepositorySelectorType = SystemInfo.GetTypeFromString(appRepositorySelectorTypeName, false, true);
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Exception while resolving RepositorySelector Type ["+appRepositorySelectorTypeName+"]", ex);
-				}
+      // Look for the RepositorySelector type specified in the AppSettings 'log4net.RepositorySelector'
+      string appRepositorySelectorTypeName = SystemInfo.GetAppSetting("log4net.RepositorySelector");
+      if (appRepositorySelectorTypeName != null && appRepositorySelectorTypeName.Length > 0)
+      {
+        // Resolve the config string into a Type
+        Type appRepositorySelectorType = null;
+        try
+        {
+          appRepositorySelectorType = SystemInfo.GetTypeFromString(appRepositorySelectorTypeName, false, true);
+        }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Exception while resolving RepositorySelector Type [" + appRepositorySelectorTypeName + "]", ex);
+        }
 
-				if (appRepositorySelectorType != null)
-				{
-					// Create an instance of the RepositorySelectorType
-					object appRepositorySelectorObj = null;
-					try
-					{
-						appRepositorySelectorObj = Activator.CreateInstance(appRepositorySelectorType);
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Exception while creating RepositorySelector ["+appRepositorySelectorType.FullName+"]", ex);
-					}
+        if (appRepositorySelectorType != null)
+        {
+          // Create an instance of the RepositorySelectorType
+          object appRepositorySelectorObj = null;
+          try
+          {
+            appRepositorySelectorObj = Activator.CreateInstance(appRepositorySelectorType);
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "Exception while creating RepositorySelector [" + appRepositorySelectorType.FullName + "]", ex);
+          }
 
-					if (appRepositorySelectorObj != null && appRepositorySelectorObj is IRepositorySelector)
-					{
-						s_repositorySelector = (IRepositorySelector)appRepositorySelectorObj;
-					}
-					else
-					{
-						LogLog.Error(declaringType, "RepositorySelector Type ["+appRepositorySelectorType.FullName+"] is not an IRepositorySelector");
-					}
-				}
-			}
+          if (appRepositorySelectorObj != null && appRepositorySelectorObj is IRepositorySelector)
+          {
+            s_repositorySelector = (IRepositorySelector)appRepositorySelectorObj;
+          }
+          else
+          {
+            LogLog.Error(declaringType, "RepositorySelector Type [" + appRepositorySelectorType.FullName + "] is not an IRepositorySelector");
+          }
+        }
+      }
 #endif
-			// Create the DefaultRepositorySelector if not configured above 
-			if (s_repositorySelector == null)
-			{
-				s_repositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
-			}
-		}
+      // Create the DefaultRepositorySelector if not configured above 
+      if (s_repositorySelector == null)
+      {
+        s_repositorySelector = new DefaultRepositorySelector(typeof(log4net.Repository.Hierarchy.Hierarchy));
+      }
+    }
 
-		/// <summary>
-		/// Register for ProcessExit and DomainUnload events on the AppDomain
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This needs to be in a separate method because the events make
-		/// a LinkDemand for the ControlAppDomain SecurityPermission. Because
-		/// this is a LinkDemand it is demanded at JIT time. Therefore we cannot
-		/// catch the exception in the method itself, we have to catch it in the
-		/// caller.
-		/// </para>
-		/// </remarks>
-		private static void RegisterAppDomainEvents()
-		{
+    /// <summary>
+    /// Register for ProcessExit and DomainUnload events on the AppDomain
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This needs to be in a separate method because the events make
+    /// a LinkDemand for the ControlAppDomain SecurityPermission. Because
+    /// this is a LinkDemand it is demanded at JIT time. Therefore we cannot
+    /// catch the exception in the method itself, we have to catch it in the
+    /// caller.
+    /// </para>
+    /// </remarks>
+    private static void RegisterAppDomainEvents()
+    {
 #if !NETCF && !NETSTANDARD1_3
-			// ProcessExit seems to be fired if we are part of the default domain
-			AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
+      // ProcessExit seems to be fired if we are part of the default domain
+      AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnProcessExit);
 
-			// Otherwise DomainUnload is fired
-			AppDomain.CurrentDomain.DomainUnload += new EventHandler(OnDomainUnload);
+      // Otherwise DomainUnload is fired
+      AppDomain.CurrentDomain.DomainUnload += new EventHandler(OnDomainUnload);
 #endif
-		}
+    }
 
-		#endregion Static Constructor
+    #endregion Static Constructor
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Return the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <param name="repository">the repository to lookup in</param>
-		/// <returns>Return the default <see cref="ILoggerRepository"/> instance</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the <paramref name="repository"/> argument.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use GetRepository instead of GetLoggerRepository")]
-		public static ILoggerRepository GetLoggerRepository(string repository)
-		{
-			return GetRepository(repository);
-		}
+    /// <summary>
+    /// Return the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <param name="repository">the repository to lookup in</param>
+    /// <returns>Return the default <see cref="ILoggerRepository"/> instance</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the <paramref name="repository"/> argument.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use GetRepository instead of GetLoggerRepository")]
+    public static ILoggerRepository GetLoggerRepository(string repository)
+    {
+      return GetRepository(repository);
+    }
 
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
-		[Obsolete("Use GetRepository instead of GetLoggerRepository")]
-		public static ILoggerRepository GetLoggerRepository(Assembly repositoryAssembly)
-		{
-			return GetRepository(repositoryAssembly);
-		}
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
+    [Obsolete("Use GetRepository instead of GetLoggerRepository")]
+    public static ILoggerRepository GetLoggerRepository(Assembly repositoryAssembly)
+    {
+      return GetRepository(repositoryAssembly);
+    }
 
-		/// <summary>
-		/// Return the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <param name="repository">the repository to lookup in</param>
-		/// <returns>Return the default <see cref="ILoggerRepository"/> instance</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the <paramref name="repository"/> argument.
-		/// </para>
-		/// </remarks>
-		public static ILoggerRepository GetRepository(string repository)
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			return RepositorySelector.GetRepository(repository);
-		}
+    /// <summary>
+    /// Return the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <param name="repository">the repository to lookup in</param>
+    /// <returns>Return the default <see cref="ILoggerRepository"/> instance</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the <paramref name="repository"/> argument.
+    /// </para>
+    /// </remarks>
+    public static ILoggerRepository GetRepository(string repository)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      return RepositorySelector.GetRepository(repository);
+    }
 
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </para>
-		/// </remarks>
-		public static ILoggerRepository GetRepository(Assembly repositoryAssembly)
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			return RepositorySelector.GetRepository(repositoryAssembly);
-		}
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </para>
+    /// </remarks>
+    public static ILoggerRepository GetRepository(Assembly repositoryAssembly)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      return RepositorySelector.GetRepository(repositoryAssembly);
+    }
 
-		/// <summary>
-		/// Returns the named logger if it exists.
-		/// </summary>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <param name="name">The fully qualified logger name to look for.</param>
-		/// <returns>
-		/// The logger found, or <c>null</c> if the named logger does not exist in the
-		/// specified repository.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// If the named logger exists (in the specified repository) then it
-		/// returns a reference to the logger, otherwise it returns
-		/// <c>null</c>.
-		/// </para>
-		/// </remarks>
-		public static ILogger Exists(string repository, string name) 
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-			return RepositorySelector.GetRepository(repository).Exists(name);
-		}
+    /// <summary>
+    /// Returns the named logger if it exists.
+    /// </summary>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <param name="name">The fully qualified logger name to look for.</param>
+    /// <returns>
+    /// The logger found, or <c>null</c> if the named logger does not exist in the
+    /// specified repository.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// If the named logger exists (in the specified repository) then it
+    /// returns a reference to the logger, otherwise it returns
+    /// <c>null</c>.
+    /// </para>
+    /// </remarks>
+    public static ILogger Exists(string repository, string name)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+      return RepositorySelector.GetRepository(repository).Exists(name);
+    }
 
-		/// <summary>
-		/// Returns the named logger if it exists.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <param name="name">The fully qualified logger name to look for.</param>
-		/// <returns>
-		/// The logger found, or <c>null</c> if the named logger does not exist in the
-		/// specified assembly's repository.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// If the named logger exists (in the specified assembly's repository) then it
-		/// returns a reference to the logger, otherwise it returns
-		/// <c>null</c>.
-		/// </para>
-		/// </remarks>
-		public static ILogger Exists(Assembly repositoryAssembly, string name) 
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-			return RepositorySelector.GetRepository(repositoryAssembly).Exists(name);
-		}
+    /// <summary>
+    /// Returns the named logger if it exists.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <param name="name">The fully qualified logger name to look for.</param>
+    /// <returns>
+    /// The logger found, or <c>null</c> if the named logger does not exist in the
+    /// specified assembly's repository.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// If the named logger exists (in the specified assembly's repository) then it
+    /// returns a reference to the logger, otherwise it returns
+    /// <c>null</c>.
+    /// </para>
+    /// </remarks>
+    public static ILogger Exists(Assembly repositoryAssembly, string name)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+      return RepositorySelector.GetRepository(repositoryAssembly).Exists(name);
+    }
 
-		/// <summary>
-		/// Returns all the currently defined loggers in the specified repository.
-		/// </summary>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <returns>All the defined loggers.</returns>
-		/// <remarks>
-		/// <para>
-		/// The root logger is <b>not</b> included in the returned array.
-		/// </para>
-		/// </remarks>
-		public static ILogger[] GetCurrentLoggers(string repository)
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			return RepositorySelector.GetRepository(repository).GetCurrentLoggers();
-		}
+    /// <summary>
+    /// Returns all the currently defined loggers in the specified repository.
+    /// </summary>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <returns>All the defined loggers.</returns>
+    /// <remarks>
+    /// <para>
+    /// The root logger is <b>not</b> included in the returned array.
+    /// </para>
+    /// </remarks>
+    public static ILogger[] GetCurrentLoggers(string repository)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      return RepositorySelector.GetRepository(repository).GetCurrentLoggers();
+    }
 
-		/// <summary>
-		/// Returns all the currently defined loggers in the specified assembly's repository.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <returns>All the defined loggers.</returns>
-		/// <remarks>
-		/// <para>
-		/// The root logger is <b>not</b> included in the returned array.
-		/// </para>
-		/// </remarks>
-		public static ILogger[] GetCurrentLoggers(Assembly repositoryAssembly)
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			return RepositorySelector.GetRepository(repositoryAssembly).GetCurrentLoggers();
-		}
+    /// <summary>
+    /// Returns all the currently defined loggers in the specified assembly's repository.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <returns>All the defined loggers.</returns>
+    /// <remarks>
+    /// <para>
+    /// The root logger is <b>not</b> included in the returned array.
+    /// </para>
+    /// </remarks>
+    public static ILogger[] GetCurrentLoggers(Assembly repositoryAssembly)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      return RepositorySelector.GetRepository(repositoryAssembly).GetCurrentLoggers();
+    }
 
-		/// <summary>
-		/// Retrieves or creates a named logger.
-		/// </summary>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <param name="name">The name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		/// <remarks>
-		/// <para>
-		/// Retrieves a logger named as the <paramref name="name"/>
-		/// parameter. If the named logger already exists, then the
-		/// existing instance will be returned. Otherwise, a new instance is
-		/// created.
-		/// </para>
-		/// <para>
-		/// By default, loggers do not have a set level but inherit
-		/// it from the hierarchy. This is one of the central features of
-		/// log4net.
-		/// </para>
-		/// </remarks>
-		public static ILogger GetLogger(string repository, string name)
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-			return RepositorySelector.GetRepository(repository).GetLogger(name);
-		}
+    /// <summary>
+    /// Retrieves or creates a named logger.
+    /// </summary>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <param name="name">The name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    /// <remarks>
+    /// <para>
+    /// Retrieves a logger named as the <paramref name="name"/>
+    /// parameter. If the named logger already exists, then the
+    /// existing instance will be returned. Otherwise, a new instance is
+    /// created.
+    /// </para>
+    /// <para>
+    /// By default, loggers do not have a set level but inherit
+    /// it from the hierarchy. This is one of the central features of
+    /// log4net.
+    /// </para>
+    /// </remarks>
+    public static ILogger GetLogger(string repository, string name)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+      return RepositorySelector.GetRepository(repository).GetLogger(name);
+    }
 
-		/// <summary>
-		/// Retrieves or creates a named logger.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <param name="name">The name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		/// <remarks>
-		/// <para>
-		/// Retrieves a logger named as the <paramref name="name"/>
-		/// parameter. If the named logger already exists, then the
-		/// existing instance will be returned. Otherwise, a new instance is
-		/// created.
-		/// </para>
-		/// <para>
-		/// By default, loggers do not have a set level but inherit
-		/// it from the hierarchy. This is one of the central features of
-		/// log4net.
-		/// </para>
-		/// </remarks>
-		public static ILogger GetLogger(Assembly repositoryAssembly, string name)
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-			return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(name);
-		}	
+    /// <summary>
+    /// Retrieves or creates a named logger.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <param name="name">The name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    /// <remarks>
+    /// <para>
+    /// Retrieves a logger named as the <paramref name="name"/>
+    /// parameter. If the named logger already exists, then the
+    /// existing instance will be returned. Otherwise, a new instance is
+    /// created.
+    /// </para>
+    /// <para>
+    /// By default, loggers do not have a set level but inherit
+    /// it from the hierarchy. This is one of the central features of
+    /// log4net.
+    /// </para>
+    /// </remarks>
+    public static ILogger GetLogger(Assembly repositoryAssembly, string name)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+      return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(name);
+    }
 
-		/// <summary>
-		/// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
-		/// </summary>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <param name="type">The <paramref name="type"/> of which the fullname will be used as the name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the logger for the fully qualified name of the type specified.
-		/// </para>
-		/// </remarks>
-		public static ILogger GetLogger(string repository, Type type) 
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			if (type == null)
-			{
-				throw new ArgumentNullException("type");
-			}
-			return RepositorySelector.GetRepository(repository).GetLogger(type.FullName);
-		}
+    /// <summary>
+    /// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
+    /// </summary>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <param name="type">The <paramref name="type"/> of which the fullname will be used as the name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the logger for the fully qualified name of the type specified.
+    /// </para>
+    /// </remarks>
+    public static ILogger GetLogger(string repository, Type type)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      if (type == null)
+      {
+        throw new ArgumentNullException("type");
+      }
+      return RepositorySelector.GetRepository(repository).GetLogger(type.FullName);
+    }
 
-		/// <summary>
-		/// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
-		/// </summary>
-		/// <param name="repositoryAssembly">the assembly to use to lookup the repository</param>
-		/// <param name="type">The <paramref name="type"/> of which the fullname will be used as the name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the logger for the fully qualified name of the type specified.
-		/// </para>
-		/// </remarks>
-		public static ILogger GetLogger(Assembly repositoryAssembly, Type type) 
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			if (type == null)
-			{
-				throw new ArgumentNullException("type");
-			}
-			return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(type.FullName);
-		}	
+    /// <summary>
+    /// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
+    /// </summary>
+    /// <param name="repositoryAssembly">the assembly to use to lookup the repository</param>
+    /// <param name="type">The <paramref name="type"/> of which the fullname will be used as the name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the logger for the fully qualified name of the type specified.
+    /// </para>
+    /// </remarks>
+    public static ILogger GetLogger(Assembly repositoryAssembly, Type type)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      if (type == null)
+      {
+        throw new ArgumentNullException("type");
+      }
+      return RepositorySelector.GetRepository(repositoryAssembly).GetLogger(type.FullName);
+    }
 
-		/// <summary>
-		/// Shuts down the log4net system.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in all the
-		/// default repositories.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>
-		/// The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		public static void Shutdown() 
-		{
-			foreach(ILoggerRepository repository in GetAllRepositories())
-			{
-				repository.Shutdown();
-			}
-		}
+    /// <summary>
+    /// Shuts down the log4net system.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in all the
+    /// default repositories.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>
+    /// The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    public static void Shutdown()
+    {
+      foreach (ILoggerRepository repository in GetAllRepositories())
+      {
+        repository.Shutdown();
+      }
+    }
 
-		/// <summary>
-		/// Shuts down the repository for the repository specified.
-		/// </summary>
-		/// <param name="repository">The repository to shutdown.</param>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in the
-		/// repository for the <paramref name="repository"/> specified.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>
-		/// The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		public static void ShutdownRepository(string repository) 
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			RepositorySelector.GetRepository(repository).Shutdown();
-		}
+    /// <summary>
+    /// Shuts down the repository for the repository specified.
+    /// </summary>
+    /// <param name="repository">The repository to shutdown.</param>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in the
+    /// repository for the <paramref name="repository"/> specified.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>
+    /// The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    public static void ShutdownRepository(string repository)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      RepositorySelector.GetRepository(repository).Shutdown();
+    }
 
-		/// <summary>
-		/// Shuts down the repository for the repository specified.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in the
-		/// repository for the repository. The repository is looked up using
-		/// the <paramref name="repositoryAssembly"/> specified.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>
-		/// The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		public static void ShutdownRepository(Assembly repositoryAssembly) 
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			RepositorySelector.GetRepository(repositoryAssembly).Shutdown();
-		}
+    /// <summary>
+    /// Shuts down the repository for the repository specified.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in the
+    /// repository for the repository. The repository is looked up using
+    /// the <paramref name="repositoryAssembly"/> specified.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>
+    /// The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    public static void ShutdownRepository(Assembly repositoryAssembly)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      RepositorySelector.GetRepository(repositoryAssembly).Shutdown();
+    }
 
-		/// <summary>
-		/// Resets all values contained in this repository instance to their defaults.
-		/// </summary>
-		/// <param name="repository">The repository to reset.</param>
-		/// <remarks>
-		/// <para>
-		/// Resets all values contained in the repository instance to their
-		/// defaults.  This removes all appenders from all loggers, sets
-		/// the level of all non-root loggers to <c>null</c>,
-		/// sets their additivity flag to <c>true</c> and sets the level
-		/// of the root logger to <see cref="Level.Debug"/>. Moreover,
-		/// message disabling is set its default "off" value.
-		/// </para>		
-		/// </remarks>
-		public static void ResetConfiguration(string repository) 
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			RepositorySelector.GetRepository(repository).ResetConfiguration();
-		}
+    /// <summary>
+    /// Resets all values contained in this repository instance to their defaults.
+    /// </summary>
+    /// <param name="repository">The repository to reset.</param>
+    /// <remarks>
+    /// <para>
+    /// Resets all values contained in the repository instance to their
+    /// defaults.  This removes all appenders from all loggers, sets
+    /// the level of all non-root loggers to <c>null</c>,
+    /// sets their additivity flag to <c>true</c> and sets the level
+    /// of the root logger to <see cref="Level.Debug"/>. Moreover,
+    /// message disabling is set its default "off" value.
+    /// </para>    
+    /// </remarks>
+    public static void ResetConfiguration(string repository)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      RepositorySelector.GetRepository(repository).ResetConfiguration();
+    }
 
-		/// <summary>
-		/// Resets all values contained in this repository instance to their defaults.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository to reset.</param>
-		/// <remarks>
-		/// <para>
-		/// Resets all values contained in the repository instance to their
-		/// defaults.  This removes all appenders from all loggers, sets
-		/// the level of all non-root loggers to <c>null</c>,
-		/// sets their additivity flag to <c>true</c> and sets the level
-		/// of the root logger to <see cref="Level.Debug"/>. Moreover,
-		/// message disabling is set its default "off" value.
-		/// </para>		
-		/// </remarks>
-		public static void ResetConfiguration(Assembly repositoryAssembly) 
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			RepositorySelector.GetRepository(repositoryAssembly).ResetConfiguration();
-		}
+    /// <summary>
+    /// Resets all values contained in this repository instance to their defaults.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository to reset.</param>
+    /// <remarks>
+    /// <para>
+    /// Resets all values contained in the repository instance to their
+    /// defaults.  This removes all appenders from all loggers, sets
+    /// the level of all non-root loggers to <c>null</c>,
+    /// sets their additivity flag to <c>true</c> and sets the level
+    /// of the root logger to <see cref="Level.Debug"/>. Moreover,
+    /// message disabling is set its default "off" value.
+    /// </para>    
+    /// </remarks>
+    public static void ResetConfiguration(Assembly repositoryAssembly)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      RepositorySelector.GetRepository(repositoryAssembly).ResetConfiguration();
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name.
-		/// </summary>
-		/// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// Creates the default type of <see cref="ILoggerRepository"/> which is a
-		/// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
-		/// </para>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An <see cref="Exception"/> will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(string repository)
-		{
-			return CreateRepository(repository);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name.
+    /// </summary>
+    /// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// Creates the default type of <see cref="ILoggerRepository"/> which is a
+    /// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
+    /// </para>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An <see cref="Exception"/> will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(string repository)
+    {
+      return CreateRepository(repository);
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name.
-		/// </summary>
-		/// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// Creates the default type of <see cref="ILoggerRepository"/> which is a
-		/// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
-		/// </para>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An <see cref="Exception"/> will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		public static ILoggerRepository CreateRepository(string repository)
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			return RepositorySelector.CreateRepository(repository, null);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name.
+    /// </summary>
+    /// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// Creates the default type of <see cref="ILoggerRepository"/> which is a
+    /// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
+    /// </para>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An <see cref="Exception"/> will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    public static ILoggerRepository CreateRepository(string repository)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      return RepositorySelector.CreateRepository(repository, null);
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name and repository type.
-		/// </summary>
-		/// <param name="repository">The name of the repository, this must be unique to the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An Exception will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(string repository, Type repositoryType)
-		{
-			return CreateRepository(repository, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name and repository type.
+    /// </summary>
+    /// <param name="repository">The name of the repository, this must be unique to the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An Exception will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(string repository, Type repositoryType)
+    {
+      return CreateRepository(repository, repositoryType);
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name and repository type.
-		/// </summary>
-		/// <param name="repository">The name of the repository, this must be unique to the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An Exception will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		public static ILoggerRepository CreateRepository(string repository, Type repositoryType)
-		{
-			if (repository == null)
-			{
-				throw new ArgumentNullException("repository");
-			}
-			if (repositoryType == null)
-			{
-				throw new ArgumentNullException("repositoryType");
-			}
-			return RepositorySelector.CreateRepository(repository, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name and repository type.
+    /// </summary>
+    /// <param name="repository">The name of the repository, this must be unique to the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An Exception will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    public static ILoggerRepository CreateRepository(string repository, Type repositoryType)
+    {
+      if (repository == null)
+      {
+        throw new ArgumentNullException("repository");
+      }
+      if (repositoryType == null)
+      {
+        throw new ArgumentNullException("repositoryType");
+      }
+      return RepositorySelector.CreateRepository(repository, repositoryType);
+    }
 
-		/// <summary>
-		/// Creates a repository for the specified assembly and repository type.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(Assembly repositoryAssembly, Type repositoryType)
-		{
-			return CreateRepository(repositoryAssembly, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository for the specified assembly and repository type.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(Assembly repositoryAssembly, Type repositoryType)
+    {
+      return CreateRepository(repositoryAssembly, repositoryType);
+    }
 
-		/// <summary>
-		/// Creates a repository for the specified assembly and repository type.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// </remarks>
-		public static ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType)
-		{
-			if (repositoryAssembly == null)
-			{
-				throw new ArgumentNullException("repositoryAssembly");
-			}
-			if (repositoryType == null)
-			{
-				throw new ArgumentNullException("repositoryType");
-			}
-			return RepositorySelector.CreateRepository(repositoryAssembly, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository for the specified assembly and repository type.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// </remarks>
+    public static ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType)
+    {
+      if (repositoryAssembly == null)
+      {
+        throw new ArgumentNullException("repositoryAssembly");
+      }
+      if (repositoryType == null)
+      {
+        throw new ArgumentNullException("repositoryType");
+      }
+      return RepositorySelector.CreateRepository(repositoryAssembly, repositoryType);
+    }
 
-		/// <summary>
-		/// Gets an array of all currently defined repositories.
-		/// </summary>
-		/// <returns>An array of all the known <see cref="ILoggerRepository"/> objects.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets an array of all currently defined repositories.
-		/// </para>
-		/// </remarks>
-		public static ILoggerRepository[] GetAllRepositories()
-		{
-			return RepositorySelector.GetAllRepositories();
-		}
+    /// <summary>
+    /// Gets an array of all currently defined repositories.
+    /// </summary>
+    /// <returns>An array of all the known <see cref="ILoggerRepository"/> objects.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets an array of all currently defined repositories.
+    /// </para>
+    /// </remarks>
+    public static ILoggerRepository[] GetAllRepositories()
+    {
+      return RepositorySelector.GetAllRepositories();
+    }
 
-		/// <summary>
-		/// Gets or sets the repository selector used by the <see cref="LogManager" />.
-		/// </summary>
-		/// <value>
-		/// The repository selector used by the <see cref="LogManager" />.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The repository selector (<see cref="IRepositorySelector"/>) is used by 
-		/// the <see cref="LogManager"/> to create and select repositories 
-		/// (<see cref="ILoggerRepository"/>).
-		/// </para>
-		/// <para>
-		/// The caller to <see cref="LogManager"/> supplies either a string name 
-		/// or an assembly (if not supplied the assembly is inferred using 
-		/// <see cref="M:Assembly.GetCallingAssembly()"/>).
-		/// </para>
-		/// <para>
-		/// This context is used by the selector to lookup a specific repository.
-		/// </para>
-		/// <para>
-		/// For the full .NET Framework, the default repository is <c>DefaultRepositorySelector</c>;
-		/// for the .NET Compact Framework <c>CompactRepositorySelector</c> is the default
-		/// repository.
-		/// </para>
-		/// </remarks>
-		public static IRepositorySelector RepositorySelector
-		{
-			get { return s_repositorySelector; }
-			set { s_repositorySelector = value; }
-		}
+    /// <summary>
+    /// Gets or sets the repository selector used by the <see cref="LogManager" />.
+    /// </summary>
+    /// <value>
+    /// The repository selector used by the <see cref="LogManager" />.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The repository selector (<see cref="IRepositorySelector"/>) is used by 
+    /// the <see cref="LogManager"/> to create and select repositories 
+    /// (<see cref="ILoggerRepository"/>).
+    /// </para>
+    /// <para>
+    /// The caller to <see cref="LogManager"/> supplies either a string name 
+    /// or an assembly (if not supplied the assembly is inferred using 
+    /// <see cref="M:Assembly.GetCallingAssembly()"/>).
+    /// </para>
+    /// <para>
+    /// This context is used by the selector to lookup a specific repository.
+    /// </para>
+    /// <para>
+    /// For the full .NET Framework, the default repository is <c>DefaultRepositorySelector</c>;
+    /// for the .NET Compact Framework <c>CompactRepositorySelector</c> is the default
+    /// repository.
+    /// </para>
+    /// </remarks>
+    public static IRepositorySelector RepositorySelector
+    {
+      get { return s_repositorySelector; }
+      set { s_repositorySelector = value; }
+    }
 
-		#endregion Public Static Methods
+    #endregion Public Static Methods
 
-		#region Private Static Methods
+    #region Private Static Methods
 
-		/// <summary>
-		/// Internal method to get pertinent version info.
-		/// </summary>
-		/// <returns>A string of version info.</returns>
-		private static string GetVersionInfo()
-		{
-			System.Text.StringBuilder sb = new System.Text.StringBuilder();
+    /// <summary>
+    /// Internal method to get pertinent version info.
+    /// </summary>
+    /// <returns>A string of version info.</returns>
+    private static string GetVersionInfo()
+    {
+      System.Text.StringBuilder sb = new System.Text.StringBuilder();
 
 #if NETSTANDARD1_3
-			Assembly myAssembly = typeof(LoggerManager).GetTypeInfo().Assembly;
-			sb.Append($"log4net assembly [{myAssembly.FullName}]. ");
-			//sb.Append($"Loaded from [{myAssembly.Location}]. "); // TODO Assembly.Location available in netstandard1.5
-			sb.Append($"(.NET Framework [{RuntimeInformation.FrameworkDescription}] on {RuntimeInformation.OSDescription}");
+      Assembly myAssembly = typeof(LoggerManager).GetTypeInfo().Assembly;
+      sb.Append($"log4net assembly [{myAssembly.FullName}]. ");
+      //sb.Append($"Loaded from [{myAssembly.Location}]. "); // TODO Assembly.Location available in netstandard1.5
+      sb.Append($"(.NET Framework [{RuntimeInformation.FrameworkDescription}] on {RuntimeInformation.OSDescription}");
 #else
-			Assembly myAssembly = Assembly.GetExecutingAssembly();
-			sb.Append("log4net assembly [").Append(myAssembly.FullName).Append("]. ");
-			sb.Append("Loaded from [").Append(SystemInfo.AssemblyLocationInfo(myAssembly)).Append("]. ");
-			sb.Append("(.NET Runtime [").Append(Environment.Version.ToString()).Append("]");
+      Assembly myAssembly = Assembly.GetExecutingAssembly();
+      sb.Append("log4net assembly [").Append(myAssembly.FullName).Append("]. ");
+      sb.Append("Loaded from [").Append(SystemInfo.AssemblyLocationInfo(myAssembly)).Append("]. ");
+      sb.Append("(.NET Runtime [").Append(Environment.Version.ToString()).Append("]");
 #if (!SSCLI)
-            sb.Append(" on ").Append(Environment.OSVersion.ToString());
+      sb.Append(" on ").Append(Environment.OSVersion.ToString());
 #endif
 #endif // NETSTANDARD1_3
-			sb.Append(")");
-			return sb.ToString();
-		}
+      sb.Append(")");
+      return sb.ToString();
+    }
 
 #if (!NETCF)
-		/// <summary>
-		/// Called when the <see cref="AppDomain.DomainUnload"/> event fires
-		/// </summary>
-		/// <param name="sender">the <see cref="AppDomain"/> that is exiting</param>
-		/// <param name="e">null</param>
-		/// <remarks>
-		/// <para>
-		/// Called when the <see cref="AppDomain.DomainUnload"/> event fires.
-		/// </para>
-		/// <para>
-		/// When the event is triggered the log4net system is <see cref="M:Shutdown()"/>.
-		/// </para>
-		/// </remarks>
-		private static void OnDomainUnload(object sender, EventArgs e)
-		{
-			Shutdown();
-		}
+    /// <summary>
+    /// Called when the <see cref="AppDomain.DomainUnload"/> event fires
+    /// </summary>
+    /// <param name="sender">the <see cref="AppDomain"/> that is exiting</param>
+    /// <param name="e">null</param>
+    /// <remarks>
+    /// <para>
+    /// Called when the <see cref="AppDomain.DomainUnload"/> event fires.
+    /// </para>
+    /// <para>
+    /// When the event is triggered the log4net system is <see cref="M:Shutdown()"/>.
+    /// </para>
+    /// </remarks>
+    private static void OnDomainUnload(object sender, EventArgs e)
+    {
+      Shutdown();
+    }
 
-		/// <summary>
-		/// Called when the <see cref="AppDomain.ProcessExit"/> event fires
-		/// </summary>
-		/// <param name="sender">the <see cref="AppDomain"/> that is exiting</param>
-		/// <param name="e">null</param>
-		/// <remarks>
-		/// <para>
-		/// Called when the <see cref="AppDomain.ProcessExit"/> event fires.
-		/// </para>
-		/// <para>
-		/// When the event is triggered the log4net system is <see cref="M:Shutdown()"/>.
-		/// </para>
-		/// </remarks>
-		private static void OnProcessExit(object sender, EventArgs e)
-		{
-			Shutdown();
-		}
+    /// <summary>
+    /// Called when the <see cref="AppDomain.ProcessExit"/> event fires
+    /// </summary>
+    /// <param name="sender">the <see cref="AppDomain"/> that is exiting</param>
+    /// <param name="e">null</param>
+    /// <remarks>
+    /// <para>
+    /// Called when the <see cref="AppDomain.ProcessExit"/> event fires.
+    /// </para>
+    /// <para>
+    /// When the event is triggered the log4net system is <see cref="M:Shutdown()"/>.
+    /// </para>
+    /// </remarks>
+    private static void OnProcessExit(object sender, EventArgs e)
+    {
+      Shutdown();
+    }
 #endif
 
-		#endregion Private Static Methods
+    #endregion Private Static Methods
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the LoggerManager class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(LoggerManager);
+    /// <summary>
+    /// The fully qualified type of the LoggerManager class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(LoggerManager);
 
-		/// <summary>
-		/// Initialize the default repository selector
-		/// </summary>
-		private static IRepositorySelector s_repositorySelector;
+    /// <summary>
+    /// Initialize the default repository selector
+    /// </summary>
+    private static IRepositorySelector s_repositorySelector;
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Core/LoggerWrapperImpl.cs b/src/log4net/Core/LoggerWrapperImpl.cs
index 26f016d..61e19eb 100644
--- a/src/log4net/Core/LoggerWrapperImpl.cs
+++ b/src/log4net/Core/LoggerWrapperImpl.cs
@@ -19,68 +19,68 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// Implementation of the <see cref="ILoggerWrapper"/> interface.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class should be used as the base for all wrapper implementations.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class LoggerWrapperImpl : ILoggerWrapper
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Implementation of the <see cref="ILoggerWrapper"/> interface.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class should be used as the base for all wrapper implementations.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class LoggerWrapperImpl : ILoggerWrapper
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Constructs a new wrapper for the specified logger.
-		/// </summary>
-		/// <param name="logger">The logger to wrap.</param>
-		/// <remarks>
-		/// <para>
-		/// Constructs a new wrapper for the specified logger.
-		/// </para>
-		/// </remarks>
-		protected LoggerWrapperImpl(ILogger logger) 
-		{
-			m_logger = logger;
-		}
+    /// <summary>
+    /// Constructs a new wrapper for the specified logger.
+    /// </summary>
+    /// <param name="logger">The logger to wrap.</param>
+    /// <remarks>
+    /// <para>
+    /// Constructs a new wrapper for the specified logger.
+    /// </para>
+    /// </remarks>
+    protected LoggerWrapperImpl(ILogger logger)
+    {
+      m_logger = logger;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Implementation of ILoggerWrapper
+    #region Implementation of ILoggerWrapper
 
-		/// <summary>
-		/// Gets the implementation behind this wrapper object.
-		/// </summary>
-		/// <value>
-		/// The <see cref="ILogger"/> object that this object is implementing.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <c>Logger</c> object may not be the same object as this object 
-		/// because of logger decorators.
-		/// </para>
-		/// <para>
-		/// This gets the actual underlying objects that is used to process
-		/// the log events.
-		/// </para>
-		/// </remarks>
-		public virtual ILogger Logger
-		{
-			get { return m_logger; }
-		}
+    /// <summary>
+    /// Gets the implementation behind this wrapper object.
+    /// </summary>
+    /// <value>
+    /// The <see cref="ILogger"/> object that this object is implementing.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <c>Logger</c> object may not be the same object as this object 
+    /// because of logger decorators.
+    /// </para>
+    /// <para>
+    /// This gets the actual underlying objects that is used to process
+    /// the log events.
+    /// </para>
+    /// </remarks>
+    public virtual ILogger Logger
+    {
+      get { return m_logger; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The logger that this object is wrapping
-		/// </summary>
-		private readonly ILogger m_logger;  
- 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// The logger that this object is wrapping
+    /// </summary>
+    private readonly ILogger m_logger;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Core/LoggingEvent.cs b/src/log4net/Core/LoggingEvent.cs
index d6b2fb3..b4d2a00 100644
--- a/src/log4net/Core/LoggingEvent.cs
+++ b/src/log4net/Core/LoggingEvent.cs
@@ -32,186 +32,1187 @@
 
 namespace log4net.Core
 {
+  /// <summary>
+  /// Portable data structure used by <see cref="LoggingEvent"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Portable data structure used by <see cref="LoggingEvent"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public struct LoggingEventData
+  {
+    #region Public Instance Fields
+
     /// <summary>
-    /// Portable data structure used by <see cref="LoggingEvent"/>
+    /// The logger name.
     /// </summary>
     /// <remarks>
     /// <para>
-    /// Portable data structure used by <see cref="LoggingEvent"/>
+    /// The logger name.
     /// </para>
     /// </remarks>
-    /// <author>Nicko Cadell</author>
-    public struct LoggingEventData
-    {
-        #region Public Instance Fields
+    public string LoggerName;
 
-        /// <summary>
-        /// The logger name.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The logger name.
-        /// </para>
-        /// </remarks>
-        public string LoggerName;
+    /// <summary>
+    /// Level of logging event.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Level of logging event. Level cannot be Serializable
+    /// because it is a flyweight.  Due to its special serialization it
+    /// cannot be declared final either.
+    /// </para>
+    /// </remarks>
+    public Level Level;
 
-        /// <summary>
-        /// Level of logging event.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Level of logging event. Level cannot be Serializable
-        /// because it is a flyweight.  Due to its special serialization it
-        /// cannot be declared final either.
-        /// </para>
-        /// </remarks>
-        public Level Level;
+    /// <summary>
+    /// The application supplied message.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The application supplied message of logging event.
+    /// </para>
+    /// </remarks>
+    public string Message;
 
-        /// <summary>
-        /// The application supplied message.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The application supplied message of logging event.
-        /// </para>
-        /// </remarks>
-        public string Message;
+    /// <summary>
+    /// The name of thread
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The name of thread in which this logging event was generated
+    /// </para>
+    /// </remarks>
+    public string ThreadName;
 
-        /// <summary>
-        /// The name of thread
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The name of thread in which this logging event was generated
-        /// </para>
-        /// </remarks>
-        public string ThreadName;
+    /// <summary>
+    /// Gets or sets the local time the event was logged
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Prefer using the <see cref="TimeStampUtc"/> setter, since local time can be ambiguous.
+    /// </para>
+    /// </remarks>
+    [Obsolete(
+        "Prefer using TimeStampUtc, since local time can be ambiguous in time zones with daylight savings time.")]
+    public DateTime TimeStamp;
 
-        /// <summary>
-        /// Gets or sets the local time the event was logged
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Prefer using the <see cref="TimeStampUtc"/> setter, since local time can be ambiguous.
-        /// </para>
-        /// </remarks>
-        [Obsolete(
-            "Prefer using TimeStampUtc, since local time can be ambiguous in time zones with daylight savings time.")]
-        public DateTime TimeStamp;
-
-        /// <summary>
-        /// Gets or sets the UTC time the event was logged
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The TimeStamp is stored in the UTC time zone.
-        /// </para>
-        /// </remarks>
+    /// <summary>
+    /// Gets or sets the UTC time the event was logged
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The TimeStamp is stored in the UTC time zone.
+    /// </para>
+    /// </remarks>
 #pragma warning disable 618 // Suppress warnings that TimeStamp field is obsolete
-        public DateTime TimeStampUtc
+    public DateTime TimeStampUtc
+    {
+      get
+      {
+        if (TimeStamp != default(DateTime) &&
+            _timeStampUtc == default(DateTime))
         {
-            get
-            {
-                if (TimeStamp != default(DateTime) &&
-                    _timeStampUtc == default(DateTime))
-                {
-                    // TimeStamp field has been set explicitly but TimeStampUtc hasn't
-                    // => use TimeStamp
-                    return TimeStamp.ToUniversalTime();
-                }
-
-                return _timeStampUtc;
-            }
-            set
-            {
-                _timeStampUtc = value;
-                // For backwards compatibility
-                TimeStamp = _timeStampUtc.ToLocalTime();
-            }
+          // TimeStamp field has been set explicitly but TimeStampUtc hasn't
+          // => use TimeStamp
+          return TimeStamp.ToUniversalTime();
         }
 
-        private DateTime _timeStampUtc;
+        return _timeStampUtc;
+      }
+      set
+      {
+        _timeStampUtc = value;
+        // For backwards compatibility
+        TimeStamp = _timeStampUtc.ToLocalTime();
+      }
+    }
+
+    private DateTime _timeStampUtc;
 #pragma warning restore 618
 
-        /// <summary>
-        /// Location information for the caller.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Location information for the caller.
-        /// </para>
-        /// </remarks>
-        public LocationInfo LocationInfo;
+    /// <summary>
+    /// Location information for the caller.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Location information for the caller.
+    /// </para>
+    /// </remarks>
+    public LocationInfo LocationInfo;
 
-        /// <summary>
-        /// String representation of the user
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// String representation of the user's windows name,
-        /// like DOMAIN\username
-        /// </para>
-        /// </remarks>
-        public string UserName;
+    /// <summary>
+    /// String representation of the user
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// String representation of the user's windows name,
+    /// like DOMAIN\username
+    /// </para>
+    /// </remarks>
+    public string UserName;
 
-        /// <summary>
-        /// String representation of the identity.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// String representation of the current thread's principal identity.
-        /// </para>
-        /// </remarks>
-        public string Identity;
+    /// <summary>
+    /// String representation of the identity.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// String representation of the current thread's principal identity.
+    /// </para>
+    /// </remarks>
+    public string Identity;
 
-        /// <summary>
-        /// The string representation of the exception
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The string representation of the exception
-        /// </para>
-        /// </remarks>
-        public string ExceptionString;
+    /// <summary>
+    /// The string representation of the exception
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The string representation of the exception
+    /// </para>
+    /// </remarks>
+    public string ExceptionString;
 
-        /// <summary>
-        /// String representation of the AppDomain.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// String representation of the AppDomain.
-        /// </para>
-        /// </remarks>
-        public string Domain;
+    /// <summary>
+    /// String representation of the AppDomain.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// String representation of the AppDomain.
+    /// </para>
+    /// </remarks>
+    public string Domain;
 
-        /// <summary>
-        /// Additional event specific properties
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// A logger or an appender may attach additional
-        /// properties to specific events. These properties
-        /// have a string key and an object value.
-        /// </para>
-        /// </remarks>
-        public PropertiesDictionary Properties;
+    /// <summary>
+    /// Additional event specific properties
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// A logger or an appender may attach additional
+    /// properties to specific events. These properties
+    /// have a string key and an object value.
+    /// </para>
+    /// </remarks>
+    public PropertiesDictionary Properties;
 
-        #endregion Public Instance Fields
+    #endregion Public Instance Fields
+  }
+
+  /// <summary>
+  /// The internal representation of logging events. 
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// When an affirmative decision is made to log then a 
+  /// <see cref="LoggingEvent"/> instance is created. This instance 
+  /// is passed around to the different log4net components.
+  /// </para>
+  /// <para>
+  /// This class is of concern to those wishing to extend log4net.
+  /// </para>
+  /// <para>
+  /// Some of the values in instances of <see cref="LoggingEvent"/>
+  /// are considered volatile, that is the values are correct at the
+  /// time the event is delivered to appenders, but will not be consistent
+  /// at any time afterwards. If an event is to be stored and then processed
+  /// at a later time these volatile values must be fixed by calling
+  /// <see cref="M:FixVolatileData()"/>. There is a performance penalty
+  /// for incurred by calling <see cref="M:FixVolatileData()"/> but it
+  /// is essential to maintaining data consistency.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Daniel Cazzulino</author>
+#if !NETCF
+  [Serializable]
+#endif
+  public class LoggingEvent
+#if !NETCF
+      : ISerializable
+#endif
+  {
+    private static readonly Type declaringType = typeof(LoggingEvent);
+
+    #region Public Instance Constructors
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="LoggingEvent" /> class
+    /// from the supplied parameters.
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <param name="repository">The repository this event is logged in.</param>
+    /// <param name="loggerName">The name of the logger of this event.</param>
+    /// <param name="level">The level of this event.</param>
+    /// <param name="message">The message of this event.</param>
+    /// <param name="exception">The exception for this event.</param>
+    /// <remarks>
+    /// <para>
+    /// Except <see cref="TimeStamp"/>, <see cref="Level"/> and <see cref="LoggerName"/>, 
+    /// all fields of <c>LoggingEvent</c> are filled when actually needed. Call
+    /// <see cref="M:FixVolatileData()"/> to cache all data locally
+    /// to prevent inconsistencies.
+    /// </para>
+    /// <para>This method is called by the log4net framework
+    /// to create a logging event.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent(Type callerStackBoundaryDeclaringType,
+        log4net.Repository.ILoggerRepository repository,
+        string loggerName,
+        Level level,
+        object message,
+        Exception exception)
+    {
+      m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType;
+      m_message = message;
+      m_repository = repository;
+      m_thrownException = exception;
+
+      m_data.LoggerName = loggerName;
+      m_data.Level = level;
+
+      // Store the event creation time
+      m_data.TimeStampUtc = DateTime.UtcNow;
     }
 
     /// <summary>
-    /// The internal representation of logging events. 
+    /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
+    /// using specific data.
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <param name="repository">The repository this event is logged in.</param>
+    /// <param name="data">Data used to initialize the logging event.</param>
+    /// <param name="fixedData">The fields in the <paranref name="data"/> struct that have already been fixed.</param>
+    /// <remarks>
+    /// <para>
+    /// This constructor is provided to allow a <see cref="LoggingEvent" />
+    /// to be created independently of the log4net framework. This can
+    /// be useful if you require a custom serialization scheme.
+    /// </para>
+    /// <para>
+    /// Use the <see cref="M:GetLoggingEventData(FixFlags)"/> method to obtain an 
+    /// instance of the <see cref="LoggingEventData"/> class.
+    /// </para>
+    /// <para>
+    /// The <paramref name="fixedData"/> parameter should be used to specify which fields in the
+    /// <paramref name="data"/> struct have been preset. Fields not specified in the <paramref name="fixedData"/>
+    /// will be captured from the environment if requested or fixed.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent(Type callerStackBoundaryDeclaringType,
+        log4net.Repository.ILoggerRepository repository,
+        LoggingEventData data,
+        FixFlags fixedData)
+    {
+      m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType;
+      m_repository = repository;
+
+      m_data = data;
+      m_fixFlags = fixedData;
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
+    /// using specific data.
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <param name="repository">The repository this event is logged in.</param>
+    /// <param name="data">Data used to initialize the logging event.</param>
+    /// <remarks>
+    /// <para>
+    /// This constructor is provided to allow a <see cref="LoggingEvent" />
+    /// to be created independently of the log4net framework. This can
+    /// be useful if you require a custom serialization scheme.
+    /// </para>
+    /// <para>
+    /// Use the <see cref="M:GetLoggingEventData(FixFlags)"/> method to obtain an 
+    /// instance of the <see cref="LoggingEventData"/> class.
+    /// </para>
+    /// <para>
+    /// This constructor sets this objects <see cref="Fix"/> flags to <see cref="FixFlags.All"/>,
+    /// this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
+    /// parameter and no other data should be captured from the environment.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent(Type callerStackBoundaryDeclaringType,
+        log4net.Repository.ILoggerRepository repository,
+        LoggingEventData data) : this(callerStackBoundaryDeclaringType, repository, data, FixFlags.All)
+    {
+    }
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
+    /// using specific data.
+    /// </summary>
+    /// <param name="data">Data used to initialize the logging event.</param>
+    /// <remarks>
+    /// <para>
+    /// This constructor is provided to allow a <see cref="LoggingEvent" />
+    /// to be created independently of the log4net framework. This can
+    /// be useful if you require a custom serialization scheme.
+    /// </para>
+    /// <para>
+    /// Use the <see cref="M:GetLoggingEventData(FixFlags)"/> method to obtain an 
+    /// instance of the <see cref="LoggingEventData"/> class.
+    /// </para>
+    /// <para>
+    /// This constructor sets this objects <see cref="Fix"/> flags to <see cref="FixFlags.All"/>,
+    /// this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
+    /// parameter and no other data should be captured from the environment.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent(LoggingEventData data) : this(null, null, data)
+    {
+    }
+
+    #endregion Public Instance Constructors
+
+    #region Protected Instance Constructors
+
+#if !NETCF
+
+    /// <summary>
+    /// Serialization constructor
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
+    /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
+    /// with serialized data.
+    /// </para>
+    /// </remarks>
+    protected LoggingEvent(SerializationInfo info, StreamingContext context)
+    {
+      m_data.LoggerName = info.GetString("LoggerName");
+
+      // Note we are deserializing the whole level object. That is the
+      // name and the value. This value is correct for the source 
+      // hierarchy but may not be for the target hierarchy that this
+      // event may be re-logged into. If it is to be re-logged it may
+      // be necessary to re-lookup the level based only on the name.
+      m_data.Level = (Level)info.GetValue("Level", typeof(Level));
+
+      m_data.Message = info.GetString("Message");
+      m_data.ThreadName = info.GetString("ThreadName");
+      m_data.TimeStampUtc = info.GetDateTime("TimeStamp").ToUniversalTime();
+      m_data.LocationInfo = (LocationInfo)info.GetValue("LocationInfo", typeof(LocationInfo));
+      m_data.UserName = info.GetString("UserName");
+      m_data.ExceptionString = info.GetString("ExceptionString");
+      m_data.Properties = (PropertiesDictionary)info.GetValue("Properties", typeof(PropertiesDictionary));
+      m_data.Domain = info.GetString("Domain");
+      m_data.Identity = info.GetString("Identity");
+
+      // We have restored all the values of this instance, i.e. all the values are fixed
+      // Set the fix flags otherwise the data values may be overwritten from the current environment.
+      m_fixFlags = FixFlags.All;
+    }
+
+#endif
+
+    #endregion Protected Instance Constructors
+
+    #region Public Instance Properties
+
+    /// <summary>
+    /// Gets the time when the current process started.
+    /// </summary>
+    /// <value>
+    /// This is the time when this process started.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The TimeStamp is stored internally in UTC and converted to the local time zone for this computer.
+    /// </para>
+    /// <para>
+    /// Tries to get the start time for the current process.
+    /// Failing that it returns the time of the first call to
+    /// this property.
+    /// </para>
+    /// <para>
+    /// Note that AppDomains may be loaded and unloaded within the
+    /// same process without the process terminating and therefore
+    /// without the process start time being reset.
+    /// </para>
+    /// </remarks>
+    public static DateTime StartTime
+    {
+      get { return SystemInfo.ProcessStartTimeUtc.ToLocalTime(); }
+    }
+
+    /// <summary>
+    /// Gets the UTC time when the current process started.
+    /// </summary>
+    /// <value>
+    /// This is the UTC time when this process started.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Tries to get the start time for the current process.
+    /// Failing that it returns the time of the first call to
+    /// this property.
+    /// </para>
+    /// <para>
+    /// Note that AppDomains may be loaded and unloaded within the
+    /// same process without the process terminating and therefore
+    /// without the process start time being reset.
+    /// </para>
+    /// </remarks>
+    public static DateTime StartTimeUtc
+    {
+      get { return SystemInfo.ProcessStartTimeUtc; }
+    }
+
+    /// <summary>
+    /// Gets the <see cref="Level" /> of the logging event.
+    /// </summary>
+    /// <value>
+    /// The <see cref="Level" /> of the logging event.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="Level" /> of the logging event.
+    /// </para>
+    /// </remarks>
+    public Level Level
+    {
+      get { return m_data.Level; }
+    }
+
+    /// <summary>
+    /// Gets the time of the logging event.
+    /// </summary>
+    /// <value>
+    /// The time of the logging event.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The TimeStamp is stored in UTC and converted to the local time zone for this computer.
+    /// </para>
+    /// </remarks>
+    public DateTime TimeStamp
+    {
+      get { return m_data.TimeStampUtc.ToLocalTime(); }
+    }
+
+    /// <summary>
+    /// Gets UTC the time of the logging event.
+    /// </summary>
+    /// <value>
+    /// The UTC time of the logging event.
+    /// </value>
+    public DateTime TimeStampUtc
+    {
+      get { return m_data.TimeStampUtc; }
+    }
+
+    /// <summary>
+    /// Gets the name of the logger that logged the event.
+    /// </summary>
+    /// <value>
+    /// The name of the logger that logged the event.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the name of the logger that logged the event.
+    /// </para>
+    /// </remarks>
+    public string LoggerName
+    {
+      get { return m_data.LoggerName; }
+    }
+
+    /// <summary>
+    /// Gets the location information for this logging event.
+    /// </summary>
+    /// <value>
+    /// The location information for this logging event.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The collected information is cached for future use.
+    /// </para>
+    /// <para>
+    /// See the <see cref="LocationInfo"/> class for more information on
+    /// supported frameworks and the different behavior in Debug and
+    /// Release builds.
+    /// </para>
+    /// </remarks>
+    public LocationInfo LocationInformation
+    {
+      get
+      {
+        if (m_data.LocationInfo == null && this.m_cacheUpdatable)
+        {
+          m_data.LocationInfo = new LocationInfo(m_callerStackBoundaryDeclaringType);
+        }
+
+        return m_data.LocationInfo;
+      }
+    }
+
+    /// <summary>
+    /// Gets the message object used to initialize this event.
+    /// </summary>
+    /// <value>
+    /// The message object used to initialize this event.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the message object used to initialize this event.
+    /// Note that this event may not have a valid message object.
+    /// If the event is serialized the message object will not 
+    /// be transferred. To get the text of the message the
+    /// <see cref="RenderedMessage"/> property must be used 
+    /// not this property.
+    /// </para>
+    /// <para>
+    /// If there is no defined message object for this event then
+    /// null will be returned.
+    /// </para>
+    /// </remarks>
+    public object MessageObject
+    {
+      get { return m_message; }
+      protected set { m_message = value; }
+    }
+
+    /// <summary>
+    /// Gets the exception object used to initialize this event.
+    /// </summary>
+    /// <value>
+    /// The exception object used to initialize this event.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the exception object used to initialize this event.
+    /// Note that this event may not have a valid exception object.
+    /// If the event is serialized the exception object will not 
+    /// be transferred. To get the text of the exception the
+    /// <see cref="GetExceptionString"/> method must be used 
+    /// not this property.
+    /// </para>
+    /// <para>
+    /// If there is no defined exception object for this event then
+    /// null will be returned.
+    /// </para>
+    /// </remarks>
+    public Exception ExceptionObject
+    {
+      get { return m_thrownException; }
+    }
+
+    /// <summary>
+    /// The <see cref="ILoggerRepository"/> that this event was created in.
     /// </summary>
     /// <remarks>
     /// <para>
-    /// When an affirmative decision is made to log then a 
-    /// <see cref="LoggingEvent"/> instance is created. This instance 
-    /// is passed around to the different log4net components.
+    /// The <see cref="ILoggerRepository"/> that this event was created in.
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository Repository
+    {
+      get { return m_repository; }
+    }
+
+    /// <summary>
+    /// Ensure that the repository is set.
+    /// </summary>
+    /// <param name="repository">the value for the repository</param>
+    internal void EnsureRepository(ILoggerRepository repository)
+    {
+      if (repository != null)
+      {
+        m_repository = repository;
+      }
+    }
+
+    /// <summary>
+    /// Gets the message, rendered through the <see cref="ILoggerRepository.RendererMap" />.
+    /// </summary>
+    /// <value>
+    /// The message rendered through the <see cref="ILoggerRepository.RendererMap" />.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The collected information is cached for future use.
+    /// </para>
+    /// </remarks>
+    public virtual string RenderedMessage
+    {
+      get
+      {
+        if (m_data.Message == null && this.m_cacheUpdatable)
+        {
+          if (m_message == null)
+          {
+            m_data.Message = "";
+          }
+          else if (m_message is string)
+          {
+            m_data.Message = (m_message as string);
+          }
+          else if (m_repository != null)
+          {
+            m_data.Message = m_repository.RendererMap.FindAndRender(m_message);
+          }
+          else
+          {
+            // Very last resort
+            m_data.Message = m_message.ToString();
+          }
+        }
+
+        return m_data.Message;
+      }
+    }
+
+    /// <summary>
+    /// Write the rendered message to a TextWriter
+    /// </summary>
+    /// <param name="writer">the writer to write the message to</param>
+    /// <remarks>
+    /// <para>
+    /// Unlike the <see cref="RenderedMessage"/> property this method
+    /// does store the message data in the internal cache. Therefore 
+    /// if called only once this method should be faster than the
+    /// <see cref="RenderedMessage"/> property, however if the message is
+    /// to be accessed multiple times then the property will be more efficient.
+    /// </para>
+    /// </remarks>
+    public virtual void WriteRenderedMessage(TextWriter writer)
+    {
+      if (m_data.Message != null)
+      {
+        writer.Write(m_data.Message);
+      }
+      else
+      {
+        if (m_message != null)
+        {
+          if (m_message is string)
+          {
+            writer.Write(m_message as string);
+          }
+          else if (m_repository != null)
+          {
+            m_repository.RendererMap.FindAndRender(m_message, writer);
+          }
+          else
+          {
+            // Very last resort
+            writer.Write(m_message.ToString());
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Gets the name of the current thread.  
+    /// </summary>
+    /// <value>
+    /// The name of the current thread, or the thread ID when 
+    /// the name is not available.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The collected information is cached for future use.
+    /// </para>
+    /// </remarks>
+    public string ThreadName
+    {
+      get
+      {
+        if (m_data.ThreadName == null && this.m_cacheUpdatable)
+        {
+#if NETCF
+          // Get thread ID only
+          m_data.ThreadName =
+ SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
+#else
+          // '.NET ThreadPool Worker' appears as a default thread name in the .NET 6-7 thread pool.
+          // '.NET TP Worker' is the default thread name in the .NET 8+ thread pool.
+          // Prefer the numeric thread ID instead.
+          string threadName = System.Threading.Thread.CurrentThread.Name;
+          if (!string.IsNullOrEmpty(threadName) && threadName != ".NET TP Worker" && threadName != ".NET ThreadPool Worker")
+          {
+            m_data.ThreadName = threadName;
+          }
+          else
+          {
+            // The thread name is not available or unsuitable. Therefore we
+            // go to the AppDomain to get the ID of the
+            // current thread. (Why don't Threads know their own ID?)
+            try
+            {
+              m_data.ThreadName =
+                  SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo
+                      .InvariantInfo);
+            }
+            catch (SecurityException)
+            {
+              // This security exception will occur if the caller does not have 
+              // some undefined set of SecurityPermission flags.
+              LogLog.Debug(declaringType,
+                  "Security exception while trying to get current thread ID. Error Ignored. Empty thread name.");
+
+              // As a last resort use the hash code of the Thread object
+              m_data.ThreadName = System.Threading.Thread.CurrentThread.GetHashCode()
+                  .ToString(System.Globalization.CultureInfo.InvariantCulture);
+            }
+          }
+#endif
+        }
+
+        return m_data.ThreadName;
+      }
+    }
+
+    /// <summary>
+    /// Gets the name of the current user.
+    /// </summary>
+    /// <value>
+    /// The name of the current user, or <c>NOT AVAILABLE</c> when the 
+    /// underlying runtime has no support for retrieving the name of the 
+    /// current user.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Calls <c>WindowsIdentity.GetCurrent().Name</c> to get the name of
+    /// the current windows user.
     /// </para>
     /// <para>
-    /// This class is of concern to those wishing to extend log4net.
+    /// To improve performance, we could cache the string representation of 
+    /// the name, and reuse that as long as the identity stayed constant.  
+    /// Once the identity changed, we would need to re-assign and re-render 
+    /// the string.
     /// </para>
     /// <para>
+    /// However, the <c>WindowsIdentity.GetCurrent()</c> call seems to 
+    /// return different objects every time, so the current implementation 
+    /// doesn't do this type of caching.
+    /// </para>
+    /// <para>
+    /// Timing for these operations:
+    /// </para>
+    /// <list type="table">
+    ///   <listheader>
+    ///     <term>Method</term>
+    ///     <description>Results</description>
+    ///   </listheader>
+    ///   <item>
+    ///      <term><c>WindowsIdentity.GetCurrent()</c></term>
+    ///      <description>10000 loops, 00:00:00.2031250 seconds</description>
+    ///   </item>
+    ///   <item>
+    ///      <term><c>WindowsIdentity.GetCurrent().Name</c></term>
+    ///      <description>10000 loops, 00:00:08.0468750 seconds</description>
+    ///   </item>
+    /// </list>
+    /// <para>
+    /// This means we could speed things up almost 40 times by caching the 
+    /// value of the <c>WindowsIdentity.GetCurrent().Name</c> property, since 
+    /// this takes (8.04-0.20) = 7.84375 seconds.
+    /// </para>
+    /// </remarks>
+    public string UserName =>
+        m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText;
+
+    private string TryGetCurrentUserName()
+    {
+#if (NETCF || SSCLI || NETSTANDARD1_3)
+          // On compact framework there's no notion of current Windows user
+          return SystemInfo.NotAvailableText;
+#else
+      if (_platformDoesNotSupportWindowsIdentity)
+      {
+        // we've already received one PlatformNotSupportedException
+        // and it's highly unlikely that will change
+        return Environment.UserName;
+      }
+
+      try
+      {
+        return _cachedWindowsIdentityUserName ??=
+            TryReadWindowsIdentityUserName();
+      }
+      catch (PlatformNotSupportedException)
+      {
+        _platformDoesNotSupportWindowsIdentity = true;
+        return Environment.UserName;
+      }
+      catch (SecurityException)
+      {
+        // This security exception will occur if the caller does not have 
+        // some undefined set of SecurityPermission flags.
+        LogLog.Debug(
+            declaringType,
+            "Security exception while trying to get current windows identity. Error Ignored."
+        );
+        return Environment.UserName;
+      }
+      catch
+      {
+        return null;
+      }
+#endif
+    }
+
+#if (NETCF || SSCLI || NETSTANDARD1_3)
+#else
+    private string _cachedWindowsIdentityUserName;
+    private static string TryReadWindowsIdentityUserName()
+    {
+      using var identity = WindowsIdentity.GetCurrent();
+      return identity?.Name ?? "";
+    }
+#endif
+
+#if (NETCF || SSCLI || NETSTANDARD1_3)
+#else
+    private static bool _platformDoesNotSupportWindowsIdentity;
+#endif
+
+    /// <summary>
+    /// Gets the identity of the current thread principal.
+    /// </summary>
+    /// <value>
+    /// The string name of the identity of the current thread principal.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Calls <c>System.Threading.Thread.CurrentPrincipal.Identity.Name</c> to get
+    /// the name of the current thread principal.
+    /// </para>
+    /// </remarks>
+    public string Identity
+    {
+      get
+      {
+        if (m_data.Identity == null && this.m_cacheUpdatable)
+        {
+#if (NETCF || SSCLI || NETSTANDARD1_3)
+          // On compact framework there's no notion of current thread principals
+          m_data.Identity = SystemInfo.NotAvailableText;
+#else
+          try
+          {
+            if (System.Threading.Thread.CurrentPrincipal != null &&
+                System.Threading.Thread.CurrentPrincipal.Identity != null &&
+                System.Threading.Thread.CurrentPrincipal.Identity.Name != null)
+            {
+              m_data.Identity = System.Threading.Thread.CurrentPrincipal.Identity.Name;
+            }
+            else
+            {
+              m_data.Identity = "";
+            }
+          }
+          catch (ObjectDisposedException)
+          {
+            // This exception will occur if System.Threading.Thread.CurrentPrincipal.Identity is not null but
+            // the getter of the property Name tries to access disposed objects.
+            // Seen to happen on IIS 7 or greater with windows authentication.
+            LogLog.Debug(declaringType,
+                "Object disposed exception while trying to get current thread principal. Error Ignored. Empty identity name.");
+
+            m_data.Identity = "";
+          }
+          catch (System.Security.SecurityException)
+          {
+            // This security exception will occur if the caller does not have 
+            // some undefined set of SecurityPermission flags.
+            LogLog.Debug(declaringType,
+                "Security exception while trying to get current thread principal. Error Ignored. Empty identity name.");
+
+            m_data.Identity = "";
+          }
+#endif
+        }
+
+        return m_data.Identity;
+      }
+    }
+
+    /// <summary>
+    /// Gets the AppDomain friendly name.
+    /// </summary>
+    /// <value>
+    /// The AppDomain friendly name.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the AppDomain friendly name.
+    /// </para>
+    /// </remarks>
+    public string Domain
+    {
+      get
+      {
+        if (m_data.Domain == null && this.m_cacheUpdatable)
+        {
+          m_data.Domain = SystemInfo.ApplicationFriendlyName;
+        }
+
+        return m_data.Domain;
+      }
+    }
+
+    /// <summary>
+    /// Additional event specific properties.
+    /// </summary>
+    /// <value>
+    /// Additional event specific properties.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// A logger or an appender may attach additional
+    /// properties to specific events. These properties
+    /// have a string key and an object value.
+    /// </para>
+    /// <para>
+    /// This property is for events that have been added directly to
+    /// this event. The aggregate properties (which include these
+    /// event properties) can be retrieved using <see cref="LookupProperty"/>
+    /// and <see cref="GetProperties"/>.
+    /// </para>
+    /// <para>
+    /// Once the properties have been fixed <see cref="Fix"/> this property
+    /// returns the combined cached properties. This ensures that updates to
+    /// this property are always reflected in the underlying storage. When
+    /// returning the combined properties there may be more keys in the
+    /// Dictionary than expected.
+    /// </para>
+    /// </remarks>
+    public PropertiesDictionary Properties
+    {
+      get
+      {
+        // If we have cached properties then return that otherwise changes will be lost
+        if (m_data.Properties != null)
+        {
+          return m_data.Properties;
+        }
+
+        if (m_eventProperties == null)
+        {
+          m_eventProperties = new PropertiesDictionary();
+        }
+
+        return m_eventProperties;
+      }
+    }
+
+    /// <summary>
+    /// The fixed fields in this event
+    /// </summary>
+    /// <value>
+    /// The set of fields that are fixed in this event
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Fields will not be fixed if they have previously been fixed.
+    /// It is not possible to 'unfix' a field.
+    /// </para>
+    /// </remarks>
+    public FixFlags Fix
+    {
+      get { return m_fixFlags; }
+      set { this.FixVolatileData(value); }
+    }
+
+    #endregion Public Instance Properties
+
+    #region Implementation of ISerializable
+
+#if !NETCF
+
+    /// <summary>
+    /// Serializes this object into the <see cref="SerializationInfo" /> provided.
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> to populate with data.</param>
+    /// <param name="context">The destination for this serialization.</param>
+    /// <remarks>
+    /// <para>
+    /// The data in this event must be fixed before it can be serialized.
+    /// </para>
+    /// <para>
+    /// The <see cref="M:FixVolatileData()"/> method must be called during the
+    /// <see cref="log4net.Appender.IAppender.DoAppend"/> method call if this event 
+    /// is to be used outside that method.
+    /// </para>
+    /// </remarks>
+#if NET_4_0 || MONO_4_0 || NETSTANDARD
+        [System.Security.SecurityCritical]
+#endif
+#if !NETCF && !NETSTANDARD1_3
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
+        SerializationFormatter = true)]
+#endif
+    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
+    {
+      // The caller must call FixVolatileData before this object
+      // can be serialized.
+
+      info.AddValue("LoggerName", m_data.LoggerName);
+      info.AddValue("Level", m_data.Level);
+      info.AddValue("Message", m_data.Message);
+      info.AddValue("ThreadName", m_data.ThreadName);
+      // TODO: consider serializing UTC rather than local time.  Not implemented here because it
+      // would give an unexpected result if client and server have different versions of this class.
+      // info.AddValue("TimeStamp", m_data.TimeStampUtc);
+#pragma warning disable 618
+      info.AddValue("TimeStamp", m_data.TimeStamp);
+#pragma warning restore 618
+      info.AddValue("LocationInfo", m_data.LocationInfo);
+      info.AddValue("UserName", m_data.UserName);
+      info.AddValue("ExceptionString", m_data.ExceptionString);
+      info.AddValue("Properties", m_data.Properties);
+      info.AddValue("Domain", m_data.Domain);
+      info.AddValue("Identity", m_data.Identity);
+    }
+
+#endif
+
+    #endregion Implementation of ISerializable
+
+    #region Public Instance Methods
+
+    /// <summary>
+    /// Gets the portable data for this <see cref="LoggingEvent" />.
+    /// </summary>
+    /// <returns>The <see cref="LoggingEventData"/> for this event.</returns>
+    /// <remarks>
+    /// <para>
+    /// A new <see cref="LoggingEvent"/> can be constructed using a
+    /// <see cref="LoggingEventData"/> instance.
+    /// </para>
+    /// <para>
+    /// Does a <see cref="FixFlags.Partial"/> fix of the data
+    /// in the logging event before returning the event data.
+    /// </para>
+    /// </remarks>
+    public LoggingEventData GetLoggingEventData()
+    {
+      return GetLoggingEventData(FixFlags.Partial);
+    }
+
+    /// <summary>
+    /// Gets the portable data for this <see cref="LoggingEvent" />.
+    /// </summary>
+    /// <param name="fixFlags">The set of data to ensure is fixed in the LoggingEventData</param>
+    /// <returns>The <see cref="LoggingEventData"/> for this event.</returns>
+    /// <remarks>
+    /// <para>
+    /// A new <see cref="LoggingEvent"/> can be constructed using a
+    /// <see cref="LoggingEventData"/> instance.
+    /// </para>
+    /// </remarks>
+    public LoggingEventData GetLoggingEventData(FixFlags fixFlags)
+    {
+      Fix = fixFlags;
+      return m_data;
+    }
+
+    /// <summary>
+    /// Returns this event's exception's rendered using the 
+    /// <see cref="ILoggerRepository.RendererMap" />.
+    /// </summary>
+    /// <returns>
+    /// This event's exception's rendered using the <see cref="ILoggerRepository.RendererMap" />.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// <b>Obsolete. Use <see cref="GetExceptionString"/> instead.</b>
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use GetExceptionString instead")]
+    public string GetExceptionStrRep()
+    {
+      return GetExceptionString();
+    }
+
+    /// <summary>
+    /// Returns this event's exception's rendered using the 
+    /// <see cref="ILoggerRepository.RendererMap" />.
+    /// </summary>
+    /// <returns>
+    /// This event's exception's rendered using the <see cref="ILoggerRepository.RendererMap" />.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Returns this event's exception's rendered using the 
+    /// <see cref="ILoggerRepository.RendererMap" />.
+    /// </para>
+    /// </remarks>
+    public string GetExceptionString()
+    {
+      if (m_data.ExceptionString == null && this.m_cacheUpdatable)
+      {
+        if (m_thrownException != null)
+        {
+          if (m_repository != null)
+          {
+            // Render exception using the repositories renderer map
+            m_data.ExceptionString = m_repository.RendererMap.FindAndRender(m_thrownException);
+          }
+          else
+          {
+            // Very last resort
+            m_data.ExceptionString = m_thrownException.ToString();
+          }
+        }
+        else
+        {
+          m_data.ExceptionString = "";
+        }
+      }
+
+      return m_data.ExceptionString;
+    }
+
+    /// <summary>
+    /// Fix instance fields that hold volatile data.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Some of the values in instances of <see cref="LoggingEvent"/>
+    /// are considered volatile, that is the values are correct at the
+    /// time the event is delivered to appenders, but will not be consistent
+    /// at any time afterwards. If an event is to be stored and then processed
+    /// at a later time these volatile values must be fixed by calling
+    /// <see cref="M:FixVolatileData()"/>. There is a performance penalty
+    /// incurred by calling <see cref="M:FixVolatileData()"/> but it
+    /// is essential to maintaining data consistency.
+    /// </para>
+    /// <para>
+    /// Calling <see cref="M:FixVolatileData()"/> is equivalent to
+    /// calling <see cref="M:FixVolatileData(bool)"/> passing the parameter
+    /// <c>false</c>.
+    /// </para>
+    /// <para>
+    /// See <see cref="M:FixVolatileData(bool)"/> for more
+    /// information.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use Fix property")]
+    public void FixVolatileData()
+    {
+      Fix = FixFlags.All;
+    }
+
+    /// <summary>
+    /// Fixes instance fields that hold volatile data.
+    /// </summary>
+    /// <param name="fastButLoose">Set to <c>true</c> to not fix data that takes a long time to fix.</param>
+    /// <remarks>
+    /// <para>
     /// Some of the values in instances of <see cref="LoggingEvent"/>
     /// are considered volatile, that is the values are correct at the
     /// time the event is delivered to appenders, but will not be consistent
@@ -221,1384 +1222,383 @@
     /// for incurred by calling <see cref="M:FixVolatileData()"/> but it
     /// is essential to maintaining data consistency.
     /// </para>
+    /// <para>
+    /// The <paramref name="fastButLoose"/> param controls the data that
+    /// is fixed. Some of the data that can be fixed takes a long time to 
+    /// generate, therefore if you do not require those settings to be fixed
+    /// they can be ignored by setting the <paramref name="fastButLoose"/> param
+    /// to <c>true</c>. This setting will ignore the <see cref="LocationInformation"/>
+    /// and <see cref="UserName"/> settings.
+    /// </para>
+    /// <para>
+    /// Set <paramref name="fastButLoose"/> to <c>false</c> to ensure that all 
+    /// settings are fixed.
+    /// </para>
     /// </remarks>
-    /// <author>Nicko Cadell</author>
-    /// <author>Gert Driesen</author>
-    /// <author>Douglas de la Torre</author>
-    /// <author>Daniel Cazzulino</author>
-#if !NETCF
-    [Serializable]
-#endif
-    public class LoggingEvent
-#if !NETCF
-        : ISerializable
-#endif
+    [Obsolete("Use Fix property")]
+    public void FixVolatileData(bool fastButLoose)
     {
-        private static readonly Type declaringType = typeof(LoggingEvent);
-
-        #region Public Instance Constructors
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="LoggingEvent" /> class
-        /// from the supplied parameters.
-        /// </summary>
-        /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-        /// the stack boundary into the logging system for this call.</param>
-        /// <param name="repository">The repository this event is logged in.</param>
-        /// <param name="loggerName">The name of the logger of this event.</param>
-        /// <param name="level">The level of this event.</param>
-        /// <param name="message">The message of this event.</param>
-        /// <param name="exception">The exception for this event.</param>
-        /// <remarks>
-        /// <para>
-        /// Except <see cref="TimeStamp"/>, <see cref="Level"/> and <see cref="LoggerName"/>, 
-        /// all fields of <c>LoggingEvent</c> are filled when actually needed. Call
-        /// <see cref="M:FixVolatileData()"/> to cache all data locally
-        /// to prevent inconsistencies.
-        /// </para>
-        /// <para>This method is called by the log4net framework
-        /// to create a logging event.
-        /// </para>
-        /// </remarks>
-        public LoggingEvent(Type callerStackBoundaryDeclaringType,
-            log4net.Repository.ILoggerRepository repository,
-            string loggerName,
-            Level level,
-            object message,
-            Exception exception)
-        {
-            m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType;
-            m_message = message;
-            m_repository = repository;
-            m_thrownException = exception;
-
-            m_data.LoggerName = loggerName;
-            m_data.Level = level;
-
-            // Store the event creation time
-            m_data.TimeStampUtc = DateTime.UtcNow;
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
-        /// using specific data.
-        /// </summary>
-        /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-        /// the stack boundary into the logging system for this call.</param>
-        /// <param name="repository">The repository this event is logged in.</param>
-        /// <param name="data">Data used to initialize the logging event.</param>
-        /// <param name="fixedData">The fields in the <paranref name="data"/> struct that have already been fixed.</param>
-        /// <remarks>
-        /// <para>
-        /// This constructor is provided to allow a <see cref="LoggingEvent" />
-        /// to be created independently of the log4net framework. This can
-        /// be useful if you require a custom serialization scheme.
-        /// </para>
-        /// <para>
-        /// Use the <see cref="M:GetLoggingEventData(FixFlags)"/> method to obtain an 
-        /// instance of the <see cref="LoggingEventData"/> class.
-        /// </para>
-        /// <para>
-        /// The <paramref name="fixedData"/> parameter should be used to specify which fields in the
-        /// <paramref name="data"/> struct have been preset. Fields not specified in the <paramref name="fixedData"/>
-        /// will be captured from the environment if requested or fixed.
-        /// </para>
-        /// </remarks>
-        public LoggingEvent(Type callerStackBoundaryDeclaringType,
-            log4net.Repository.ILoggerRepository repository,
-            LoggingEventData data,
-            FixFlags fixedData)
-        {
-            m_callerStackBoundaryDeclaringType = callerStackBoundaryDeclaringType;
-            m_repository = repository;
-
-            m_data = data;
-            m_fixFlags = fixedData;
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
-        /// using specific data.
-        /// </summary>
-        /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-        /// the stack boundary into the logging system for this call.</param>
-        /// <param name="repository">The repository this event is logged in.</param>
-        /// <param name="data">Data used to initialize the logging event.</param>
-        /// <remarks>
-        /// <para>
-        /// This constructor is provided to allow a <see cref="LoggingEvent" />
-        /// to be created independently of the log4net framework. This can
-        /// be useful if you require a custom serialization scheme.
-        /// </para>
-        /// <para>
-        /// Use the <see cref="M:GetLoggingEventData(FixFlags)"/> method to obtain an 
-        /// instance of the <see cref="LoggingEventData"/> class.
-        /// </para>
-        /// <para>
-        /// This constructor sets this objects <see cref="Fix"/> flags to <see cref="FixFlags.All"/>,
-        /// this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
-        /// parameter and no other data should be captured from the environment.
-        /// </para>
-        /// </remarks>
-        public LoggingEvent(Type callerStackBoundaryDeclaringType,
-            log4net.Repository.ILoggerRepository repository,
-            LoggingEventData data) : this(callerStackBoundaryDeclaringType, repository, data, FixFlags.All)
-        {
-        }
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
-        /// using specific data.
-        /// </summary>
-        /// <param name="data">Data used to initialize the logging event.</param>
-        /// <remarks>
-        /// <para>
-        /// This constructor is provided to allow a <see cref="LoggingEvent" />
-        /// to be created independently of the log4net framework. This can
-        /// be useful if you require a custom serialization scheme.
-        /// </para>
-        /// <para>
-        /// Use the <see cref="M:GetLoggingEventData(FixFlags)"/> method to obtain an 
-        /// instance of the <see cref="LoggingEventData"/> class.
-        /// </para>
-        /// <para>
-        /// This constructor sets this objects <see cref="Fix"/> flags to <see cref="FixFlags.All"/>,
-        /// this assumes that all the data relating to this event is passed in via the <paramref name="data"/>
-        /// parameter and no other data should be captured from the environment.
-        /// </para>
-        /// </remarks>
-        public LoggingEvent(LoggingEventData data) : this(null, null, data)
-        {
-        }
-
-        #endregion Public Instance Constructors
-
-        #region Protected Instance Constructors
-
-#if !NETCF
-
-        /// <summary>
-        /// Serialization constructor
-        /// </summary>
-        /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
-        /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
-        /// <remarks>
-        /// <para>
-        /// Initializes a new instance of the <see cref="LoggingEvent" /> class 
-        /// with serialized data.
-        /// </para>
-        /// </remarks>
-        protected LoggingEvent(SerializationInfo info, StreamingContext context)
-        {
-            m_data.LoggerName = info.GetString("LoggerName");
-
-            // Note we are deserializing the whole level object. That is the
-            // name and the value. This value is correct for the source 
-            // hierarchy but may not be for the target hierarchy that this
-            // event may be re-logged into. If it is to be re-logged it may
-            // be necessary to re-lookup the level based only on the name.
-            m_data.Level = (Level)info.GetValue("Level", typeof(Level));
-
-            m_data.Message = info.GetString("Message");
-            m_data.ThreadName = info.GetString("ThreadName");
-            m_data.TimeStampUtc = info.GetDateTime("TimeStamp").ToUniversalTime();
-            m_data.LocationInfo = (LocationInfo)info.GetValue("LocationInfo", typeof(LocationInfo));
-            m_data.UserName = info.GetString("UserName");
-            m_data.ExceptionString = info.GetString("ExceptionString");
-            m_data.Properties = (PropertiesDictionary)info.GetValue("Properties", typeof(PropertiesDictionary));
-            m_data.Domain = info.GetString("Domain");
-            m_data.Identity = info.GetString("Identity");
-
-            // We have restored all the values of this instance, i.e. all the values are fixed
-            // Set the fix flags otherwise the data values may be overwritten from the current environment.
-            m_fixFlags = FixFlags.All;
-        }
-
-#endif
-
-        #endregion Protected Instance Constructors
-
-        #region Public Instance Properties
-
-        /// <summary>
-        /// Gets the time when the current process started.
-        /// </summary>
-        /// <value>
-        /// This is the time when this process started.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// The TimeStamp is stored internally in UTC and converted to the local time zone for this computer.
-        /// </para>
-        /// <para>
-        /// Tries to get the start time for the current process.
-        /// Failing that it returns the time of the first call to
-        /// this property.
-        /// </para>
-        /// <para>
-        /// Note that AppDomains may be loaded and unloaded within the
-        /// same process without the process terminating and therefore
-        /// without the process start time being reset.
-        /// </para>
-        /// </remarks>
-        public static DateTime StartTime
-        {
-            get { return SystemInfo.ProcessStartTimeUtc.ToLocalTime(); }
-        }
-
-        /// <summary>
-        /// Gets the UTC time when the current process started.
-        /// </summary>
-        /// <value>
-        /// This is the UTC time when this process started.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Tries to get the start time for the current process.
-        /// Failing that it returns the time of the first call to
-        /// this property.
-        /// </para>
-        /// <para>
-        /// Note that AppDomains may be loaded and unloaded within the
-        /// same process without the process terminating and therefore
-        /// without the process start time being reset.
-        /// </para>
-        /// </remarks>
-        public static DateTime StartTimeUtc
-        {
-            get { return SystemInfo.ProcessStartTimeUtc; }
-        }
-
-        /// <summary>
-        /// Gets the <see cref="Level" /> of the logging event.
-        /// </summary>
-        /// <value>
-        /// The <see cref="Level" /> of the logging event.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the <see cref="Level" /> of the logging event.
-        /// </para>
-        /// </remarks>
-        public Level Level
-        {
-            get { return m_data.Level; }
-        }
-
-        /// <summary>
-        /// Gets the time of the logging event.
-        /// </summary>
-        /// <value>
-        /// The time of the logging event.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// The TimeStamp is stored in UTC and converted to the local time zone for this computer.
-        /// </para>
-        /// </remarks>
-        public DateTime TimeStamp
-        {
-            get { return m_data.TimeStampUtc.ToLocalTime(); }
-        }
-
-        /// <summary>
-        /// Gets UTC the time of the logging event.
-        /// </summary>
-        /// <value>
-        /// The UTC time of the logging event.
-        /// </value>
-        public DateTime TimeStampUtc
-        {
-            get { return m_data.TimeStampUtc; }
-        }
-
-        /// <summary>
-        /// Gets the name of the logger that logged the event.
-        /// </summary>
-        /// <value>
-        /// The name of the logger that logged the event.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the name of the logger that logged the event.
-        /// </para>
-        /// </remarks>
-        public string LoggerName
-        {
-            get { return m_data.LoggerName; }
-        }
-
-        /// <summary>
-        /// Gets the location information for this logging event.
-        /// </summary>
-        /// <value>
-        /// The location information for this logging event.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// The collected information is cached for future use.
-        /// </para>
-        /// <para>
-        /// See the <see cref="LocationInfo"/> class for more information on
-        /// supported frameworks and the different behavior in Debug and
-        /// Release builds.
-        /// </para>
-        /// </remarks>
-        public LocationInfo LocationInformation
-        {
-            get
-            {
-                if (m_data.LocationInfo == null && this.m_cacheUpdatable)
-                {
-                    m_data.LocationInfo = new LocationInfo(m_callerStackBoundaryDeclaringType);
-                }
-
-                return m_data.LocationInfo;
-            }
-        }
-
-        /// <summary>
-        /// Gets the message object used to initialize this event.
-        /// </summary>
-        /// <value>
-        /// The message object used to initialize this event.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the message object used to initialize this event.
-        /// Note that this event may not have a valid message object.
-        /// If the event is serialized the message object will not 
-        /// be transferred. To get the text of the message the
-        /// <see cref="RenderedMessage"/> property must be used 
-        /// not this property.
-        /// </para>
-        /// <para>
-        /// If there is no defined message object for this event then
-        /// null will be returned.
-        /// </para>
-        /// </remarks>
-        public object MessageObject
-        {
-            get { return m_message; }
-            protected set { m_message = value; }
-        }
-
-        /// <summary>
-        /// Gets the exception object used to initialize this event.
-        /// </summary>
-        /// <value>
-        /// The exception object used to initialize this event.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the exception object used to initialize this event.
-        /// Note that this event may not have a valid exception object.
-        /// If the event is serialized the exception object will not 
-        /// be transferred. To get the text of the exception the
-        /// <see cref="GetExceptionString"/> method must be used 
-        /// not this property.
-        /// </para>
-        /// <para>
-        /// If there is no defined exception object for this event then
-        /// null will be returned.
-        /// </para>
-        /// </remarks>
-        public Exception ExceptionObject
-        {
-            get { return m_thrownException; }
-        }
-
-        /// <summary>
-        /// The <see cref="ILoggerRepository"/> that this event was created in.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The <see cref="ILoggerRepository"/> that this event was created in.
-        /// </para>
-        /// </remarks>
-        public ILoggerRepository Repository
-        {
-            get { return m_repository; }
-        }
-
-        /// <summary>
-        /// Ensure that the repository is set.
-        /// </summary>
-        /// <param name="repository">the value for the repository</param>
-        internal void EnsureRepository(ILoggerRepository repository)
-        {
-            if (repository != null)
-            {
-                m_repository = repository;
-            }
-        }
-
-        /// <summary>
-        /// Gets the message, rendered through the <see cref="ILoggerRepository.RendererMap" />.
-        /// </summary>
-        /// <value>
-        /// The message rendered through the <see cref="ILoggerRepository.RendererMap" />.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// The collected information is cached for future use.
-        /// </para>
-        /// </remarks>
-        public virtual string RenderedMessage
-        {
-            get
-            {
-                if (m_data.Message == null && this.m_cacheUpdatable)
-                {
-                    if (m_message == null)
-                    {
-                        m_data.Message = "";
-                    }
-                    else if (m_message is string)
-                    {
-                        m_data.Message = (m_message as string);
-                    }
-                    else if (m_repository != null)
-                    {
-                        m_data.Message = m_repository.RendererMap.FindAndRender(m_message);
-                    }
-                    else
-                    {
-                        // Very last resort
-                        m_data.Message = m_message.ToString();
-                    }
-                }
-
-                return m_data.Message;
-            }
-        }
-
-        /// <summary>
-        /// Write the rendered message to a TextWriter
-        /// </summary>
-        /// <param name="writer">the writer to write the message to</param>
-        /// <remarks>
-        /// <para>
-        /// Unlike the <see cref="RenderedMessage"/> property this method
-        /// does store the message data in the internal cache. Therefore 
-        /// if called only once this method should be faster than the
-        /// <see cref="RenderedMessage"/> property, however if the message is
-        /// to be accessed multiple times then the property will be more efficient.
-        /// </para>
-        /// </remarks>
-        public virtual void WriteRenderedMessage(TextWriter writer)
-        {
-            if (m_data.Message != null)
-            {
-                writer.Write(m_data.Message);
-            }
-            else
-            {
-                if (m_message != null)
-                {
-                    if (m_message is string)
-                    {
-                        writer.Write(m_message as string);
-                    }
-                    else if (m_repository != null)
-                    {
-                        m_repository.RendererMap.FindAndRender(m_message, writer);
-                    }
-                    else
-                    {
-                        // Very last resort
-                        writer.Write(m_message.ToString());
-                    }
-                }
-            }
-        }
-
-        /// <summary>
-        /// Gets the name of the current thread.  
-        /// </summary>
-        /// <value>
-        /// The name of the current thread, or the thread ID when 
-        /// the name is not available.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// The collected information is cached for future use.
-        /// </para>
-        /// </remarks>
-        public string ThreadName
-        {
-            get
-            {
-                if (m_data.ThreadName == null && this.m_cacheUpdatable)
-                {
-#if NETCF
-					// Get thread ID only
-					m_data.ThreadName =
- SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
-#else
-                    // '.NET ThreadPool Worker' appears as a default thread name in the .NET 6-7 thread pool.
-                    // '.NET TP Worker' is the default thread name in the .NET 8+ thread pool.
-                    // Prefer the numeric thread ID instead.
-                    string threadName = System.Threading.Thread.CurrentThread.Name;
-                    if (!string.IsNullOrEmpty(threadName) && threadName != ".NET TP Worker" && threadName != ".NET ThreadPool Worker")
-                    {
-                        m_data.ThreadName = threadName;
-                    }
-                    else
-                    {
-                        // The thread name is not available or unsuitable. Therefore we
-                        // go to the AppDomain to get the ID of the
-                        // current thread. (Why don't Threads know their own ID?)
-                        try
-                        {
-                            m_data.ThreadName =
-                                SystemInfo.CurrentThreadId.ToString(System.Globalization.NumberFormatInfo
-                                    .InvariantInfo);
-                        }
-                        catch (SecurityException)
-                        {
-                            // This security exception will occur if the caller does not have 
-                            // some undefined set of SecurityPermission flags.
-                            LogLog.Debug(declaringType,
-                                "Security exception while trying to get current thread ID. Error Ignored. Empty thread name.");
-
-                            // As a last resort use the hash code of the Thread object
-                            m_data.ThreadName = System.Threading.Thread.CurrentThread.GetHashCode()
-                                .ToString(System.Globalization.CultureInfo.InvariantCulture);
-                        }
-                    }
-#endif
-                }
-
-                return m_data.ThreadName;
-            }
-        }
-
-        /// <summary>
-        /// Gets the name of the current user.
-        /// </summary>
-        /// <value>
-        /// The name of the current user, or <c>NOT AVAILABLE</c> when the 
-        /// underlying runtime has no support for retrieving the name of the 
-        /// current user.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Calls <c>WindowsIdentity.GetCurrent().Name</c> to get the name of
-        /// the current windows user.
-        /// </para>
-        /// <para>
-        /// To improve performance, we could cache the string representation of 
-        /// the name, and reuse that as long as the identity stayed constant.  
-        /// Once the identity changed, we would need to re-assign and re-render 
-        /// the string.
-        /// </para>
-        /// <para>
-        /// However, the <c>WindowsIdentity.GetCurrent()</c> call seems to 
-        /// return different objects every time, so the current implementation 
-        /// doesn't do this type of caching.
-        /// </para>
-        /// <para>
-        /// Timing for these operations:
-        /// </para>
-        /// <list type="table">
-        ///   <listheader>
-        ///     <term>Method</term>
-        ///     <description>Results</description>
-        ///   </listheader>
-        ///   <item>
-        ///	    <term><c>WindowsIdentity.GetCurrent()</c></term>
-        ///	    <description>10000 loops, 00:00:00.2031250 seconds</description>
-        ///   </item>
-        ///   <item>
-        ///	    <term><c>WindowsIdentity.GetCurrent().Name</c></term>
-        ///	    <description>10000 loops, 00:00:08.0468750 seconds</description>
-        ///   </item>
-        /// </list>
-        /// <para>
-        /// This means we could speed things up almost 40 times by caching the 
-        /// value of the <c>WindowsIdentity.GetCurrent().Name</c> property, since 
-        /// this takes (8.04-0.20) = 7.84375 seconds.
-        /// </para>
-        /// </remarks>
-        public string UserName =>
-            m_data.UserName ??= TryGetCurrentUserName() ?? SystemInfo.NotAvailableText;
-
-        private string TryGetCurrentUserName()
-        {
-#if (NETCF || SSCLI || NETSTANDARD1_3)
-					// On compact framework there's no notion of current Windows user
-					return SystemInfo.NotAvailableText;
-#else
-            if (_platformDoesNotSupportWindowsIdentity)
-            {
-                // we've already received one PlatformNotSupportedException
-                // and it's highly unlikely that will change
-                return Environment.UserName;
-            }
-
-            try
-            {
-                return _cachedWindowsIdentityUserName ??= 
-                    TryReadWindowsIdentityUserName();
-            }
-            catch (PlatformNotSupportedException)
-            {
-                _platformDoesNotSupportWindowsIdentity = true;
-                return Environment.UserName;
-            }
-            catch (SecurityException)
-            {
-                // This security exception will occur if the caller does not have 
-                // some undefined set of SecurityPermission flags.
-                LogLog.Debug(
-                    declaringType,
-                    "Security exception while trying to get current windows identity. Error Ignored."
-                );
-                return Environment.UserName;
-            }
-            catch
-            {
-                return null;
-            }
-#endif
-        }
-        
-#if (NETCF || SSCLI || NETSTANDARD1_3)
-#else
-        private string _cachedWindowsIdentityUserName;
-        private static string TryReadWindowsIdentityUserName()
-        {
-            using var identity = WindowsIdentity.GetCurrent();
-            return identity?.Name ?? "";
-        }
-#endif
-
-#if (NETCF || SSCLI || NETSTANDARD1_3)
-#else
-        private static bool _platformDoesNotSupportWindowsIdentity;
-#endif
-
-        /// <summary>
-        /// Gets the identity of the current thread principal.
-        /// </summary>
-        /// <value>
-        /// The string name of the identity of the current thread principal.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Calls <c>System.Threading.Thread.CurrentPrincipal.Identity.Name</c> to get
-        /// the name of the current thread principal.
-        /// </para>
-        /// </remarks>
-        public string Identity
-        {
-            get
-            {
-                if (m_data.Identity == null && this.m_cacheUpdatable)
-                {
-#if (NETCF || SSCLI || NETSTANDARD1_3)
-					// On compact framework there's no notion of current thread principals
-					m_data.Identity = SystemInfo.NotAvailableText;
-#else
-                    try
-                    {
-                        if (System.Threading.Thread.CurrentPrincipal != null &&
-                            System.Threading.Thread.CurrentPrincipal.Identity != null &&
-                            System.Threading.Thread.CurrentPrincipal.Identity.Name != null)
-                        {
-                            m_data.Identity = System.Threading.Thread.CurrentPrincipal.Identity.Name;
-                        }
-                        else
-                        {
-                            m_data.Identity = "";
-                        }
-                    }
-                    catch (ObjectDisposedException)
-                    {
-                        // This exception will occur if System.Threading.Thread.CurrentPrincipal.Identity is not null but
-                        // the getter of the property Name tries to access disposed objects.
-                        // Seen to happen on IIS 7 or greater with windows authentication.
-                        LogLog.Debug(declaringType,
-                            "Object disposed exception while trying to get current thread principal. Error Ignored. Empty identity name.");
-
-                        m_data.Identity = "";
-                    }
-                    catch (System.Security.SecurityException)
-                    {
-                        // This security exception will occur if the caller does not have 
-                        // some undefined set of SecurityPermission flags.
-                        LogLog.Debug(declaringType,
-                            "Security exception while trying to get current thread principal. Error Ignored. Empty identity name.");
-
-                        m_data.Identity = "";
-                    }
-#endif
-                }
-
-                return m_data.Identity;
-            }
-        }
-
-        /// <summary>
-        /// Gets the AppDomain friendly name.
-        /// </summary>
-        /// <value>
-        /// The AppDomain friendly name.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the AppDomain friendly name.
-        /// </para>
-        /// </remarks>
-        public string Domain
-        {
-            get
-            {
-                if (m_data.Domain == null && this.m_cacheUpdatable)
-                {
-                    m_data.Domain = SystemInfo.ApplicationFriendlyName;
-                }
-
-                return m_data.Domain;
-            }
-        }
-
-        /// <summary>
-        /// Additional event specific properties.
-        /// </summary>
-        /// <value>
-        /// Additional event specific properties.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// A logger or an appender may attach additional
-        /// properties to specific events. These properties
-        /// have a string key and an object value.
-        /// </para>
-        /// <para>
-        /// This property is for events that have been added directly to
-        /// this event. The aggregate properties (which include these
-        /// event properties) can be retrieved using <see cref="LookupProperty"/>
-        /// and <see cref="GetProperties"/>.
-        /// </para>
-        /// <para>
-        /// Once the properties have been fixed <see cref="Fix"/> this property
-        /// returns the combined cached properties. This ensures that updates to
-        /// this property are always reflected in the underlying storage. When
-        /// returning the combined properties there may be more keys in the
-        /// Dictionary than expected.
-        /// </para>
-        /// </remarks>
-        public PropertiesDictionary Properties
-        {
-            get
-            {
-                // If we have cached properties then return that otherwise changes will be lost
-                if (m_data.Properties != null)
-                {
-                    return m_data.Properties;
-                }
-
-                if (m_eventProperties == null)
-                {
-                    m_eventProperties = new PropertiesDictionary();
-                }
-
-                return m_eventProperties;
-            }
-        }
-
-        /// <summary>
-        /// The fixed fields in this event
-        /// </summary>
-        /// <value>
-        /// The set of fields that are fixed in this event
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Fields will not be fixed if they have previously been fixed.
-        /// It is not possible to 'unfix' a field.
-        /// </para>
-        /// </remarks>
-        public FixFlags Fix
-        {
-            get { return m_fixFlags; }
-            set { this.FixVolatileData(value); }
-        }
-
-        #endregion Public Instance Properties
-
-        #region Implementation of ISerializable
-
-#if !NETCF
-
-        /// <summary>
-        /// Serializes this object into the <see cref="SerializationInfo" /> provided.
-        /// </summary>
-        /// <param name="info">The <see cref="SerializationInfo" /> to populate with data.</param>
-        /// <param name="context">The destination for this serialization.</param>
-        /// <remarks>
-        /// <para>
-        /// The data in this event must be fixed before it can be serialized.
-        /// </para>
-        /// <para>
-        /// The <see cref="M:FixVolatileData()"/> method must be called during the
-        /// <see cref="log4net.Appender.IAppender.DoAppend"/> method call if this event 
-        /// is to be used outside that method.
-        /// </para>
-        /// </remarks>
-#if NET_4_0 || MONO_4_0 || NETSTANDARD
-        [System.Security.SecurityCritical]
-#endif
-#if !NETCF && !NETSTANDARD1_3
-        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand,
-            SerializationFormatter = true)]
-#endif
-        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
-        {
-            // The caller must call FixVolatileData before this object
-            // can be serialized.
-
-            info.AddValue("LoggerName", m_data.LoggerName);
-            info.AddValue("Level", m_data.Level);
-            info.AddValue("Message", m_data.Message);
-            info.AddValue("ThreadName", m_data.ThreadName);
-            // TODO: consider serializing UTC rather than local time.  Not implemented here because it
-            // would give an unexpected result if client and server have different versions of this class.
-            // info.AddValue("TimeStamp", m_data.TimeStampUtc);
-#pragma warning disable 618
-            info.AddValue("TimeStamp", m_data.TimeStamp);
-#pragma warning restore 618
-            info.AddValue("LocationInfo", m_data.LocationInfo);
-            info.AddValue("UserName", m_data.UserName);
-            info.AddValue("ExceptionString", m_data.ExceptionString);
-            info.AddValue("Properties", m_data.Properties);
-            info.AddValue("Domain", m_data.Domain);
-            info.AddValue("Identity", m_data.Identity);
-        }
-
-#endif
-
-        #endregion Implementation of ISerializable
-
-        #region Public Instance Methods
-
-        /// <summary>
-        /// Gets the portable data for this <see cref="LoggingEvent" />.
-        /// </summary>
-        /// <returns>The <see cref="LoggingEventData"/> for this event.</returns>
-        /// <remarks>
-        /// <para>
-        /// A new <see cref="LoggingEvent"/> can be constructed using a
-        /// <see cref="LoggingEventData"/> instance.
-        /// </para>
-        /// <para>
-        /// Does a <see cref="FixFlags.Partial"/> fix of the data
-        /// in the logging event before returning the event data.
-        /// </para>
-        /// </remarks>
-        public LoggingEventData GetLoggingEventData()
-        {
-            return GetLoggingEventData(FixFlags.Partial);
-        }
-
-        /// <summary>
-        /// Gets the portable data for this <see cref="LoggingEvent" />.
-        /// </summary>
-        /// <param name="fixFlags">The set of data to ensure is fixed in the LoggingEventData</param>
-        /// <returns>The <see cref="LoggingEventData"/> for this event.</returns>
-        /// <remarks>
-        /// <para>
-        /// A new <see cref="LoggingEvent"/> can be constructed using a
-        /// <see cref="LoggingEventData"/> instance.
-        /// </para>
-        /// </remarks>
-        public LoggingEventData GetLoggingEventData(FixFlags fixFlags)
-        {
-            Fix = fixFlags;
-            return m_data;
-        }
-
-        /// <summary>
-        /// Returns this event's exception's rendered using the 
-        /// <see cref="ILoggerRepository.RendererMap" />.
-        /// </summary>
-        /// <returns>
-        /// This event's exception's rendered using the <see cref="ILoggerRepository.RendererMap" />.
-        /// </returns>
-        /// <remarks>
-        /// <para>
-        /// <b>Obsolete. Use <see cref="GetExceptionString"/> instead.</b>
-        /// </para>
-        /// </remarks>
-        [Obsolete("Use GetExceptionString instead")]
-        public string GetExceptionStrRep()
-        {
-            return GetExceptionString();
-        }
-
-        /// <summary>
-        /// Returns this event's exception's rendered using the 
-        /// <see cref="ILoggerRepository.RendererMap" />.
-        /// </summary>
-        /// <returns>
-        /// This event's exception's rendered using the <see cref="ILoggerRepository.RendererMap" />.
-        /// </returns>
-        /// <remarks>
-        /// <para>
-        /// Returns this event's exception's rendered using the 
-        /// <see cref="ILoggerRepository.RendererMap" />.
-        /// </para>
-        /// </remarks>
-        public string GetExceptionString()
-        {
-            if (m_data.ExceptionString == null && this.m_cacheUpdatable)
-            {
-                if (m_thrownException != null)
-                {
-                    if (m_repository != null)
-                    {
-                        // Render exception using the repositories renderer map
-                        m_data.ExceptionString = m_repository.RendererMap.FindAndRender(m_thrownException);
-                    }
-                    else
-                    {
-                        // Very last resort
-                        m_data.ExceptionString = m_thrownException.ToString();
-                    }
-                }
-                else
-                {
-                    m_data.ExceptionString = "";
-                }
-            }
-
-            return m_data.ExceptionString;
-        }
-
-        /// <summary>
-        /// Fix instance fields that hold volatile data.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Some of the values in instances of <see cref="LoggingEvent"/>
-        /// are considered volatile, that is the values are correct at the
-        /// time the event is delivered to appenders, but will not be consistent
-        /// at any time afterwards. If an event is to be stored and then processed
-        /// at a later time these volatile values must be fixed by calling
-        /// <see cref="M:FixVolatileData()"/>. There is a performance penalty
-        /// incurred by calling <see cref="M:FixVolatileData()"/> but it
-        /// is essential to maintaining data consistency.
-        /// </para>
-        /// <para>
-        /// Calling <see cref="M:FixVolatileData()"/> is equivalent to
-        /// calling <see cref="M:FixVolatileData(bool)"/> passing the parameter
-        /// <c>false</c>.
-        /// </para>
-        /// <para>
-        /// See <see cref="M:FixVolatileData(bool)"/> for more
-        /// information.
-        /// </para>
-        /// </remarks>
-        [Obsolete("Use Fix property")]
-        public void FixVolatileData()
-        {
-            Fix = FixFlags.All;
-        }
-
-        /// <summary>
-        /// Fixes instance fields that hold volatile data.
-        /// </summary>
-        /// <param name="fastButLoose">Set to <c>true</c> to not fix data that takes a long time to fix.</param>
-        /// <remarks>
-        /// <para>
-        /// Some of the values in instances of <see cref="LoggingEvent"/>
-        /// are considered volatile, that is the values are correct at the
-        /// time the event is delivered to appenders, but will not be consistent
-        /// at any time afterwards. If an event is to be stored and then processed
-        /// at a later time these volatile values must be fixed by calling
-        /// <see cref="M:FixVolatileData()"/>. There is a performance penalty
-        /// for incurred by calling <see cref="M:FixVolatileData()"/> but it
-        /// is essential to maintaining data consistency.
-        /// </para>
-        /// <para>
-        /// The <paramref name="fastButLoose"/> param controls the data that
-        /// is fixed. Some of the data that can be fixed takes a long time to 
-        /// generate, therefore if you do not require those settings to be fixed
-        /// they can be ignored by setting the <paramref name="fastButLoose"/> param
-        /// to <c>true</c>. This setting will ignore the <see cref="LocationInformation"/>
-        /// and <see cref="UserName"/> settings.
-        /// </para>
-        /// <para>
-        /// Set <paramref name="fastButLoose"/> to <c>false</c> to ensure that all 
-        /// settings are fixed.
-        /// </para>
-        /// </remarks>
-        [Obsolete("Use Fix property")]
-        public void FixVolatileData(bool fastButLoose)
-        {
-            if (fastButLoose)
-            {
-                Fix = FixFlags.Partial;
-            }
-            else
-            {
-                Fix = FixFlags.All;
-            }
-        }
-
-        /// <summary>
-        /// Fix the fields specified by the <see cref="FixFlags"/> parameter
-        /// </summary>
-        /// <param name="flags">the fields to fix</param>
-        /// <remarks>
-        /// <para>
-        /// Only fields specified in the <paramref name="flags"/> will be fixed.
-        /// Fields will not be fixed if they have previously been fixed.
-        /// It is not possible to 'unfix' a field.
-        /// </para>
-        /// </remarks>
-        protected virtual void FixVolatileData(FixFlags flags)
-        {
-            object forceCreation = null;
-
-            //Unlock the cache so that new values can be stored
-            //This may not be ideal if we are no longer in the correct context
-            //and someone calls fix. 
-            m_cacheUpdatable = true;
-
-            // determine the flags that we are actually fixing
-            var updateFlags = (FixFlags)((flags ^ m_fixFlags) & flags);
-
-            if (updateFlags > 0)
-            {
-                if ((updateFlags & FixFlags.Message) != 0)
-                {
-                    // Force the message to be rendered
-                    forceCreation = this.RenderedMessage;
-
-                    m_fixFlags |= FixFlags.Message;
-                }
-
-                if ((updateFlags & FixFlags.ThreadName) != 0)
-                {
-                    // Grab the thread name
-                    forceCreation = this.ThreadName;
-
-                    m_fixFlags |= FixFlags.ThreadName;
-                }
-
-                if ((updateFlags & FixFlags.LocationInfo) != 0)
-                {
-                    // Force the location information to be loaded
-                    forceCreation = this.LocationInformation;
-
-                    m_fixFlags |= FixFlags.LocationInfo;
-                }
-
-                if ((updateFlags & FixFlags.UserName) != 0)
-                {
-                    // Grab the user name
-                    forceCreation = this.UserName;
-
-                    m_fixFlags |= FixFlags.UserName;
-                }
-
-                if ((updateFlags & FixFlags.Domain) != 0)
-                {
-                    // Grab the domain name
-                    forceCreation = this.Domain;
-
-                    m_fixFlags |= FixFlags.Domain;
-                }
-
-                if ((updateFlags & FixFlags.Identity) != 0)
-                {
-                    // Grab the identity
-                    forceCreation = this.Identity;
-
-                    m_fixFlags |= FixFlags.Identity;
-                }
-
-                if ((updateFlags & FixFlags.Exception) != 0)
-                {
-                    // Force the exception text to be loaded
-                    forceCreation = GetExceptionString();
-
-                    m_fixFlags |= FixFlags.Exception;
-                }
-
-                if ((updateFlags & FixFlags.Properties) != 0)
-                {
-                    CacheProperties();
-
-                    m_fixFlags |= FixFlags.Properties;
-                }
-            }
-
-            // avoid warning CS0219
-            if (forceCreation != null)
-            {
-            }
-
-            //Finaly lock everything we've cached.
-            m_cacheUpdatable = false;
-        }
-
-        #endregion Public Instance Methods
-
-        #region Protected Instance Methods
-
-        private void CreateCompositeProperties()
-        {
-            var compositeProperties = new CompositeProperties();
-
-            if (m_eventProperties != null)
-            {
-                compositeProperties.Add(m_eventProperties);
-            }
-#if !NETCF
-            var logicalThreadProperties = LogicalThreadContext.Properties.GetProperties(false);
-            if (logicalThreadProperties != null)
-            {
-                compositeProperties.Add(logicalThreadProperties);
-            }
-#endif
-            var threadProperties = ThreadContext.Properties.GetProperties(false);
-            if (threadProperties != null)
-            {
-                compositeProperties.Add(threadProperties);
-            }
-
-            // TODO: Add Repository Properties
-
-            // event properties
-            var shouldFixUserName = (m_fixFlags & FixFlags.UserName) != 0;
-            var shouldFixIdentity = (m_fixFlags & FixFlags.Identity) != 0;
-            if (shouldFixIdentity || shouldFixUserName)
-            {
-                var eventProperties = new PropertiesDictionary();
-                if (shouldFixUserName)
-                {
-                    eventProperties[UserNameProperty] = UserName;
-                }
-
-                if (shouldFixIdentity)
-                {
-                    eventProperties[IdentityProperty] = Identity;
-                }
-
-                compositeProperties.Add(eventProperties);
-            }
-
-            compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties());
-            m_compositeProperties = compositeProperties;
-        }
-
-        private void CacheProperties()
-        {
-            if (m_data.Properties == null && this.m_cacheUpdatable)
-            {
-                if (m_compositeProperties == null)
-                {
-                    CreateCompositeProperties();
-                }
-
-                var flattenedProperties = m_compositeProperties.Flatten();
-
-                var fixedProperties = new PropertiesDictionary();
-
-                // Validate properties
-                foreach (DictionaryEntry entry in flattenedProperties)
-                {
-                    var key = entry.Key as string;
-
-                    if (key != null)
-                    {
-                        var val = entry.Value;
-
-                        // Fix any IFixingRequired objects
-                        var fixingRequired = val as IFixingRequired;
-                        if (fixingRequired != null)
-                        {
-                            val = fixingRequired.GetFixedObject();
-                        }
-
-                        // Strip keys with null values
-                        if (val != null)
-                        {
-                            fixedProperties[key] = val;
-                        }
-                    }
-                }
-
-                m_data.Properties = fixedProperties;
-            }
-        }
-
-        /// <summary>
-        /// Lookup a composite property in this event
-        /// </summary>
-        /// <param name="key">the key for the property to lookup</param>
-        /// <returns>the value for the property</returns>
-        /// <remarks>
-        /// <para>
-        /// This event has composite properties that combine together properties from
-        /// several different contexts in the following order:
-        /// <list type="definition">
-        ///		<item>
-        /// 		<term>this events properties</term>
-        /// 		<description>
-        /// 		This event has <see cref="Properties"/> that can be set. These 
-        /// 		properties are specific to this event only.
-        /// 		</description>
-        /// 	</item>
-        /// 	<item>
-        /// 		<term>the thread properties</term>
-        /// 		<description>
-        /// 		The <see cref="ThreadContext.Properties"/> that are set on the current
-        /// 		thread. These properties are shared by all events logged on this thread.
-        /// 		</description>
-        /// 	</item>
-        /// 	<item>
-        /// 		<term>the global properties</term>
-        /// 		<description>
-        /// 		The <see cref="GlobalContext.Properties"/> that are set globally. These 
-        /// 		properties are shared by all the threads in the AppDomain.
-        /// 		</description>
-        /// 	</item>
-        /// </list>
-        /// </para>
-        /// </remarks>
-        public object LookupProperty(string key)
-        {
-            if (m_data.Properties != null)
-            {
-                return m_data.Properties[key];
-            }
-
-            if (m_compositeProperties == null)
-            {
-                CreateCompositeProperties();
-            }
-
-            return m_compositeProperties[key];
-        }
-
-        /// <summary>
-        /// Get all the composite properties in this event
-        /// </summary>
-        /// <returns>the <see cref="PropertiesDictionary"/> containing all the properties</returns>
-        /// <remarks>
-        /// <para>
-        /// See <see cref="LookupProperty"/> for details of the composite properties 
-        /// stored by the event.
-        /// </para>
-        /// <para>
-        /// This method returns a single <see cref="PropertiesDictionary"/> containing all the
-        /// properties defined for this event.
-        /// </para>
-        /// </remarks>
-        public PropertiesDictionary GetProperties()
-        {
-            if (m_data.Properties != null)
-            {
-                return m_data.Properties;
-            }
-
-            if (m_compositeProperties == null)
-            {
-                CreateCompositeProperties();
-            }
-
-            return m_compositeProperties.Flatten();
-        }
-
-        #endregion Public Instance Methods
-
-        #region Private Instance Fields
-
-        /// <summary>
-        /// The internal logging event data.
-        /// </summary>
-        private LoggingEventData m_data;
-
-        /// <summary>
-        /// The internal logging event data.
-        /// </summary>
-        private CompositeProperties m_compositeProperties;
-
-        /// <summary>
-        /// The internal logging event data.
-        /// </summary>
-        private PropertiesDictionary m_eventProperties;
-
-        /// <summary>
-        /// The fully qualified Type of the calling 
-        /// logger class in the stack frame (i.e. the declaring type of the method).
-        /// </summary>
-        private readonly Type m_callerStackBoundaryDeclaringType;
-
-        /// <summary>
-        /// The application supplied message of logging event.
-        /// </summary>
-        private object m_message;
-
-        /// <summary>
-        /// The exception that was thrown.
-        /// </summary>
-        /// <remarks>
-        /// This is not serialized. The string representation
-        /// is serialized instead.
-        /// </remarks>
-        private readonly Exception m_thrownException;
-
-        /// <summary>
-        /// The repository that generated the logging event
-        /// </summary>
-        /// <remarks>
-        /// This is not serialized.
-        /// </remarks>
-        private ILoggerRepository m_repository = null;
-
-        /// <summary>
-        /// The fix state for this event
-        /// </summary>
-        /// <remarks>
-        /// These flags indicate which fields have been fixed.
-        /// Not serialized.
-        /// </remarks>
-        private FixFlags m_fixFlags = FixFlags.None;
-
-        /// <summary>
-        /// Indicated that the internal cache is updateable (ie not fixed)
-        /// </summary>
-        /// <remarks>
-        /// This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler
-        /// changes in the caching strategy.
-        /// </remarks>
-        private bool m_cacheUpdatable = true;
-
-        #endregion Private Instance Fields
-
-        #region Constants
-
-        /// <summary>
-        /// The key into the Properties map for the host name value.
-        /// </summary>
-        public const string HostNameProperty = "log4net:HostName";
-
-        /// <summary>
-        /// The key into the Properties map for the thread identity value.
-        /// </summary>
-        public const string IdentityProperty = "log4net:Identity";
-
-        /// <summary>
-        /// The key into the Properties map for the user name value.
-        /// </summary>
-        public const string UserNameProperty = "log4net:UserName";
-
-        #endregion
+      if (fastButLoose)
+      {
+        Fix = FixFlags.Partial;
+      }
+      else
+      {
+        Fix = FixFlags.All;
+      }
     }
+
+    /// <summary>
+    /// Fix the fields specified by the <see cref="FixFlags"/> parameter
+    /// </summary>
+    /// <param name="flags">the fields to fix</param>
+    /// <remarks>
+    /// <para>
+    /// Only fields specified in the <paramref name="flags"/> will be fixed.
+    /// Fields will not be fixed if they have previously been fixed.
+    /// It is not possible to 'unfix' a field.
+    /// </para>
+    /// </remarks>
+    protected virtual void FixVolatileData(FixFlags flags)
+    {
+      object forceCreation = null;
+
+      //Unlock the cache so that new values can be stored
+      //This may not be ideal if we are no longer in the correct context
+      //and someone calls fix. 
+      m_cacheUpdatable = true;
+
+      // determine the flags that we are actually fixing
+      var updateFlags = (FixFlags)((flags ^ m_fixFlags) & flags);
+
+      if (updateFlags > 0)
+      {
+        if ((updateFlags & FixFlags.Message) != 0)
+        {
+          // Force the message to be rendered
+          forceCreation = this.RenderedMessage;
+
+          m_fixFlags |= FixFlags.Message;
+        }
+
+        if ((updateFlags & FixFlags.ThreadName) != 0)
+        {
+          // Grab the thread name
+          forceCreation = this.ThreadName;
+
+          m_fixFlags |= FixFlags.ThreadName;
+        }
+
+        if ((updateFlags & FixFlags.LocationInfo) != 0)
+        {
+          // Force the location information to be loaded
+          forceCreation = this.LocationInformation;
+
+          m_fixFlags |= FixFlags.LocationInfo;
+        }
+
+        if ((updateFlags & FixFlags.UserName) != 0)
+        {
+          // Grab the user name
+          forceCreation = this.UserName;
+
+          m_fixFlags |= FixFlags.UserName;
+        }
+
+        if ((updateFlags & FixFlags.Domain) != 0)
+        {
+          // Grab the domain name
+          forceCreation = this.Domain;
+
+          m_fixFlags |= FixFlags.Domain;
+        }
+
+        if ((updateFlags & FixFlags.Identity) != 0)
+        {
+          // Grab the identity
+          forceCreation = this.Identity;
+
+          m_fixFlags |= FixFlags.Identity;
+        }
+
+        if ((updateFlags & FixFlags.Exception) != 0)
+        {
+          // Force the exception text to be loaded
+          forceCreation = GetExceptionString();
+
+          m_fixFlags |= FixFlags.Exception;
+        }
+
+        if ((updateFlags & FixFlags.Properties) != 0)
+        {
+          CacheProperties();
+
+          m_fixFlags |= FixFlags.Properties;
+        }
+      }
+
+      // avoid warning CS0219
+      if (forceCreation != null)
+      {
+      }
+
+      //Finaly lock everything we've cached.
+      m_cacheUpdatable = false;
+    }
+
+    #endregion Public Instance Methods
+
+    #region Protected Instance Methods
+
+    private void CreateCompositeProperties()
+    {
+      var compositeProperties = new CompositeProperties();
+
+      if (m_eventProperties != null)
+      {
+        compositeProperties.Add(m_eventProperties);
+      }
+#if !NETCF
+      var logicalThreadProperties = LogicalThreadContext.Properties.GetProperties(false);
+      if (logicalThreadProperties != null)
+      {
+        compositeProperties.Add(logicalThreadProperties);
+      }
+#endif
+      var threadProperties = ThreadContext.Properties.GetProperties(false);
+      if (threadProperties != null)
+      {
+        compositeProperties.Add(threadProperties);
+      }
+
+      // TODO: Add Repository Properties
+
+      // event properties
+      var shouldFixUserName = (m_fixFlags & FixFlags.UserName) != 0;
+      var shouldFixIdentity = (m_fixFlags & FixFlags.Identity) != 0;
+      if (shouldFixIdentity || shouldFixUserName)
+      {
+        var eventProperties = new PropertiesDictionary();
+        if (shouldFixUserName)
+        {
+          eventProperties[UserNameProperty] = UserName;
+        }
+
+        if (shouldFixIdentity)
+        {
+          eventProperties[IdentityProperty] = Identity;
+        }
+
+        compositeProperties.Add(eventProperties);
+      }
+
+      compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties());
+      m_compositeProperties = compositeProperties;
+    }
+
+    private void CacheProperties()
+    {
+      if (m_data.Properties == null && this.m_cacheUpdatable)
+      {
+        if (m_compositeProperties == null)
+        {
+          CreateCompositeProperties();
+        }
+
+        var flattenedProperties = m_compositeProperties.Flatten();
+
+        var fixedProperties = new PropertiesDictionary();
+
+        // Validate properties
+        foreach (DictionaryEntry entry in flattenedProperties)
+        {
+          var key = entry.Key as string;
+
+          if (key != null)
+          {
+            var val = entry.Value;
+
+            // Fix any IFixingRequired objects
+            var fixingRequired = val as IFixingRequired;
+            if (fixingRequired != null)
+            {
+              val = fixingRequired.GetFixedObject();
+            }
+
+            // Strip keys with null values
+            if (val != null)
+            {
+              fixedProperties[key] = val;
+            }
+          }
+        }
+
+        m_data.Properties = fixedProperties;
+      }
+    }
+
+    /// <summary>
+    /// Lookup a composite property in this event
+    /// </summary>
+    /// <param name="key">the key for the property to lookup</param>
+    /// <returns>the value for the property</returns>
+    /// <remarks>
+    /// <para>
+    /// This event has composite properties that combine together properties from
+    /// several different contexts in the following order:
+    /// <list type="definition">
+    ///    <item>
+    ///     <term>this events properties</term>
+    ///     <description>
+    ///     This event has <see cref="Properties"/> that can be set. These 
+    ///     properties are specific to this event only.
+    ///     </description>
+    ///   </item>
+    ///   <item>
+    ///     <term>the thread properties</term>
+    ///     <description>
+    ///     The <see cref="ThreadContext.Properties"/> that are set on the current
+    ///     thread. These properties are shared by all events logged on this thread.
+    ///     </description>
+    ///   </item>
+    ///   <item>
+    ///     <term>the global properties</term>
+    ///     <description>
+    ///     The <see cref="GlobalContext.Properties"/> that are set globally. These 
+    ///     properties are shared by all the threads in the AppDomain.
+    ///     </description>
+    ///   </item>
+    /// </list>
+    /// </para>
+    /// </remarks>
+    public object LookupProperty(string key)
+    {
+      if (m_data.Properties != null)
+      {
+        return m_data.Properties[key];
+      }
+
+      if (m_compositeProperties == null)
+      {
+        CreateCompositeProperties();
+      }
+
+      return m_compositeProperties[key];
+    }
+
+    /// <summary>
+    /// Get all the composite properties in this event
+    /// </summary>
+    /// <returns>the <see cref="PropertiesDictionary"/> containing all the properties</returns>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="LookupProperty"/> for details of the composite properties 
+    /// stored by the event.
+    /// </para>
+    /// <para>
+    /// This method returns a single <see cref="PropertiesDictionary"/> containing all the
+    /// properties defined for this event.
+    /// </para>
+    /// </remarks>
+    public PropertiesDictionary GetProperties()
+    {
+      if (m_data.Properties != null)
+      {
+        return m_data.Properties;
+      }
+
+      if (m_compositeProperties == null)
+      {
+        CreateCompositeProperties();
+      }
+
+      return m_compositeProperties.Flatten();
+    }
+
+    #endregion Public Instance Methods
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// The internal logging event data.
+    /// </summary>
+    private LoggingEventData m_data;
+
+    /// <summary>
+    /// The internal logging event data.
+    /// </summary>
+    private CompositeProperties m_compositeProperties;
+
+    /// <summary>
+    /// The internal logging event data.
+    /// </summary>
+    private PropertiesDictionary m_eventProperties;
+
+    /// <summary>
+    /// The fully qualified Type of the calling 
+    /// logger class in the stack frame (i.e. the declaring type of the method).
+    /// </summary>
+    private readonly Type m_callerStackBoundaryDeclaringType;
+
+    /// <summary>
+    /// The application supplied message of logging event.
+    /// </summary>
+    private object m_message;
+
+    /// <summary>
+    /// The exception that was thrown.
+    /// </summary>
+    /// <remarks>
+    /// This is not serialized. The string representation
+    /// is serialized instead.
+    /// </remarks>
+    private readonly Exception m_thrownException;
+
+    /// <summary>
+    /// The repository that generated the logging event
+    /// </summary>
+    /// <remarks>
+    /// This is not serialized.
+    /// </remarks>
+    private ILoggerRepository m_repository = null;
+
+    /// <summary>
+    /// The fix state for this event
+    /// </summary>
+    /// <remarks>
+    /// These flags indicate which fields have been fixed.
+    /// Not serialized.
+    /// </remarks>
+    private FixFlags m_fixFlags = FixFlags.None;
+
+    /// <summary>
+    /// Indicated that the internal cache is updateable (ie not fixed)
+    /// </summary>
+    /// <remarks>
+    /// This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler
+    /// changes in the caching strategy.
+    /// </remarks>
+    private bool m_cacheUpdatable = true;
+
+    #endregion Private Instance Fields
+
+    #region Constants
+
+    /// <summary>
+    /// The key into the Properties map for the host name value.
+    /// </summary>
+    public const string HostNameProperty = "log4net:HostName";
+
+    /// <summary>
+    /// The key into the Properties map for the thread identity value.
+    /// </summary>
+    public const string IdentityProperty = "log4net:Identity";
+
+    /// <summary>
+    /// The key into the Properties map for the user name value.
+    /// </summary>
+    public const string UserNameProperty = "log4net:UserName";
+
+    #endregion
+  }
 }
\ No newline at end of file
diff --git a/src/log4net/Core/MethodItem.cs b/src/log4net/Core/MethodItem.cs
index 6d3ca19..113cd37 100644
--- a/src/log4net/Core/MethodItem.cs
+++ b/src/log4net/Core/MethodItem.cs
@@ -23,148 +23,148 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// provides method information without actually referencing a System.Reflection.MethodBase
-	/// as that would require that the containing assembly is loaded.
-	/// </summary>
-	/// 
+  /// <summary>
+  /// provides method information without actually referencing a System.Reflection.MethodBase
+  /// as that would require that the containing assembly is loaded.
+  /// </summary>
+  /// 
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
-	public class MethodItem
-	{
-		#region Public Instance Constructors
+  public class MethodItem
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// constructs a method item for an unknown method.
-		/// </summary>
-		public MethodItem()
-		{
-			m_name = NA;
-			m_parameters = new string[0];
-		}
+    /// <summary>
+    /// constructs a method item for an unknown method.
+    /// </summary>
+    public MethodItem()
+    {
+      m_name = NA;
+      m_parameters = new string[0];
+    }
 
-		/// <summary>
-		/// constructs a method item from the name of the method.
-		/// </summary>
-		/// <param name="name"></param>
-		public MethodItem(string name)
-			: this()
-		{
-			m_name = name;
-		}
+    /// <summary>
+    /// constructs a method item from the name of the method.
+    /// </summary>
+    /// <param name="name"></param>
+    public MethodItem(string name)
+      : this()
+    {
+      m_name = name;
+    }
 
-		/// <summary>
-		/// constructs a method item from the name of the method and its parameters.
-		/// </summary>
-		/// <param name="name"></param>
-		/// <param name="parameters"></param>
-		public MethodItem(string name, string[] parameters)
-			: this(name)
-		{
-			m_parameters = parameters;
-		}
+    /// <summary>
+    /// constructs a method item from the name of the method and its parameters.
+    /// </summary>
+    /// <param name="name"></param>
+    /// <param name="parameters"></param>
+    public MethodItem(string name, string[] parameters)
+      : this(name)
+    {
+      m_parameters = parameters;
+    }
 
-        /// <summary>
-        /// constructs a method item from a method base by determining the method name and its parameters.
-        /// </summary>
-        /// <param name="methodBase"></param>
-		public MethodItem(System.Reflection.MethodBase methodBase)
-			: this(methodBase.Name, GetMethodParameterNames(methodBase))
+    /// <summary>
+    /// constructs a method item from a method base by determining the method name and its parameters.
+    /// </summary>
+    /// <param name="methodBase"></param>
+    public MethodItem(System.Reflection.MethodBase methodBase)
+      : this(methodBase.Name, GetMethodParameterNames(methodBase))
+    {
+    }
+
+    #endregion
+
+    private static string[] GetMethodParameterNames(System.Reflection.MethodBase methodBase)
+    {
+      ArrayList methodParameterNames = new ArrayList();
+      try
+      {
+        System.Reflection.ParameterInfo[] methodBaseGetParameters = methodBase.GetParameters();
+
+        int methodBaseGetParametersCount = methodBaseGetParameters.GetUpperBound(0);
+
+        for (int i = 0; i <= methodBaseGetParametersCount; i++)
         {
-		}
+          methodParameterNames.Add(methodBaseGetParameters[i].ParameterType + " " + methodBaseGetParameters[i].Name);
+        }
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "An exception ocurred while retreiving method parameters.", ex);
+      }
 
-		#endregion
+      return (string[])methodParameterNames.ToArray(typeof(string));
+    }
 
-		private static string[] GetMethodParameterNames(System.Reflection.MethodBase methodBase)
-		{
-			ArrayList methodParameterNames = new ArrayList();
-			try
-			{
-				System.Reflection.ParameterInfo[] methodBaseGetParameters = methodBase.GetParameters();
+    #region Public Instance Properties
 
-				int methodBaseGetParametersCount = methodBaseGetParameters.GetUpperBound(0);
+    /// <summary>
+    /// Gets the method name of the caller making the logging 
+    /// request.
+    /// </summary>
+    /// <value>
+    /// The method name of the caller making the logging 
+    /// request.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the method name of the caller making the logging 
+    /// request.
+    /// </para>
+    /// </remarks>
+    public string Name
+    {
+      get { return m_name; }
+    }
 
-				for (int i = 0; i <= methodBaseGetParametersCount; i++)
-				{
-					methodParameterNames.Add(methodBaseGetParameters[i].ParameterType + " " + methodBaseGetParameters[i].Name);
-				}
-			}
-			catch (Exception ex)
-			{
-				LogLog.Error(declaringType, "An exception ocurred while retreiving method parameters.", ex);
-			}
+    /// <summary>
+    /// Gets the method parameters of the caller making
+    /// the logging request.
+    /// </summary>
+    /// <value>
+    /// The method parameters of the caller making
+    /// the logging request
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the method parameters of the caller making
+    /// the logging request.
+    /// </para>
+    /// </remarks>
+    public string[] Parameters
+    {
+      get { return m_parameters; }
+    }
 
-			return (string[])methodParameterNames.ToArray(typeof(string));
-		}
+    #endregion
 
-		#region Public Instance Properties
+    #region Private Instance Fields
 
-		/// <summary>
-		/// Gets the method name of the caller making the logging 
-		/// request.
-		/// </summary>
-		/// <value>
-		/// The method name of the caller making the logging 
-		/// request.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the method name of the caller making the logging 
-		/// request.
-		/// </para>
-		/// </remarks>
-		public string Name
-		{
-			get { return m_name; }
-		}
+    private readonly string m_name;
+    private readonly string[] m_parameters;
 
-		/// <summary>
-		/// Gets the method parameters of the caller making
-		/// the logging request.
-		/// </summary>
-		/// <value>
-		/// The method parameters of the caller making
-		/// the logging request
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the method parameters of the caller making
-		/// the logging request.
-		/// </para>
-		/// </remarks>
-		public string[] Parameters
-		{
-			get { return m_parameters; }
-		}
+    #endregion
 
-		#endregion
+    #region Private Static Fields
 
-		#region Private Instance Fields
+    /// <summary>
+    /// The fully qualified type of the StackFrameItem class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(MethodItem);
 
-		private readonly string m_name;
-		private readonly string[] m_parameters;
+    /// <summary>
+    /// When location information is not available the constant
+    /// <c>NA</c> is returned. Current value of this string
+    /// constant is <b>?</b>.
+    /// </summary>
+    private const string NA = "?";
 
-		#endregion
-
-		#region Private Static Fields
-
-		/// <summary>
-		/// The fully qualified type of the StackFrameItem class.
-		/// </summary>
-		/// <remarks>
-		/// Used by the internal logger to record the Type of the
-		/// log message.
-		/// </remarks>
-		private static readonly Type declaringType = typeof(MethodItem);
-
-		/// <summary>
-		/// When location information is not available the constant
-		/// <c>NA</c> is returned. Current value of this string
-		/// constant is <b>?</b>.
-		/// </summary>
-		private const string NA = "?";
-
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Core/SecurityContext.cs b/src/log4net/Core/SecurityContext.cs
index fecad2b..e454c86 100644
--- a/src/log4net/Core/SecurityContext.cs
+++ b/src/log4net/Core/SecurityContext.cs
@@ -21,35 +21,35 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// A SecurityContext used by log4net when interacting with protected resources
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A SecurityContext used by log4net when interacting with protected resources
-	/// for example with operating system services. This can be used to impersonate
-	/// a principal that has been granted privileges on the system resources.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public abstract class SecurityContext
-	{
-		/// <summary>
-		/// Impersonate this SecurityContext
-		/// </summary>
-		/// <param name="state">State supplied by the caller</param>
-		/// <returns>An <see cref="IDisposable"/> instance that will
-		/// revoke the impersonation of this SecurityContext, or <c>null</c></returns>
-		/// <remarks>
-		/// <para>
-		/// Impersonate this security context. Further calls on the current
-		/// thread should now be made in the security context provided
-		/// by this object. When the <see cref="IDisposable"/> result 
-		/// <see cref="IDisposable.Dispose"/> method is called the security
-		/// context of the thread should be reverted to the state it was in
-		/// before <see cref="Impersonate"/> was called.
-		/// </para>
-		/// </remarks>
-		public abstract IDisposable Impersonate(object state);
-	}
+  /// <summary>
+  /// A SecurityContext used by log4net when interacting with protected resources
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A SecurityContext used by log4net when interacting with protected resources
+  /// for example with operating system services. This can be used to impersonate
+  /// a principal that has been granted privileges on the system resources.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public abstract class SecurityContext
+  {
+    /// <summary>
+    /// Impersonate this SecurityContext
+    /// </summary>
+    /// <param name="state">State supplied by the caller</param>
+    /// <returns>An <see cref="IDisposable"/> instance that will
+    /// revoke the impersonation of this SecurityContext, or <c>null</c></returns>
+    /// <remarks>
+    /// <para>
+    /// Impersonate this security context. Further calls on the current
+    /// thread should now be made in the security context provided
+    /// by this object. When the <see cref="IDisposable"/> result 
+    /// <see cref="IDisposable.Dispose"/> method is called the security
+    /// context of the thread should be reverted to the state it was in
+    /// before <see cref="Impersonate"/> was called.
+    /// </para>
+    /// </remarks>
+    public abstract IDisposable Impersonate(object state);
+  }
 }
diff --git a/src/log4net/Core/SecurityContextProvider.cs b/src/log4net/Core/SecurityContextProvider.cs
index f6e99e6..a887b04 100644
--- a/src/log4net/Core/SecurityContextProvider.cs
+++ b/src/log4net/Core/SecurityContextProvider.cs
@@ -23,102 +23,102 @@
 
 namespace log4net.Core
 {
-	/// <summary>
-	/// The <see cref="SecurityContextProvider"/> providers default <see cref="SecurityContext"/> instances.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A configured component that interacts with potentially protected system
-	/// resources uses a <see cref="SecurityContext"/> to provide the elevated
-	/// privileges required. If the <see cref="SecurityContext"/> object has
-	/// been not been explicitly provided to the component then the component
-	/// will request one from this <see cref="SecurityContextProvider"/>.
-	/// </para>
-	/// <para>
-	/// By default the <see cref="SecurityContextProvider.DefaultProvider"/> is
-	/// an instance of <see cref="SecurityContextProvider"/> which returns only
-	/// <see cref="NullSecurityContext"/> objects. This is a reasonable default
-	/// where the privileges required are not know by the system.
-	/// </para>
-	/// <para>
-	/// This default behavior can be overridden by subclassing the <see cref="SecurityContextProvider"/>
-	/// and overriding the <see cref="CreateSecurityContext"/> method to return
-	/// the desired <see cref="SecurityContext"/> objects. The default provider
-	/// can be replaced by programmatically setting the value of the 
-	/// <see cref="SecurityContextProvider.DefaultProvider"/> property.
-	/// </para>
-	/// <para>
-	/// An alternative is to use the <c>log4net.Config.SecurityContextProviderAttribute</c>
-	/// This attribute can be applied to an assembly in the same way as the
-	/// <c>log4net.Config.XmlConfiguratorAttribute"</c>. The attribute takes
-	/// the type to use as the <see cref="SecurityContextProvider"/> as an argument.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class SecurityContextProvider
-	{
-		/// <summary>
-		/// The default provider
-		/// </summary>
-		private static SecurityContextProvider s_defaultProvider = new SecurityContextProvider();
+  /// <summary>
+  /// The <see cref="SecurityContextProvider"/> providers default <see cref="SecurityContext"/> instances.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A configured component that interacts with potentially protected system
+  /// resources uses a <see cref="SecurityContext"/> to provide the elevated
+  /// privileges required. If the <see cref="SecurityContext"/> object has
+  /// been not been explicitly provided to the component then the component
+  /// will request one from this <see cref="SecurityContextProvider"/>.
+  /// </para>
+  /// <para>
+  /// By default the <see cref="SecurityContextProvider.DefaultProvider"/> is
+  /// an instance of <see cref="SecurityContextProvider"/> which returns only
+  /// <see cref="NullSecurityContext"/> objects. This is a reasonable default
+  /// where the privileges required are not know by the system.
+  /// </para>
+  /// <para>
+  /// This default behavior can be overridden by subclassing the <see cref="SecurityContextProvider"/>
+  /// and overriding the <see cref="CreateSecurityContext"/> method to return
+  /// the desired <see cref="SecurityContext"/> objects. The default provider
+  /// can be replaced by programmatically setting the value of the 
+  /// <see cref="SecurityContextProvider.DefaultProvider"/> property.
+  /// </para>
+  /// <para>
+  /// An alternative is to use the <c>log4net.Config.SecurityContextProviderAttribute</c>
+  /// This attribute can be applied to an assembly in the same way as the
+  /// <c>log4net.Config.XmlConfiguratorAttribute"</c>. The attribute takes
+  /// the type to use as the <see cref="SecurityContextProvider"/> as an argument.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class SecurityContextProvider
+  {
+    /// <summary>
+    /// The default provider
+    /// </summary>
+    private static SecurityContextProvider s_defaultProvider = new SecurityContextProvider();
 
-		/// <summary>
-		/// Gets or sets the default SecurityContextProvider
-		/// </summary>
-		/// <value>
-		/// The default SecurityContextProvider
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The default provider is used by configured components that
-		/// require a <see cref="SecurityContext"/> and have not had one
-		/// given to them.
-		/// </para>
-		/// <para>
-		/// By default this is an instance of <see cref="SecurityContextProvider"/>
-		/// that returns <see cref="NullSecurityContext"/> objects.
-		/// </para>
-		/// <para>
-		/// The default provider can be set programmatically by setting
-		/// the value of this property to a sub class of <see cref="SecurityContextProvider"/>
-		/// that has the desired behavior.
-		/// </para>
-		/// </remarks>
-		public static SecurityContextProvider DefaultProvider
-		{
-			get { return s_defaultProvider; }
-			set { s_defaultProvider = value; }
-		}
+    /// <summary>
+    /// Gets or sets the default SecurityContextProvider
+    /// </summary>
+    /// <value>
+    /// The default SecurityContextProvider
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The default provider is used by configured components that
+    /// require a <see cref="SecurityContext"/> and have not had one
+    /// given to them.
+    /// </para>
+    /// <para>
+    /// By default this is an instance of <see cref="SecurityContextProvider"/>
+    /// that returns <see cref="NullSecurityContext"/> objects.
+    /// </para>
+    /// <para>
+    /// The default provider can be set programmatically by setting
+    /// the value of this property to a sub class of <see cref="SecurityContextProvider"/>
+    /// that has the desired behavior.
+    /// </para>
+    /// </remarks>
+    public static SecurityContextProvider DefaultProvider
+    {
+      get { return s_defaultProvider; }
+      set { s_defaultProvider = value; }
+    }
 
-		/// <summary>
-		/// Protected default constructor to allow subclassing
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Protected default constructor to allow subclassing
-		/// </para>
-		/// </remarks>
-		protected SecurityContextProvider()
-		{
-		}
+    /// <summary>
+    /// Protected default constructor to allow subclassing
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Protected default constructor to allow subclassing
+    /// </para>
+    /// </remarks>
+    protected SecurityContextProvider()
+    {
+    }
 
-		/// <summary>
-		/// Create a SecurityContext for a consumer
-		/// </summary>
-		/// <param name="consumer">The consumer requesting the SecurityContext</param>
-		/// <returns>An impersonation context</returns>
-		/// <remarks>
-		/// <para>
-		/// The default implementation is to return a <see cref="NullSecurityContext"/>.
-		/// </para>
-		/// <para>
-		/// Subclasses should override this method to provide their own
-		/// behavior.
-		/// </para>
-		/// </remarks>
-		public virtual SecurityContext CreateSecurityContext(object consumer)
-		{
-			return NullSecurityContext.Instance;
-		}
-	}
+    /// <summary>
+    /// Create a SecurityContext for a consumer
+    /// </summary>
+    /// <param name="consumer">The consumer requesting the SecurityContext</param>
+    /// <returns>An impersonation context</returns>
+    /// <remarks>
+    /// <para>
+    /// The default implementation is to return a <see cref="NullSecurityContext"/>.
+    /// </para>
+    /// <para>
+    /// Subclasses should override this method to provide their own
+    /// behavior.
+    /// </para>
+    /// </remarks>
+    public virtual SecurityContext CreateSecurityContext(object consumer)
+    {
+      return NullSecurityContext.Instance;
+    }
+  }
 }
diff --git a/src/log4net/Core/StackFrameItem.cs b/src/log4net/Core/StackFrameItem.cs
index 1719326..abad979 100644
--- a/src/log4net/Core/StackFrameItem.cs
+++ b/src/log4net/Core/StackFrameItem.cs
@@ -24,172 +24,172 @@
 
 namespace log4net.Core
 {
+  /// <summary>
+  /// provides stack frame information without actually referencing a System.Diagnostics.StackFrame
+  /// as that would require that the containing assembly is loaded.
+  /// </summary>
+  /// 
+  [Serializable]
+  public class StackFrameItem
+  {
+    #region Public Instance Constructors
+
     /// <summary>
-    /// provides stack frame information without actually referencing a System.Diagnostics.StackFrame
-    /// as that would require that the containing assembly is loaded.
+    /// returns a stack frame item from a stack frame. This 
     /// </summary>
-    /// 
-    [Serializable]
-    public class StackFrameItem
+    /// <param name="frame"></param>
+    /// <returns></returns>
+    public StackFrameItem(StackFrame frame)
     {
-        #region Public Instance Constructors
+      // set default values
+      m_lineNumber = NA;
+      m_fileName = NA;
+      m_method = new MethodItem();
+      m_className = NA;
 
-        /// <summary>
-        /// returns a stack frame item from a stack frame. This 
-        /// </summary>
-        /// <param name="frame"></param>
-        /// <returns></returns>
-        public StackFrameItem(StackFrame frame)
+      try
+      {
+        // get frame values
+        m_lineNumber = frame.GetFileLineNumber().ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
+        m_fileName = frame.GetFileName();
+        // get method values
+        MethodBase method = frame.GetMethod();
+        if (method != null)
         {
-            // set default values
-            m_lineNumber = NA;
-            m_fileName = NA;
-            m_method = new MethodItem();
-            m_className = NA;
-
-			try
-			{
-				// get frame values
-				m_lineNumber = frame.GetFileLineNumber().ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
-				m_fileName = frame.GetFileName();
-				// get method values
-				MethodBase method = frame.GetMethod();
-				if (method != null)
-				{
-					if(method.DeclaringType != null)
-						m_className = method.DeclaringType.FullName;
-					m_method = new MethodItem(method);
-				}
-			}
-			catch (Exception ex)
-			{
-				LogLog.Error(declaringType, "An exception ocurred while retreiving stack frame information.", ex);
-			}
-
-            // set full info
-            m_fullInfo = m_className + '.' + m_method.Name + '(' + m_fileName + ':' + m_lineNumber + ')';
+          if (method.DeclaringType != null)
+            m_className = method.DeclaringType.FullName;
+          m_method = new MethodItem(method);
         }
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "An exception ocurred while retreiving stack frame information.", ex);
+      }
 
-        #endregion
-
-        #region Public Instance Properties
-
-        /// <summary>
-        /// Gets the fully qualified class name of the caller making the logging 
-        /// request.
-        /// </summary>
-        /// <value>
-        /// The fully qualified class name of the caller making the logging 
-        /// request.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the fully qualified class name of the caller making the logging 
-        /// request.
-        /// </para>
-        /// </remarks>
-        public string ClassName
-        {
-            get { return m_className; }
-        }
-
-        /// <summary>
-        /// Gets the file name of the caller.
-        /// </summary>
-        /// <value>
-        /// The file name of the caller.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the file name of the caller.
-        /// </para>
-        /// </remarks>
-        public string FileName
-        {
-            get { return m_fileName; }
-        }
-
-        /// <summary>
-        /// Gets the line number of the caller.
-        /// </summary>
-        /// <value>
-        /// The line number of the caller.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the line number of the caller.
-        /// </para>
-        /// </remarks>
-        public string LineNumber
-        {
-            get { return m_lineNumber; }
-        }
-
-        /// <summary>
-        /// Gets the method name of the caller.
-        /// </summary>
-        /// <value>
-        /// The method name of the caller.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets the method name of the caller.
-        /// </para>
-        /// </remarks>
-        public MethodItem Method
-        {
-            get { return m_method; }
-        }
-
-        /// <summary>
-        /// Gets all available caller information
-        /// </summary>
-        /// <value>
-        /// All available caller information, in the format
-        /// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Gets all available caller information, in the format
-        /// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
-        /// </para>
-        /// </remarks>
-        public string FullInfo
-        {
-            get { return m_fullInfo; }
-        }
-
-        #endregion Public Instance Properties
-
-        #region Private Instance Fields
-
-        private readonly string m_lineNumber;
-        private readonly string m_fileName;
-        private readonly string m_className;
-        private readonly string m_fullInfo;
-		private readonly MethodItem m_method;
-
-        #endregion
-
-        #region Private Static Fields
-
-        /// <summary>
-        /// The fully qualified type of the StackFrameItem class.
-        /// </summary>
-        /// <remarks>
-        /// Used by the internal logger to record the Type of the
-        /// log message.
-        /// </remarks>
-        private static readonly Type declaringType = typeof(StackFrameItem);
-
-        /// <summary>
-        /// When location information is not available the constant
-        /// <c>NA</c> is returned. Current value of this string
-        /// constant is <b>?</b>.
-        /// </summary>
-        private const string NA = "?";
-
-        #endregion Private Static Fields
+      // set full info
+      m_fullInfo = m_className + '.' + m_method.Name + '(' + m_fileName + ':' + m_lineNumber + ')';
     }
+
+    #endregion
+
+    #region Public Instance Properties
+
+    /// <summary>
+    /// Gets the fully qualified class name of the caller making the logging 
+    /// request.
+    /// </summary>
+    /// <value>
+    /// The fully qualified class name of the caller making the logging 
+    /// request.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the fully qualified class name of the caller making the logging 
+    /// request.
+    /// </para>
+    /// </remarks>
+    public string ClassName
+    {
+      get { return m_className; }
+    }
+
+    /// <summary>
+    /// Gets the file name of the caller.
+    /// </summary>
+    /// <value>
+    /// The file name of the caller.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the file name of the caller.
+    /// </para>
+    /// </remarks>
+    public string FileName
+    {
+      get { return m_fileName; }
+    }
+
+    /// <summary>
+    /// Gets the line number of the caller.
+    /// </summary>
+    /// <value>
+    /// The line number of the caller.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the line number of the caller.
+    /// </para>
+    /// </remarks>
+    public string LineNumber
+    {
+      get { return m_lineNumber; }
+    }
+
+    /// <summary>
+    /// Gets the method name of the caller.
+    /// </summary>
+    /// <value>
+    /// The method name of the caller.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the method name of the caller.
+    /// </para>
+    /// </remarks>
+    public MethodItem Method
+    {
+      get { return m_method; }
+    }
+
+    /// <summary>
+    /// Gets all available caller information
+    /// </summary>
+    /// <value>
+    /// All available caller information, in the format
+    /// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets all available caller information, in the format
+    /// <c>fully.qualified.classname.of.caller.methodName(Filename:line)</c>
+    /// </para>
+    /// </remarks>
+    public string FullInfo
+    {
+      get { return m_fullInfo; }
+    }
+
+    #endregion Public Instance Properties
+
+    #region Private Instance Fields
+
+    private readonly string m_lineNumber;
+    private readonly string m_fileName;
+    private readonly string m_className;
+    private readonly string m_fullInfo;
+    private readonly MethodItem m_method;
+
+    #endregion
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the StackFrameItem class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(StackFrameItem);
+
+    /// <summary>
+    /// When location information is not available the constant
+    /// <c>NA</c> is returned. Current value of this string
+    /// constant is <b>?</b>.
+    /// </summary>
+    private const string NA = "?";
+
+    #endregion Private Static Fields
+  }
 }
 #endif
diff --git a/src/log4net/Core/TimeEvaluator.cs b/src/log4net/Core/TimeEvaluator.cs
index 3067f56..af93e55 100644
--- a/src/log4net/Core/TimeEvaluator.cs
+++ b/src/log4net/Core/TimeEvaluator.cs
@@ -21,128 +21,128 @@
 
 namespace log4net.Core
 {
+  /// <summary>
+  /// An evaluator that triggers after specified number of seconds.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This evaluator will trigger if the specified time period 
+  /// <see cref="Interval"/> has passed since last check.
+  /// </para>
+  /// </remarks>
+  /// <author>Robert Sevcik</author>
+  public class TimeEvaluator : ITriggeringEventEvaluator
+  {
     /// <summary>
-    /// An evaluator that triggers after specified number of seconds.
+    /// The time threshold for triggering in seconds. Zero means it won't trigger at all.
     /// </summary>
+    private int m_interval;
+
+    /// <summary>
+    /// The UTC time of last check. This gets updated when the object is created and when the evaluator triggers.
+    /// </summary>
+    private DateTime m_lastTimeUtc;
+
+    /// <summary>
+    /// The default time threshold for triggering in seconds. Zero means it won't trigger at all.
+    /// </summary>
+    const int DEFAULT_INTERVAL = 0;
+
+    /// <summary>
+    /// Create a new evaluator using the <see cref="DEFAULT_INTERVAL"/> time threshold in seconds.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Create a new evaluator using the <see cref="DEFAULT_INTERVAL"/> time threshold in seconds.
+    /// </para>
+    /// <para>
+    /// This evaluator will trigger if the specified time period 
+    /// <see cref="Interval"/> has passed since last check.
+    /// </para>
+    /// </remarks>
+    public TimeEvaluator()
+        : this(DEFAULT_INTERVAL)
+    {
+    }
+
+    /// <summary>
+    /// Create a new evaluator using the specified time threshold in seconds.
+    /// </summary>
+    /// <param name="interval">
+    /// The time threshold in seconds to trigger after.
+    /// Zero means it won't trigger at all.
+    /// </param>
+    /// <remarks>
+    /// <para>
+    /// Create a new evaluator using the specified time threshold in seconds.
+    /// </para>
+    /// <para>
+    /// This evaluator will trigger if the specified time period 
+    /// <see cref="Interval"/> has passed since last check.
+    /// </para>
+    /// </remarks>
+    public TimeEvaluator(int interval)
+    {
+      m_interval = interval;
+      m_lastTimeUtc = DateTime.UtcNow;
+    }
+
+    /// <summary>
+    /// The time threshold in seconds to trigger after
+    /// </summary>
+    /// <value>
+    /// The time threshold in seconds to trigger after.
+    /// Zero means it won't trigger at all.
+    /// </value>
     /// <remarks>
     /// <para>
     /// This evaluator will trigger if the specified time period 
     /// <see cref="Interval"/> has passed since last check.
     /// </para>
     /// </remarks>
-    /// <author>Robert Sevcik</author>
-    public class TimeEvaluator : ITriggeringEventEvaluator
+    public int Interval
     {
-        /// <summary>
-        /// The time threshold for triggering in seconds. Zero means it won't trigger at all.
-        /// </summary>
-        private int m_interval;
-
-        /// <summary>
-        /// The UTC time of last check. This gets updated when the object is created and when the evaluator triggers.
-        /// </summary>
-        private DateTime m_lastTimeUtc;
-
-        /// <summary>
-        /// The default time threshold for triggering in seconds. Zero means it won't trigger at all.
-        /// </summary>
-        const int DEFAULT_INTERVAL = 0;
-
-        /// <summary>
-        /// Create a new evaluator using the <see cref="DEFAULT_INTERVAL"/> time threshold in seconds.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// Create a new evaluator using the <see cref="DEFAULT_INTERVAL"/> time threshold in seconds.
-        /// </para>
-        /// <para>
-        /// This evaluator will trigger if the specified time period 
-        /// <see cref="Interval"/> has passed since last check.
-        /// </para>
-        /// </remarks>
-        public TimeEvaluator()
-            : this(DEFAULT_INTERVAL)
-        {
-        }
-
-        /// <summary>
-        /// Create a new evaluator using the specified time threshold in seconds.
-        /// </summary>
-        /// <param name="interval">
-        /// The time threshold in seconds to trigger after.
-        /// Zero means it won't trigger at all.
-        /// </param>
-        /// <remarks>
-        /// <para>
-        /// Create a new evaluator using the specified time threshold in seconds.
-        /// </para>
-        /// <para>
-        /// This evaluator will trigger if the specified time period 
-        /// <see cref="Interval"/> has passed since last check.
-        /// </para>
-        /// </remarks>
-        public TimeEvaluator(int interval)
-        {
-            m_interval = interval;
-            m_lastTimeUtc = DateTime.UtcNow;
-        }
-
-        /// <summary>
-        /// The time threshold in seconds to trigger after
-        /// </summary>
-        /// <value>
-        /// The time threshold in seconds to trigger after.
-        /// Zero means it won't trigger at all.
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// This evaluator will trigger if the specified time period 
-        /// <see cref="Interval"/> has passed since last check.
-        /// </para>
-        /// </remarks>
-        public int Interval
-        {
-            get { return m_interval; }
-            set { m_interval = value; }
-        }
-
-        /// <summary>
-        /// Is this <paramref name="loggingEvent"/> the triggering event?
-        /// </summary>
-        /// <param name="loggingEvent">The event to check</param>
-        /// <returns>This method returns <c>true</c>, if the specified time period 
-        /// <see cref="Interval"/> has passed since last check.. 
-        /// Otherwise it returns <c>false</c></returns>
-        /// <remarks>
-        /// <para>
-        /// This evaluator will trigger if the specified time period 
-        /// <see cref="Interval"/> has passed since last check.
-        /// </para>
-        /// </remarks>
-        public bool IsTriggeringEvent(LoggingEvent loggingEvent)
-        {
-            if (loggingEvent == null)
-            {
-                throw new ArgumentNullException("loggingEvent");
-            }
-
-            // disable the evaluator if threshold is zero
-            if (m_interval == 0) return false;
-
-            lock (this) // avoid triggering multiple times
-            {
-                TimeSpan passed = DateTime.UtcNow.Subtract(m_lastTimeUtc);
-
-                if (passed.TotalSeconds > m_interval)
-                {
-                    m_lastTimeUtc = DateTime.UtcNow;
-                    return true;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        }
+      get { return m_interval; }
+      set { m_interval = value; }
     }
+
+    /// <summary>
+    /// Is this <paramref name="loggingEvent"/> the triggering event?
+    /// </summary>
+    /// <param name="loggingEvent">The event to check</param>
+    /// <returns>This method returns <c>true</c>, if the specified time period 
+    /// <see cref="Interval"/> has passed since last check.. 
+    /// Otherwise it returns <c>false</c></returns>
+    /// <remarks>
+    /// <para>
+    /// This evaluator will trigger if the specified time period 
+    /// <see cref="Interval"/> has passed since last check.
+    /// </para>
+    /// </remarks>
+    public bool IsTriggeringEvent(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
+
+      // disable the evaluator if threshold is zero
+      if (m_interval == 0) return false;
+
+      lock (this) // avoid triggering multiple times
+      {
+        TimeSpan passed = DateTime.UtcNow.Subtract(m_lastTimeUtc);
+
+        if (passed.TotalSeconds > m_interval)
+        {
+          m_lastTimeUtc = DateTime.UtcNow;
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+    }
+  }
 }
diff --git a/src/log4net/Core/WrapperMap.cs b/src/log4net/Core/WrapperMap.cs
index d4f5b25..b2b30e5 100644
--- a/src/log4net/Core/WrapperMap.cs
+++ b/src/log4net/Core/WrapperMap.cs
@@ -24,236 +24,236 @@
 
 namespace log4net.Core
 {
-	#region WrapperCreationHandler
+  #region WrapperCreationHandler
 
-	/// <summary>
-	/// Delegate used to handle creation of new wrappers.
-	/// </summary>
-	/// <param name="logger">The logger to wrap in a wrapper.</param>
-	/// <remarks>
-	/// <para>
-	/// Delegate used to handle creation of new wrappers. This delegate
-	/// is called from the <see cref="WrapperMap.CreateNewWrapperObject"/>
-	/// method to construct the wrapper for the specified logger.
-	/// </para>
-	/// <para>
-	/// The delegate to use is supplied to the <see cref="WrapperMap"/>
-	/// constructor.
-	/// </para>
-	/// </remarks>
-	public delegate ILoggerWrapper WrapperCreationHandler(ILogger logger);
+  /// <summary>
+  /// Delegate used to handle creation of new wrappers.
+  /// </summary>
+  /// <param name="logger">The logger to wrap in a wrapper.</param>
+  /// <remarks>
+  /// <para>
+  /// Delegate used to handle creation of new wrappers. This delegate
+  /// is called from the <see cref="WrapperMap.CreateNewWrapperObject"/>
+  /// method to construct the wrapper for the specified logger.
+  /// </para>
+  /// <para>
+  /// The delegate to use is supplied to the <see cref="WrapperMap"/>
+  /// constructor.
+  /// </para>
+  /// </remarks>
+  public delegate ILoggerWrapper WrapperCreationHandler(ILogger logger);
 
-	#endregion WrapperCreationHandler
+  #endregion WrapperCreationHandler
 
-	/// <summary>
-	/// Maps between logger objects and wrapper objects.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class maintains a mapping between <see cref="ILogger"/> objects and
-	/// <see cref="ILoggerWrapper"/> objects. Use the <see cref="GetWrapper"/> method to 
-	/// lookup the <see cref="ILoggerWrapper"/> for the specified <see cref="ILogger"/>.
-	/// </para>
-	/// <para>
-	/// New wrapper instances are created by the <see cref="CreateNewWrapperObject"/>
-	/// method. The default behavior is for this method to delegate construction
-	/// of the wrapper to the <see cref="WrapperCreationHandler"/> delegate supplied
-	/// to the constructor. This allows specialization of the behavior without
-	/// requiring subclassing of this type.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class WrapperMap
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Maps between logger objects and wrapper objects.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class maintains a mapping between <see cref="ILogger"/> objects and
+  /// <see cref="ILoggerWrapper"/> objects. Use the <see cref="GetWrapper"/> method to 
+  /// lookup the <see cref="ILoggerWrapper"/> for the specified <see cref="ILogger"/>.
+  /// </para>
+  /// <para>
+  /// New wrapper instances are created by the <see cref="CreateNewWrapperObject"/>
+  /// method. The default behavior is for this method to delegate construction
+  /// of the wrapper to the <see cref="WrapperCreationHandler"/> delegate supplied
+  /// to the constructor. This allows specialization of the behavior without
+  /// requiring subclassing of this type.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class WrapperMap
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="WrapperMap" />
-		/// </summary>
-		/// <param name="createWrapperHandler">The handler to use to create the wrapper objects.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="WrapperMap" /> class with 
-		/// the specified handler to create the wrapper objects.
-		/// </para>
-		/// </remarks>
-		public WrapperMap(WrapperCreationHandler createWrapperHandler) 
-		{
-			m_createWrapperHandler = createWrapperHandler;
+    /// <summary>
+    /// Initializes a new instance of the <see cref="WrapperMap" />
+    /// </summary>
+    /// <param name="createWrapperHandler">The handler to use to create the wrapper objects.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="WrapperMap" /> class with 
+    /// the specified handler to create the wrapper objects.
+    /// </para>
+    /// </remarks>
+    public WrapperMap(WrapperCreationHandler createWrapperHandler)
+    {
+      m_createWrapperHandler = createWrapperHandler;
 
-			// Create the delegates for the event callbacks
-			m_shutdownHandler = new LoggerRepositoryShutdownEventHandler(ILoggerRepository_Shutdown);
-		}
+      // Create the delegates for the event callbacks
+      m_shutdownHandler = new LoggerRepositoryShutdownEventHandler(ILoggerRepository_Shutdown);
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the wrapper object for the specified logger.
-		/// </summary>
-		/// <returns>The wrapper object for the specified logger</returns>
-		/// <remarks>
-		/// <para>
-		/// If the logger is null then the corresponding wrapper is null.
-		/// </para>
-		/// <para>
-		/// Looks up the wrapper it it has previously been requested and
-		/// returns it. If the wrapper has never been requested before then
-		/// the <see cref="CreateNewWrapperObject"/> virtual method is
-		/// called.
-		/// </para>
-		/// </remarks>
-		public virtual ILoggerWrapper GetWrapper(ILogger logger)
-		{
-			// If the logger is null then the corresponding wrapper is null
-			if (logger == null)
-			{
-				return null;
-			}
+    /// <summary>
+    /// Gets the wrapper object for the specified logger.
+    /// </summary>
+    /// <returns>The wrapper object for the specified logger</returns>
+    /// <remarks>
+    /// <para>
+    /// If the logger is null then the corresponding wrapper is null.
+    /// </para>
+    /// <para>
+    /// Looks up the wrapper it it has previously been requested and
+    /// returns it. If the wrapper has never been requested before then
+    /// the <see cref="CreateNewWrapperObject"/> virtual method is
+    /// called.
+    /// </para>
+    /// </remarks>
+    public virtual ILoggerWrapper GetWrapper(ILogger logger)
+    {
+      // If the logger is null then the corresponding wrapper is null
+      if (logger == null)
+      {
+        return null;
+      }
 
-			lock(this)
-			{
-				// Lookup hierarchy in map.
-				Hashtable wrappersMap = (Hashtable)m_repositories[logger.Repository];
+      lock (this)
+      {
+        // Lookup hierarchy in map.
+        Hashtable wrappersMap = (Hashtable)m_repositories[logger.Repository];
 
-				if (wrappersMap == null)
-				{
-					// Hierarchy does not exist in map.
-					// Must register with hierarchy
+        if (wrappersMap == null)
+        {
+          // Hierarchy does not exist in map.
+          // Must register with hierarchy
 
-					wrappersMap = new Hashtable();
-					m_repositories[logger.Repository] = wrappersMap;
+          wrappersMap = new Hashtable();
+          m_repositories[logger.Repository] = wrappersMap;
 
-					// Register for config reset & shutdown on repository
-					logger.Repository.ShutdownEvent += m_shutdownHandler;
-				}
+          // Register for config reset & shutdown on repository
+          logger.Repository.ShutdownEvent += m_shutdownHandler;
+        }
 
-				// Look for the wrapper object in the map
-				ILoggerWrapper wrapperObject = wrappersMap[logger] as ILoggerWrapper;
+        // Look for the wrapper object in the map
+        ILoggerWrapper wrapperObject = wrappersMap[logger] as ILoggerWrapper;
 
-				if (wrapperObject == null)
-				{
-					// No wrapper object exists for the specified logger
+        if (wrapperObject == null)
+        {
+          // No wrapper object exists for the specified logger
 
-					// Create a new wrapper wrapping the logger
-					wrapperObject = CreateNewWrapperObject(logger);
-					
-					// Store wrapper logger in map
-					wrappersMap[logger] = wrapperObject;
-				}
+          // Create a new wrapper wrapping the logger
+          wrapperObject = CreateNewWrapperObject(logger);
 
-				return wrapperObject;
-			}
-		}
+          // Store wrapper logger in map
+          wrappersMap[logger] = wrapperObject;
+        }
 
-		#endregion Public Instance Properties
+        return wrapperObject;
+      }
+    }
 
-		#region Protected Instance Properties
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// Gets the map of logger repositories.
-		/// </summary>
-		/// <value>
-		/// Map of logger repositories.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the hashtable that is keyed on <see cref="ILoggerRepository"/>. The
-		/// values are hashtables keyed on <see cref="ILogger"/> with the
-		/// value being the corresponding <see cref="ILoggerWrapper"/>.
-		/// </para>
-		/// </remarks>
-		protected Hashtable Repositories 
-		{
-			get { return this.m_repositories; }
-		}
+    #region Protected Instance Properties
 
-		#endregion Protected Instance Properties
+    /// <summary>
+    /// Gets the map of logger repositories.
+    /// </summary>
+    /// <value>
+    /// Map of logger repositories.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the hashtable that is keyed on <see cref="ILoggerRepository"/>. The
+    /// values are hashtables keyed on <see cref="ILogger"/> with the
+    /// value being the corresponding <see cref="ILoggerWrapper"/>.
+    /// </para>
+    /// </remarks>
+    protected Hashtable Repositories
+    {
+      get { return this.m_repositories; }
+    }
 
-		#region Protected Instance Methods
+    #endregion Protected Instance Properties
 
-		/// <summary>
-		/// Creates the wrapper object for the specified logger.
-		/// </summary>
-		/// <param name="logger">The logger to wrap in a wrapper.</param>
-		/// <returns>The wrapper object for the logger.</returns>
-		/// <remarks>
-		/// <para>
-		/// This implementation uses the <see cref="WrapperCreationHandler"/>
-		/// passed to the constructor to create the wrapper. This method
-		/// can be overridden in a subclass.
-		/// </para>
-		/// </remarks>
-		protected virtual ILoggerWrapper CreateNewWrapperObject(ILogger logger)
-		{
-			if (m_createWrapperHandler != null)
-			{
-				return m_createWrapperHandler(logger);
-			}
-			return null;
-		}
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Called when a monitored repository shutdown event is received.
-		/// </summary>
-		/// <param name="repository">The <see cref="ILoggerRepository"/> that is shutting down</param>
-		/// <remarks>
-		/// <para>
-		/// This method is called when a <see cref="ILoggerRepository"/> that this
-		/// <see cref="WrapperMap"/> is holding loggers for has signaled its shutdown
-		/// event <see cref="ILoggerRepository.ShutdownEvent"/>. The default
-		/// behavior of this method is to release the references to the loggers
-		/// and their wrappers generated for this repository.
-		/// </para>
-		/// </remarks>
-		protected virtual void RepositoryShutdown(ILoggerRepository repository)
-		{
-			lock(this)
-			{
-				// Remove the repository from map
-				m_repositories.Remove(repository);
+    /// <summary>
+    /// Creates the wrapper object for the specified logger.
+    /// </summary>
+    /// <param name="logger">The logger to wrap in a wrapper.</param>
+    /// <returns>The wrapper object for the logger.</returns>
+    /// <remarks>
+    /// <para>
+    /// This implementation uses the <see cref="WrapperCreationHandler"/>
+    /// passed to the constructor to create the wrapper. This method
+    /// can be overridden in a subclass.
+    /// </para>
+    /// </remarks>
+    protected virtual ILoggerWrapper CreateNewWrapperObject(ILogger logger)
+    {
+      if (m_createWrapperHandler != null)
+      {
+        return m_createWrapperHandler(logger);
+      }
+      return null;
+    }
 
-				// Unhook events from the repository
-				repository.ShutdownEvent -= m_shutdownHandler;
-			}
-		}
+    /// <summary>
+    /// Called when a monitored repository shutdown event is received.
+    /// </summary>
+    /// <param name="repository">The <see cref="ILoggerRepository"/> that is shutting down</param>
+    /// <remarks>
+    /// <para>
+    /// This method is called when a <see cref="ILoggerRepository"/> that this
+    /// <see cref="WrapperMap"/> is holding loggers for has signaled its shutdown
+    /// event <see cref="ILoggerRepository.ShutdownEvent"/>. The default
+    /// behavior of this method is to release the references to the loggers
+    /// and their wrappers generated for this repository.
+    /// </para>
+    /// </remarks>
+    protected virtual void RepositoryShutdown(ILoggerRepository repository)
+    {
+      lock (this)
+      {
+        // Remove the repository from map
+        m_repositories.Remove(repository);
 
-		/// <summary>
-		/// Event handler for repository shutdown event.
-		/// </summary>
-		/// <param name="sender">The sender of the event.</param>
-		/// <param name="e">The event args.</param>
-		private void ILoggerRepository_Shutdown(object sender, EventArgs e)
-		{
-			ILoggerRepository repository = sender as ILoggerRepository;
-			if (repository != null)
-			{
-				// Remove all repository from map
-				RepositoryShutdown(repository);
-			}
-		}
+        // Unhook events from the repository
+        repository.ShutdownEvent -= m_shutdownHandler;
+      }
+    }
 
-		#endregion Protected Instance Methods
+    /// <summary>
+    /// Event handler for repository shutdown event.
+    /// </summary>
+    /// <param name="sender">The sender of the event.</param>
+    /// <param name="e">The event args.</param>
+    private void ILoggerRepository_Shutdown(object sender, EventArgs e)
+    {
+      ILoggerRepository repository = sender as ILoggerRepository;
+      if (repository != null)
+      {
+        // Remove all repository from map
+        RepositoryShutdown(repository);
+      }
+    }
 
-		#region Private Instance Variables
+    #endregion Protected Instance Methods
 
-		/// <summary>
-		/// Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings
-		/// </summary>
-		private readonly Hashtable m_repositories = new Hashtable();
+    #region Private Instance Variables
 
-		/// <summary>
-		/// The handler to use to create the extension wrapper objects.
-		/// </summary>
-		private readonly WrapperCreationHandler m_createWrapperHandler;
+    /// <summary>
+    /// Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings
+    /// </summary>
+    private readonly Hashtable m_repositories = new Hashtable();
 
-		/// <summary>
-		/// Internal reference to the delegate used to register for repository shutdown events.
-		/// </summary>
-		private readonly LoggerRepositoryShutdownEventHandler m_shutdownHandler;
- 
-		#endregion Private Instance Variables
-	}
+    /// <summary>
+    /// The handler to use to create the extension wrapper objects.
+    /// </summary>
+    private readonly WrapperCreationHandler m_createWrapperHandler;
+
+    /// <summary>
+    /// Internal reference to the delegate used to register for repository shutdown events.
+    /// </summary>
+    private readonly LoggerRepositoryShutdownEventHandler m_shutdownHandler;
+
+    #endregion Private Instance Variables
+  }
 }
diff --git a/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs b/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs
index c633303..d510c56 100644
--- a/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs
+++ b/src/log4net/DateFormatter/AbsoluteTimeDateFormatter.cs
@@ -24,190 +24,190 @@
 
 namespace log4net.DateFormatter
 {
-	/// <summary>
-	/// Formats a <see cref="DateTime"/> as <c>"HH:mm:ss,fff"</c>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Formats a <see cref="DateTime"/> in the format <c>"HH:mm:ss,fff"</c> for example, <c>"15:49:37,459"</c>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class AbsoluteTimeDateFormatter : IDateFormatter
-	{
-		#region Protected Instance Methods
+  /// <summary>
+  /// Formats a <see cref="DateTime"/> as <c>"HH:mm:ss,fff"</c>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Formats a <see cref="DateTime"/> in the format <c>"HH:mm:ss,fff"</c> for example, <c>"15:49:37,459"</c>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class AbsoluteTimeDateFormatter : IDateFormatter
+  {
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Renders the date into a string. Format is <c>"HH:mm:ss"</c>.
-		/// </summary>
-		/// <param name="dateToFormat">The date to render into a string.</param>
-		/// <param name="buffer">The string builder to write to.</param>
-		/// <remarks>
-		/// <para>
-		/// Subclasses should override this method to render the date
-		/// into a string using a precision up to the second. This method
-		/// will be called at most once per second and the result will be
-		/// reused if it is needed again during the same second.
-		/// </para>
-		/// </remarks>
-		protected virtual void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer)
-		{
-			int hour = dateToFormat.Hour;
-			if (hour < 10) 
-			{
-				buffer.Append('0');
-			}
-			buffer.Append(hour);
-			buffer.Append(':');
+    /// <summary>
+    /// Renders the date into a string. Format is <c>"HH:mm:ss"</c>.
+    /// </summary>
+    /// <param name="dateToFormat">The date to render into a string.</param>
+    /// <param name="buffer">The string builder to write to.</param>
+    /// <remarks>
+    /// <para>
+    /// Subclasses should override this method to render the date
+    /// into a string using a precision up to the second. This method
+    /// will be called at most once per second and the result will be
+    /// reused if it is needed again during the same second.
+    /// </para>
+    /// </remarks>
+    protected virtual void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer)
+    {
+      int hour = dateToFormat.Hour;
+      if (hour < 10)
+      {
+        buffer.Append('0');
+      }
+      buffer.Append(hour);
+      buffer.Append(':');
 
-			int mins = dateToFormat.Minute;
-			if (mins < 10) 
-			{
-				buffer.Append('0');
-			}
-			buffer.Append(mins);
-			buffer.Append(':');
-	
-			int secs = dateToFormat.Second;
-			if (secs < 10) 
-			{
-				buffer.Append('0');
-			}
-			buffer.Append(secs);
-		}
+      int mins = dateToFormat.Minute;
+      if (mins < 10)
+      {
+        buffer.Append('0');
+      }
+      buffer.Append(mins);
+      buffer.Append(':');
 
-		#endregion Protected Instance Methods
+      int secs = dateToFormat.Second;
+      if (secs < 10)
+      {
+        buffer.Append('0');
+      }
+      buffer.Append(secs);
+    }
 
-		#region Implementation of IDateFormatter
+    #endregion Protected Instance Methods
 
-		/// <summary>
-		/// Renders the date into a string. Format is "HH:mm:ss,fff".
-		/// </summary>
-		/// <param name="dateToFormat">The date to render into a string.</param>
-		/// <param name="writer">The writer to write to.</param>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="FormatDateWithoutMillis"/> method to generate the
-		/// time string up to the seconds and then appends the current
-		/// milliseconds. The results from <see cref="FormatDateWithoutMillis"/> are
-		/// cached and <see cref="FormatDateWithoutMillis"/> is called at most once
-		/// per second.
-		/// </para>
-		/// <para>
-		/// Sub classes should override <see cref="FormatDateWithoutMillis"/>
-		/// rather than <see cref="FormatDate"/>.
-		/// </para>
-		/// </remarks>
-		public virtual void FormatDate(DateTime dateToFormat, TextWriter writer)
-		{
-                    lock (s_lastTimeStrings)
-		    {
-			// Calculate the current time precise only to the second
-			long currentTimeToTheSecond = (dateToFormat.Ticks - (dateToFormat.Ticks % TimeSpan.TicksPerSecond));
+    #region Implementation of IDateFormatter
 
-                        string timeString = null;
-			// Compare this time with the stored last time
-			// If we are in the same second then append
-			// the previously calculated time string
-                        if (s_lastTimeToTheSecond != currentTimeToTheSecond)
-                        {
-                            s_lastTimeStrings.Clear();
-                        }
-                        else
-                        {
-                            timeString = (string) s_lastTimeStrings[GetType()];
-                        }
+    /// <summary>
+    /// Renders the date into a string. Format is "HH:mm:ss,fff".
+    /// </summary>
+    /// <param name="dateToFormat">The date to render into a string.</param>
+    /// <param name="writer">The writer to write to.</param>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="FormatDateWithoutMillis"/> method to generate the
+    /// time string up to the seconds and then appends the current
+    /// milliseconds. The results from <see cref="FormatDateWithoutMillis"/> are
+    /// cached and <see cref="FormatDateWithoutMillis"/> is called at most once
+    /// per second.
+    /// </para>
+    /// <para>
+    /// Sub classes should override <see cref="FormatDateWithoutMillis"/>
+    /// rather than <see cref="FormatDate"/>.
+    /// </para>
+    /// </remarks>
+    public virtual void FormatDate(DateTime dateToFormat, TextWriter writer)
+    {
+      lock (s_lastTimeStrings)
+      {
+        // Calculate the current time precise only to the second
+        long currentTimeToTheSecond = (dateToFormat.Ticks - (dateToFormat.Ticks % TimeSpan.TicksPerSecond));
 
-                        if (timeString == null)
-                        {
-				// lock so that only one thread can use the buffer and
-				// update the s_lastTimeToTheSecond and s_lastTimeStrings
+        string timeString = null;
+        // Compare this time with the stored last time
+        // If we are in the same second then append
+        // the previously calculated time string
+        if (s_lastTimeToTheSecond != currentTimeToTheSecond)
+        {
+          s_lastTimeStrings.Clear();
+        }
+        else
+        {
+          timeString = (string)s_lastTimeStrings[GetType()];
+        }
 
-				// PERF: Try removing this lock and using a new StringBuilder each time
-				lock(s_lastTimeBuf)
-				{
-                                        timeString = (string) s_lastTimeStrings[GetType()];
+        if (timeString == null)
+        {
+          // lock so that only one thread can use the buffer and
+          // update the s_lastTimeToTheSecond and s_lastTimeStrings
 
-                                        if (timeString == null)
-                                        {
-						// We are in a new second.
-						s_lastTimeBuf.Length = 0;
+          // PERF: Try removing this lock and using a new StringBuilder each time
+          lock (s_lastTimeBuf)
+          {
+            timeString = (string)s_lastTimeStrings[GetType()];
 
-						// Calculate the new string for this second
-						FormatDateWithoutMillis(dateToFormat, s_lastTimeBuf);
+            if (timeString == null)
+            {
+              // We are in a new second.
+              s_lastTimeBuf.Length = 0;
 
-						// Render the string buffer to a string
-                                                timeString = s_lastTimeBuf.ToString();
+              // Calculate the new string for this second
+              FormatDateWithoutMillis(dateToFormat, s_lastTimeBuf);
+
+              // Render the string buffer to a string
+              timeString = s_lastTimeBuf.ToString();
 
 #if NET_1_1
-						// Ensure that the above string is written into the variable NOW on all threads.
-						// This is only required on multiprocessor machines with weak memeory models
-						System.Threading.Thread.MemoryBarrier();
+            // Ensure that the above string is written into the variable NOW on all threads.
+            // This is only required on multiprocessor machines with weak memeory models
+            System.Threading.Thread.MemoryBarrier();
 #endif
-						// Store the time as a string (we only have to do this once per second)
-                                                s_lastTimeStrings[GetType()] = timeString;
-						s_lastTimeToTheSecond = currentTimeToTheSecond;
-					}
-				}
-			}
-			writer.Write(timeString);
-	
-			// Append the current millisecond info
-			writer.Write(',');
-			int millis = dateToFormat.Millisecond;
-			if (millis < 100) 
-			{
-				writer.Write('0');
-			}
-			if (millis < 10) 
-			{
-				writer.Write('0');
-			}
-			writer.Write(millis);
-                    }
-		}
+              // Store the time as a string (we only have to do this once per second)
+              s_lastTimeStrings[GetType()] = timeString;
+              s_lastTimeToTheSecond = currentTimeToTheSecond;
+            }
+          }
+        }
+        writer.Write(timeString);
 
-		#endregion Implementation of IDateFormatter
+        // Append the current millisecond info
+        writer.Write(',');
+        int millis = dateToFormat.Millisecond;
+        if (millis < 100)
+        {
+          writer.Write('0');
+        }
+        if (millis < 10)
+        {
+          writer.Write('0');
+        }
+        writer.Write(millis);
+      }
+    }
 
-		#region Public Static Fields
+    #endregion Implementation of IDateFormatter
 
-		/// <summary>
-		/// String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is <b>ABSOLUTE</b>.
-		/// </summary>
-		public const string AbsoluteTimeDateFormat = "ABSOLUTE";
+    #region Public Static Fields
 
-		/// <summary>
-		/// String constant used to specify DateTimeDateFormat in layouts.  Current value is <b>DATE</b>.
-		/// </summary>
-		public const string DateAndTimeDateFormat = "DATE";
+    /// <summary>
+    /// String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is <b>ABSOLUTE</b>.
+    /// </summary>
+    public const string AbsoluteTimeDateFormat = "ABSOLUTE";
 
-		/// <summary>
-		/// String constant used to specify ISO8601DateFormat in layouts. Current value is <b>ISO8601</b>.
-		/// </summary>
-		public const string Iso8601TimeDateFormat = "ISO8601";
+    /// <summary>
+    /// String constant used to specify DateTimeDateFormat in layouts.  Current value is <b>DATE</b>.
+    /// </summary>
+    public const string DateAndTimeDateFormat = "DATE";
 
-		#endregion Public Static Fields
+    /// <summary>
+    /// String constant used to specify ISO8601DateFormat in layouts. Current value is <b>ISO8601</b>.
+    /// </summary>
+    public const string Iso8601TimeDateFormat = "ISO8601";
 
-		#region Private Static Fields
+    #endregion Public Static Fields
 
-		/// <summary>
-		/// Last stored time with precision up to the second.
-		/// </summary>
-		private static long s_lastTimeToTheSecond = 0;
+    #region Private Static Fields
 
-		/// <summary>
-		/// Last stored time with precision up to the second, formatted
-		/// as a string.
-		/// </summary>
-		private static StringBuilder s_lastTimeBuf = new StringBuilder();
+    /// <summary>
+    /// Last stored time with precision up to the second.
+    /// </summary>
+    private static long s_lastTimeToTheSecond = 0;
 
-		/// <summary>
-		/// Last stored time with precision up to the second, formatted
-		/// as a string.
-		/// </summary>
-		private static Hashtable s_lastTimeStrings = new Hashtable();
+    /// <summary>
+    /// Last stored time with precision up to the second, formatted
+    /// as a string.
+    /// </summary>
+    private static StringBuilder s_lastTimeBuf = new StringBuilder();
 
-		#endregion Private Static Fields
-	}
+    /// <summary>
+    /// Last stored time with precision up to the second, formatted
+    /// as a string.
+    /// </summary>
+    private static Hashtable s_lastTimeStrings = new Hashtable();
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/DateFormatter/DateTimeDateFormatter.cs b/src/log4net/DateFormatter/DateTimeDateFormatter.cs
index 7411206..4a9364b 100644
--- a/src/log4net/DateFormatter/DateTimeDateFormatter.cs
+++ b/src/log4net/DateFormatter/DateTimeDateFormatter.cs
@@ -23,84 +23,84 @@
 
 namespace log4net.DateFormatter
 {
-	/// <summary>
-	/// Formats a <see cref="DateTime"/> as <c>"dd MMM yyyy HH:mm:ss,fff"</c>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Formats a <see cref="DateTime"/> in the format 
-	/// <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, 
-	/// <c>"06 Nov 1994 15:49:37,459"</c>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Angelika Schnagl</author>
-	public class DateTimeDateFormatter : AbsoluteTimeDateFormatter
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Formats a <see cref="DateTime"/> as <c>"dd MMM yyyy HH:mm:ss,fff"</c>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Formats a <see cref="DateTime"/> in the format 
+  /// <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, 
+  /// <c>"06 Nov 1994 15:49:37,459"</c>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Angelika Schnagl</author>
+  public class DateTimeDateFormatter : AbsoluteTimeDateFormatter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="DateTimeDateFormatter" /> class.
-		/// </para>
-		/// </remarks>
-		public DateTimeDateFormatter()
-		{
-			m_dateTimeFormatInfo = DateTimeFormatInfo.InvariantInfo;
-		}
+    /// <summary>
+    /// Default constructor.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="DateTimeDateFormatter" /> class.
+    /// </para>
+    /// </remarks>
+    public DateTimeDateFormatter()
+    {
+      m_dateTimeFormatInfo = DateTimeFormatInfo.InvariantInfo;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Override implementation of AbsoluteTimeDateFormatter
+    #region Override implementation of AbsoluteTimeDateFormatter
 
-		/// <summary>
-		/// Formats the date without the milliseconds part
-		/// </summary>
-		/// <param name="dateToFormat">The date to format.</param>
-		/// <param name="buffer">The string builder to write to.</param>
-		/// <remarks>
-		/// <para>
-		/// Formats a DateTime in the format <c>"dd MMM yyyy HH:mm:ss"</c>
-		/// for example, <c>"06 Nov 1994 15:49:37"</c>.
-		/// </para>
-		/// <para>
-		/// The base class will append the <c>",fff"</c> milliseconds section.
-		/// This method will only be called at most once per second.
-		/// </para>
-		/// </remarks>
-		protected override void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer)
-		{
-			int day = dateToFormat.Day;
-			if (day < 10) 
-			{
-				buffer.Append('0');
-			}
-			buffer.Append(day);
-			buffer.Append(' ');		
+    /// <summary>
+    /// Formats the date without the milliseconds part
+    /// </summary>
+    /// <param name="dateToFormat">The date to format.</param>
+    /// <param name="buffer">The string builder to write to.</param>
+    /// <remarks>
+    /// <para>
+    /// Formats a DateTime in the format <c>"dd MMM yyyy HH:mm:ss"</c>
+    /// for example, <c>"06 Nov 1994 15:49:37"</c>.
+    /// </para>
+    /// <para>
+    /// The base class will append the <c>",fff"</c> milliseconds section.
+    /// This method will only be called at most once per second.
+    /// </para>
+    /// </remarks>
+    protected override void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer)
+    {
+      int day = dateToFormat.Day;
+      if (day < 10)
+      {
+        buffer.Append('0');
+      }
+      buffer.Append(day);
+      buffer.Append(' ');
 
-			buffer.Append(m_dateTimeFormatInfo.GetAbbreviatedMonthName(dateToFormat.Month));
-			buffer.Append(' ');	
+      buffer.Append(m_dateTimeFormatInfo.GetAbbreviatedMonthName(dateToFormat.Month));
+      buffer.Append(' ');
 
-			buffer.Append(dateToFormat.Year);
-			buffer.Append(' ');
+      buffer.Append(dateToFormat.Year);
+      buffer.Append(' ');
 
-			// Append the 'HH:mm:ss'
-			base.FormatDateWithoutMillis(dateToFormat, buffer);
-		}
+      // Append the 'HH:mm:ss'
+      base.FormatDateWithoutMillis(dateToFormat, buffer);
+    }
 
-		#endregion Override implementation of AbsoluteTimeDateFormatter
+    #endregion Override implementation of AbsoluteTimeDateFormatter
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The format info for the invariant culture.
-		/// </summary>
-		private readonly DateTimeFormatInfo m_dateTimeFormatInfo;
+    /// <summary>
+    /// The format info for the invariant culture.
+    /// </summary>
+    private readonly DateTimeFormatInfo m_dateTimeFormatInfo;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/DateFormatter/IDateFormatter.cs b/src/log4net/DateFormatter/IDateFormatter.cs
index f5074ee..ebfb981 100644
--- a/src/log4net/DateFormatter/IDateFormatter.cs
+++ b/src/log4net/DateFormatter/IDateFormatter.cs
@@ -22,34 +22,34 @@
 
 namespace log4net.DateFormatter
 {
-	/// <summary>
-	/// Render a <see cref="DateTime"/> as a string.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface to abstract the rendering of a <see cref="DateTime"/>
-	/// instance into a string.
-	/// </para>
-	/// <para>
-	/// The <see cref="FormatDate"/> method is used to render the
-	/// date to a text writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IDateFormatter
-	{
-		/// <summary>
-		/// Formats the specified date as a string.
-		/// </summary>
-		/// <param name="dateToFormat">The date to format.</param>
-		/// <param name="writer">The writer to write to.</param>
-		/// <remarks>
-		/// <para>
-		/// Format the <see cref="DateTime"/> as a string and write it
-		/// to the <see cref="TextWriter"/> provided.
-		/// </para>
-		/// </remarks>
-		void FormatDate(DateTime dateToFormat, TextWriter writer);
-	}
+  /// <summary>
+  /// Render a <see cref="DateTime"/> as a string.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface to abstract the rendering of a <see cref="DateTime"/>
+  /// instance into a string.
+  /// </para>
+  /// <para>
+  /// The <see cref="FormatDate"/> method is used to render the
+  /// date to a text writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IDateFormatter
+  {
+    /// <summary>
+    /// Formats the specified date as a string.
+    /// </summary>
+    /// <param name="dateToFormat">The date to format.</param>
+    /// <param name="writer">The writer to write to.</param>
+    /// <remarks>
+    /// <para>
+    /// Format the <see cref="DateTime"/> as a string and write it
+    /// to the <see cref="TextWriter"/> provided.
+    /// </para>
+    /// </remarks>
+    void FormatDate(DateTime dateToFormat, TextWriter writer);
+  }
 }
diff --git a/src/log4net/DateFormatter/Iso8601DateFormatter.cs b/src/log4net/DateFormatter/Iso8601DateFormatter.cs
index 524c8a7..a78dbb7 100644
--- a/src/log4net/DateFormatter/Iso8601DateFormatter.cs
+++ b/src/log4net/DateFormatter/Iso8601DateFormatter.cs
@@ -22,75 +22,75 @@
 
 namespace log4net.DateFormatter
 {
-	/// <summary>
-	/// Formats the <see cref="DateTime"/> as <c>"yyyy-MM-dd HH:mm:ss,fff"</c>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Formats the <see cref="DateTime"/> specified as a string: <c>"yyyy-MM-dd HH:mm:ss,fff"</c>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class Iso8601DateFormatter : AbsoluteTimeDateFormatter
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Formats the <see cref="DateTime"/> as <c>"yyyy-MM-dd HH:mm:ss,fff"</c>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Formats the <see cref="DateTime"/> specified as a string: <c>"yyyy-MM-dd HH:mm:ss,fff"</c>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class Iso8601DateFormatter : AbsoluteTimeDateFormatter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Iso8601DateFormatter" /> class.
-		/// </para>
-		/// </remarks>
-		public Iso8601DateFormatter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Iso8601DateFormatter" /> class.
+    /// </para>
+    /// </remarks>
+    public Iso8601DateFormatter()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Override implementation of AbsoluteTimeDateFormatter
+    #region Override implementation of AbsoluteTimeDateFormatter
 
-		/// <summary>
-		/// Formats the date without the milliseconds part
-		/// </summary>
-		/// <param name="dateToFormat">The date to format.</param>
-		/// <param name="buffer">The string builder to write to.</param>
-		/// <remarks>
-		/// <para>
-		/// Formats the date specified as a string: <c>"yyyy-MM-dd HH:mm:ss"</c>.
-		/// </para>
-		/// <para>
-		/// The base class will append the <c>",fff"</c> milliseconds section.
-		/// This method will only be called at most once per second.
-		/// </para>
-		/// </remarks>
-		protected override void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer)
-		{
-			buffer.Append(dateToFormat.Year);
+    /// <summary>
+    /// Formats the date without the milliseconds part
+    /// </summary>
+    /// <param name="dateToFormat">The date to format.</param>
+    /// <param name="buffer">The string builder to write to.</param>
+    /// <remarks>
+    /// <para>
+    /// Formats the date specified as a string: <c>"yyyy-MM-dd HH:mm:ss"</c>.
+    /// </para>
+    /// <para>
+    /// The base class will append the <c>",fff"</c> milliseconds section.
+    /// This method will only be called at most once per second.
+    /// </para>
+    /// </remarks>
+    protected override void FormatDateWithoutMillis(DateTime dateToFormat, StringBuilder buffer)
+    {
+      buffer.Append(dateToFormat.Year);
 
-			buffer.Append('-');
-			int month = dateToFormat.Month;
-			if (month < 10)
-			{
-				buffer.Append('0');
-			}
-			buffer.Append(month);
-			buffer.Append('-');
+      buffer.Append('-');
+      int month = dateToFormat.Month;
+      if (month < 10)
+      {
+        buffer.Append('0');
+      }
+      buffer.Append(month);
+      buffer.Append('-');
 
-			int day = dateToFormat.Day;
-			if (day < 10) 
-			{
-				buffer.Append('0');
-			}
-			buffer.Append(day);
-			buffer.Append(' ');
+      int day = dateToFormat.Day;
+      if (day < 10)
+      {
+        buffer.Append('0');
+      }
+      buffer.Append(day);
+      buffer.Append(' ');
 
-			// Append the 'HH:mm:ss'
-			base.FormatDateWithoutMillis(dateToFormat, buffer);
-		}
+      // Append the 'HH:mm:ss'
+      base.FormatDateWithoutMillis(dateToFormat, buffer);
+    }
 
-		#endregion Override implementation of AbsoluteTimeDateFormatter
-	}
+    #endregion Override implementation of AbsoluteTimeDateFormatter
+  }
 }
diff --git a/src/log4net/DateFormatter/SimpleDateFormatter.cs b/src/log4net/DateFormatter/SimpleDateFormatter.cs
index 3efb164..05e5e86 100644
--- a/src/log4net/DateFormatter/SimpleDateFormatter.cs
+++ b/src/log4net/DateFormatter/SimpleDateFormatter.cs
@@ -22,74 +22,74 @@
 
 namespace log4net.DateFormatter
 {
-	/// <summary>
-	/// Formats the <see cref="DateTime"/> using the <see cref="M:DateTime.ToString(string, IFormatProvider)"/> method.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Formats the <see cref="DateTime"/> using the <see cref="DateTime"/> <see cref="M:DateTime.ToString(string, IFormatProvider)"/> method.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class SimpleDateFormatter : IDateFormatter
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Formats the <see cref="DateTime"/> using the <see cref="M:DateTime.ToString(string, IFormatProvider)"/> method.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Formats the <see cref="DateTime"/> using the <see cref="DateTime"/> <see cref="M:DateTime.ToString(string, IFormatProvider)"/> method.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class SimpleDateFormatter : IDateFormatter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="format">The format string.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="SimpleDateFormatter" /> class 
-		/// with the specified format string.
-		/// </para>
-		/// <para>
-		/// The format string must be compatible with the options
-		/// that can be supplied to <see cref="M:DateTime.ToString(string, IFormatProvider)"/>.
-		/// </para>
-		/// </remarks>
-		public SimpleDateFormatter(string format)
-		{
-			m_formatString = format;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="format">The format string.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="SimpleDateFormatter" /> class 
+    /// with the specified format string.
+    /// </para>
+    /// <para>
+    /// The format string must be compatible with the options
+    /// that can be supplied to <see cref="M:DateTime.ToString(string, IFormatProvider)"/>.
+    /// </para>
+    /// </remarks>
+    public SimpleDateFormatter(string format)
+    {
+      m_formatString = format;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Implementation of IDateFormatter
+    #region Implementation of IDateFormatter
 
-		/// <summary>
-		/// Formats the date using <see cref="M:DateTime.ToString(string, IFormatProvider)"/>.
-		/// </summary>
-		/// <param name="dateToFormat">The date to convert to a string.</param>
-		/// <param name="writer">The writer to write to.</param>
-		/// <remarks>
-		/// <para>
-		/// Uses the date format string supplied to the constructor to call
-		/// the <see cref="M:DateTime.ToString(string, IFormatProvider)"/> method to format the date.
-		/// </para>
-		/// </remarks>
-		public virtual void FormatDate(DateTime dateToFormat, TextWriter writer)
-		{
-			writer.Write(dateToFormat.ToString(m_formatString, System.Globalization.DateTimeFormatInfo.InvariantInfo));
-		}
+    /// <summary>
+    /// Formats the date using <see cref="M:DateTime.ToString(string, IFormatProvider)"/>.
+    /// </summary>
+    /// <param name="dateToFormat">The date to convert to a string.</param>
+    /// <param name="writer">The writer to write to.</param>
+    /// <remarks>
+    /// <para>
+    /// Uses the date format string supplied to the constructor to call
+    /// the <see cref="M:DateTime.ToString(string, IFormatProvider)"/> method to format the date.
+    /// </para>
+    /// </remarks>
+    public virtual void FormatDate(DateTime dateToFormat, TextWriter writer)
+    {
+      writer.Write(dateToFormat.ToString(m_formatString, System.Globalization.DateTimeFormatInfo.InvariantInfo));
+    }
 
-		#endregion
+    #endregion
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The format string used to format the <see cref="DateTime" />.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The format string must be compatible with the options
-		/// that can be supplied to <see cref="M:DateTime.ToString(string, IFormatProvider)"/>.
-		/// </para>
-		/// </remarks>
-		private readonly string m_formatString;
+    /// <summary>
+    /// The format string used to format the <see cref="DateTime" />.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The format string must be compatible with the options
+    /// that can be supplied to <see cref="M:DateTime.ToString(string, IFormatProvider)"/>.
+    /// </para>
+    /// </remarks>
+    private readonly string m_formatString;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Filter/DenyAllFilter.cs b/src/log4net/Filter/DenyAllFilter.cs
index ab377f1..562fbc1 100644
--- a/src/log4net/Filter/DenyAllFilter.cs
+++ b/src/log4net/Filter/DenyAllFilter.cs
@@ -23,53 +23,53 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// This filter drops all <see cref="LoggingEvent"/>. 
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// You can add this filter to the end of a filter chain to
-	/// switch from the default "accept all unless instructed otherwise"
-	/// filtering behavior to a "deny all unless instructed otherwise"
-	/// behavior.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class DenyAllFilter : FilterSkeleton
-	{
-		#region Constructors
+  /// <summary>
+  /// This filter drops all <see cref="LoggingEvent"/>. 
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// You can add this filter to the end of a filter chain to
+  /// switch from the default "accept all unless instructed otherwise"
+  /// filtering behavior to a "deny all unless instructed otherwise"
+  /// behavior.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class DenyAllFilter : FilterSkeleton
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public DenyAllFilter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public DenyAllFilter()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Override implementation of FilterSkeleton
+    #region Override implementation of FilterSkeleton
 
-		/// <summary>
-		/// Always returns the integer constant <see cref="FilterDecision.Deny"/>
-		/// </summary>
-		/// <param name="loggingEvent">the LoggingEvent to filter</param>
-		/// <returns>Always returns <see cref="FilterDecision.Deny"/></returns>
-		/// <remarks>
-		/// <para>
-		/// Ignores the event being logged and just returns
-		/// <see cref="FilterDecision.Deny"/>. This can be used to change the default filter
-		/// chain behavior from <see cref="FilterDecision.Accept"/> to <see cref="FilterDecision.Deny"/>. This filter
-		/// should only be used as the last filter in the chain
-		/// as any further filters will be ignored!
-		/// </para>
-		/// </remarks>
-		public override FilterDecision Decide(LoggingEvent loggingEvent) 
-		{
-			return FilterDecision.Deny;
-		}
+    /// <summary>
+    /// Always returns the integer constant <see cref="FilterDecision.Deny"/>
+    /// </summary>
+    /// <param name="loggingEvent">the LoggingEvent to filter</param>
+    /// <returns>Always returns <see cref="FilterDecision.Deny"/></returns>
+    /// <remarks>
+    /// <para>
+    /// Ignores the event being logged and just returns
+    /// <see cref="FilterDecision.Deny"/>. This can be used to change the default filter
+    /// chain behavior from <see cref="FilterDecision.Accept"/> to <see cref="FilterDecision.Deny"/>. This filter
+    /// should only be used as the last filter in the chain
+    /// as any further filters will be ignored!
+    /// </para>
+    /// </remarks>
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
+    {
+      return FilterDecision.Deny;
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Filter/FilterDecision.cs b/src/log4net/Filter/FilterDecision.cs
index 1b5967b..9164eea 100644
--- a/src/log4net/Filter/FilterDecision.cs
+++ b/src/log4net/Filter/FilterDecision.cs
@@ -23,32 +23,32 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// The return result from <see cref="IFilter.Decide"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The return result from <see cref="IFilter.Decide"/>
-	/// </para>
-	/// </remarks>
-	public enum FilterDecision : int
-	{
-		/// <summary>
-		/// The log event must be dropped immediately without 
-		/// consulting with the remaining filters, if any, in the chain.
-		/// </summary>
-		Deny = -1,
-  
-		/// <summary>
-		/// This filter is neutral with respect to the log event. 
-		/// The remaining filters, if any, should be consulted for a final decision.
-		/// </summary>
-		Neutral = 0,
+  /// <summary>
+  /// The return result from <see cref="IFilter.Decide"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The return result from <see cref="IFilter.Decide"/>
+  /// </para>
+  /// </remarks>
+  public enum FilterDecision : int
+  {
+    /// <summary>
+    /// The log event must be dropped immediately without 
+    /// consulting with the remaining filters, if any, in the chain.
+    /// </summary>
+    Deny = -1,
 
-		/// <summary>
-		/// The log event must be logged immediately without 
-		/// consulting with the remaining filters, if any, in the chain.
-		/// </summary>
-		Accept = 1,
-	}
+    /// <summary>
+    /// This filter is neutral with respect to the log event. 
+    /// The remaining filters, if any, should be consulted for a final decision.
+    /// </summary>
+    Neutral = 0,
+
+    /// <summary>
+    /// The log event must be logged immediately without 
+    /// consulting with the remaining filters, if any, in the chain.
+    /// </summary>
+    Accept = 1,
+  }
 }
diff --git a/src/log4net/Filter/FilterSkeleton.cs b/src/log4net/Filter/FilterSkeleton.cs
index 293d3ca..3bab116 100644
--- a/src/log4net/Filter/FilterSkeleton.cs
+++ b/src/log4net/Filter/FilterSkeleton.cs
@@ -22,134 +22,134 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Subclass this type to implement customized logging event filtering
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Users should extend this class to implement customized logging
-	/// event filtering. Note that <see cref="log4net.Repository.Hierarchy.Logger"/> and 
-	/// <see cref="log4net.Appender.AppenderSkeleton"/>, the parent class of all standard
-	/// appenders, have built-in filtering rules. It is suggested that you
-	/// first use and understand the built-in rules before rushing to write
-	/// your own custom filters.
-	/// </para>
-	/// <para>
-	/// This abstract class assumes and also imposes that filters be
-	/// organized in a linear chain. The <see cref="Decide"/>
-	/// method of each filter is called sequentially, in the order of their 
-	/// addition to the chain.
-	/// </para>
-	/// <para>
-	/// The <see cref="Decide"/> method must return one
-	/// of the integer constants <see cref="FilterDecision.Deny"/>, 
-	/// <see cref="FilterDecision.Neutral"/> or <see cref="FilterDecision.Accept"/>.
-	/// </para>
-	/// <para>
-	/// If the value <see cref="FilterDecision.Deny"/> is returned, then the log event is dropped 
-	/// immediately without consulting with the remaining filters.
-	/// </para>
-	/// <para>
-	/// If the value <see cref="FilterDecision.Neutral"/> is returned, then the next filter
-	/// in the chain is consulted. If there are no more filters in the
-	/// chain, then the log event is logged. Thus, in the presence of no
-	/// filters, the default behavior is to log all logging events.
-	/// </para>
-	/// <para>
-	/// If the value <see cref="FilterDecision.Accept"/> is returned, then the log
-	/// event is logged without consulting the remaining filters.
-	/// </para>
-	/// <para>
-	/// The philosophy of log4net filters is largely inspired from the
-	/// Linux ipchains.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class FilterSkeleton : IFilter
-	{
-		#region Member Variables
+  /// <summary>
+  /// Subclass this type to implement customized logging event filtering
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Users should extend this class to implement customized logging
+  /// event filtering. Note that <see cref="log4net.Repository.Hierarchy.Logger"/> and 
+  /// <see cref="log4net.Appender.AppenderSkeleton"/>, the parent class of all standard
+  /// appenders, have built-in filtering rules. It is suggested that you
+  /// first use and understand the built-in rules before rushing to write
+  /// your own custom filters.
+  /// </para>
+  /// <para>
+  /// This abstract class assumes and also imposes that filters be
+  /// organized in a linear chain. The <see cref="Decide"/>
+  /// method of each filter is called sequentially, in the order of their 
+  /// addition to the chain.
+  /// </para>
+  /// <para>
+  /// The <see cref="Decide"/> method must return one
+  /// of the integer constants <see cref="FilterDecision.Deny"/>, 
+  /// <see cref="FilterDecision.Neutral"/> or <see cref="FilterDecision.Accept"/>.
+  /// </para>
+  /// <para>
+  /// If the value <see cref="FilterDecision.Deny"/> is returned, then the log event is dropped 
+  /// immediately without consulting with the remaining filters.
+  /// </para>
+  /// <para>
+  /// If the value <see cref="FilterDecision.Neutral"/> is returned, then the next filter
+  /// in the chain is consulted. If there are no more filters in the
+  /// chain, then the log event is logged. Thus, in the presence of no
+  /// filters, the default behavior is to log all logging events.
+  /// </para>
+  /// <para>
+  /// If the value <see cref="FilterDecision.Accept"/> is returned, then the log
+  /// event is logged without consulting the remaining filters.
+  /// </para>
+  /// <para>
+  /// The philosophy of log4net filters is largely inspired from the
+  /// Linux ipchains.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class FilterSkeleton : IFilter
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// Points to the next filter in the filter chain.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="Next"/> for more information.
-		/// </para>
-		/// </remarks>
-		private IFilter m_next;
+    /// <summary>
+    /// Points to the next filter in the filter chain.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="Next"/> for more information.
+    /// </para>
+    /// </remarks>
+    private IFilter m_next;
 
-		#endregion
+    #endregion
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the filter with the options set
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// Typically filter's options become active immediately on set, 
-		/// however this method must still be called. 
-		/// </para>
-		/// </remarks>
-		public virtual void ActivateOptions() 
-		{
-		}
+    /// <summary>
+    /// Initialize the filter with the options set
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// Typically filter's options become active immediately on set, 
+    /// however this method must still be called. 
+    /// </para>
+    /// </remarks>
+    public virtual void ActivateOptions()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IFilter
+    #region Implementation of IFilter
 
-		/// <summary>
-		/// Decide if the <see cref="LoggingEvent"/> should be logged through an appender.
-		/// </summary>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent"/> to decide upon</param>
-		/// <returns>The decision of the filter</returns>
-		/// <remarks>
-		/// <para>
-		/// If the decision is <see cref="FilterDecision.Deny"/>, then the event will be
-		/// dropped. If the decision is <see cref="FilterDecision.Neutral"/>, then the next
-		/// filter, if any, will be invoked. If the decision is <see cref="FilterDecision.Accept"/> then
-		/// the event will be logged without consulting with other filters in
-		/// the chain.
-		/// </para>
-		/// <para>
-		/// This method is marked <c>abstract</c> and must be implemented
-		/// in a subclass.
-		/// </para>
-		/// </remarks>
-		public abstract FilterDecision Decide(LoggingEvent loggingEvent);
+    /// <summary>
+    /// Decide if the <see cref="LoggingEvent"/> should be logged through an appender.
+    /// </summary>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent"/> to decide upon</param>
+    /// <returns>The decision of the filter</returns>
+    /// <remarks>
+    /// <para>
+    /// If the decision is <see cref="FilterDecision.Deny"/>, then the event will be
+    /// dropped. If the decision is <see cref="FilterDecision.Neutral"/>, then the next
+    /// filter, if any, will be invoked. If the decision is <see cref="FilterDecision.Accept"/> then
+    /// the event will be logged without consulting with other filters in
+    /// the chain.
+    /// </para>
+    /// <para>
+    /// This method is marked <c>abstract</c> and must be implemented
+    /// in a subclass.
+    /// </para>
+    /// </remarks>
+    public abstract FilterDecision Decide(LoggingEvent loggingEvent);
 
-		/// <summary>
-		/// Property to get and set the next filter
-		/// </summary>
-		/// <value>
-		/// The next filter in the chain
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Filters are typically composed into chains. This property allows the next filter in 
-		/// the chain to be accessed.
-		/// </para>
-		/// </remarks>
-		public IFilter Next
-		{
-			get { return m_next; }
-			set { m_next = value; }
-		}
+    /// <summary>
+    /// Property to get and set the next filter
+    /// </summary>
+    /// <value>
+    /// The next filter in the chain
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Filters are typically composed into chains. This property allows the next filter in 
+    /// the chain to be accessed.
+    /// </para>
+    /// </remarks>
+    public IFilter Next
+    {
+      get { return m_next; }
+      set { m_next = value; }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Filter/IFilter.cs b/src/log4net/Filter/IFilter.cs
index 8c597a7..66cc91b 100644
--- a/src/log4net/Filter/IFilter.cs
+++ b/src/log4net/Filter/IFilter.cs
@@ -23,80 +23,80 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Implement this interface to provide customized logging event filtering
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Users should implement this interface to implement customized logging
-	/// event filtering. Note that <see cref="log4net.Repository.Hierarchy.Logger"/> and 
-	/// <see cref="log4net.Appender.AppenderSkeleton"/>, the parent class of all standard
-	/// appenders, have built-in filtering rules. It is suggested that you
-	/// first use and understand the built-in rules before rushing to write
-	/// your own custom filters.
-	/// </para>
-	/// <para>
-	/// This abstract class assumes and also imposes that filters be
-	/// organized in a linear chain. The <see cref="Decide"/>
-	/// method of each filter is called sequentially, in the order of their 
-	/// addition to the chain.
-	/// </para>
-	/// <para>
-	/// The <see cref="Decide"/> method must return one
-	/// of the integer constants <see cref="FilterDecision.Deny"/>, 
-	/// <see cref="FilterDecision.Neutral"/> or <see cref="FilterDecision.Accept"/>.
-	/// </para>
-	/// <para>
-	/// If the value <see cref="FilterDecision.Deny"/> is returned, then the log event is dropped 
-	/// immediately without consulting with the remaining filters.
-	/// </para>
-	/// <para>
-	/// If the value <see cref="FilterDecision.Neutral"/> is returned, then the next filter
-	/// in the chain is consulted. If there are no more filters in the
-	/// chain, then the log event is logged. Thus, in the presence of no
-	/// filters, the default behavior is to log all logging events.
-	/// </para>
-	/// <para>
-	/// If the value <see cref="FilterDecision.Accept"/> is returned, then the log
-	/// event is logged without consulting the remaining filters.
-	/// </para>
-	/// <para>
-	/// The philosophy of log4net filters is largely inspired from the
-	/// Linux ipchains.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IFilter : IOptionHandler
-	{
-		/// <summary>
-		/// Decide if the logging event should be logged through an appender.
-		/// </summary>
-		/// <param name="loggingEvent">The LoggingEvent to decide upon</param>
-		/// <returns>The decision of the filter</returns>
-		/// <remarks>
-		/// <para>
-		/// If the decision is <see cref="FilterDecision.Deny"/>, then the event will be
-		/// dropped. If the decision is <see cref="FilterDecision.Neutral"/>, then the next
-		/// filter, if any, will be invoked. If the decision is <see cref="FilterDecision.Accept"/> then
-		/// the event will be logged without consulting with other filters in
-		/// the chain.
-		/// </para>
-		/// </remarks>
-		FilterDecision Decide(LoggingEvent loggingEvent);
+  /// <summary>
+  /// Implement this interface to provide customized logging event filtering
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Users should implement this interface to implement customized logging
+  /// event filtering. Note that <see cref="log4net.Repository.Hierarchy.Logger"/> and 
+  /// <see cref="log4net.Appender.AppenderSkeleton"/>, the parent class of all standard
+  /// appenders, have built-in filtering rules. It is suggested that you
+  /// first use and understand the built-in rules before rushing to write
+  /// your own custom filters.
+  /// </para>
+  /// <para>
+  /// This abstract class assumes and also imposes that filters be
+  /// organized in a linear chain. The <see cref="Decide"/>
+  /// method of each filter is called sequentially, in the order of their 
+  /// addition to the chain.
+  /// </para>
+  /// <para>
+  /// The <see cref="Decide"/> method must return one
+  /// of the integer constants <see cref="FilterDecision.Deny"/>, 
+  /// <see cref="FilterDecision.Neutral"/> or <see cref="FilterDecision.Accept"/>.
+  /// </para>
+  /// <para>
+  /// If the value <see cref="FilterDecision.Deny"/> is returned, then the log event is dropped 
+  /// immediately without consulting with the remaining filters.
+  /// </para>
+  /// <para>
+  /// If the value <see cref="FilterDecision.Neutral"/> is returned, then the next filter
+  /// in the chain is consulted. If there are no more filters in the
+  /// chain, then the log event is logged. Thus, in the presence of no
+  /// filters, the default behavior is to log all logging events.
+  /// </para>
+  /// <para>
+  /// If the value <see cref="FilterDecision.Accept"/> is returned, then the log
+  /// event is logged without consulting the remaining filters.
+  /// </para>
+  /// <para>
+  /// The philosophy of log4net filters is largely inspired from the
+  /// Linux ipchains.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IFilter : IOptionHandler
+  {
+    /// <summary>
+    /// Decide if the logging event should be logged through an appender.
+    /// </summary>
+    /// <param name="loggingEvent">The LoggingEvent to decide upon</param>
+    /// <returns>The decision of the filter</returns>
+    /// <remarks>
+    /// <para>
+    /// If the decision is <see cref="FilterDecision.Deny"/>, then the event will be
+    /// dropped. If the decision is <see cref="FilterDecision.Neutral"/>, then the next
+    /// filter, if any, will be invoked. If the decision is <see cref="FilterDecision.Accept"/> then
+    /// the event will be logged without consulting with other filters in
+    /// the chain.
+    /// </para>
+    /// </remarks>
+    FilterDecision Decide(LoggingEvent loggingEvent);
 
-		/// <summary>
-		/// Property to get and set the next filter
-		/// </summary>
-		/// <value>
-		/// The next filter in the chain
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Filters are typically composed into chains. This property allows the next filter in 
-		/// the chain to be accessed.
-		/// </para>
-		/// </remarks>
-		IFilter Next { get; set; }
-	}
+    /// <summary>
+    /// Property to get and set the next filter
+    /// </summary>
+    /// <value>
+    /// The next filter in the chain
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Filters are typically composed into chains. This property allows the next filter in 
+    /// the chain to be accessed.
+    /// </para>
+    /// </remarks>
+    IFilter Next { get; set; }
+  }
 }
diff --git a/src/log4net/Filter/LevelMatchFilter.cs b/src/log4net/Filter/LevelMatchFilter.cs
index 34a21b3..e257286 100644
--- a/src/log4net/Filter/LevelMatchFilter.cs
+++ b/src/log4net/Filter/LevelMatchFilter.cs
@@ -25,118 +25,118 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// This is a very simple filter based on <see cref="Level"/> matching.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The filter admits two options <see cref="LevelToMatch"/> and
-	/// <see cref="AcceptOnMatch"/>. If there is an exact match between the value
-	/// of the <see cref="LevelToMatch"/> option and the <see cref="Level"/> of the 
-	/// <see cref="LoggingEvent"/>, then the <see cref="Decide"/> method returns <see cref="FilterDecision.Accept"/> in 
-	/// case the <see cref="AcceptOnMatch"/> option value is set
-	/// to <c>true</c>, if it is <c>false</c> then 
-	/// <see cref="FilterDecision.Deny"/> is returned. If the <see cref="Level"/> does not match then
-	/// the result will be <see cref="FilterDecision.Neutral"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class LevelMatchFilter : FilterSkeleton
-	{
-		#region Member Variables
+  /// <summary>
+  /// This is a very simple filter based on <see cref="Level"/> matching.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The filter admits two options <see cref="LevelToMatch"/> and
+  /// <see cref="AcceptOnMatch"/>. If there is an exact match between the value
+  /// of the <see cref="LevelToMatch"/> option and the <see cref="Level"/> of the 
+  /// <see cref="LoggingEvent"/>, then the <see cref="Decide"/> method returns <see cref="FilterDecision.Accept"/> in 
+  /// case the <see cref="AcceptOnMatch"/> option value is set
+  /// to <c>true</c>, if it is <c>false</c> then 
+  /// <see cref="FilterDecision.Deny"/> is returned. If the <see cref="Level"/> does not match then
+  /// the result will be <see cref="FilterDecision.Neutral"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class LevelMatchFilter : FilterSkeleton
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// flag to indicate if the filter should <see cref="FilterDecision.Accept"/> on a match
-		/// </summary>
-		private bool m_acceptOnMatch = true;
+    /// <summary>
+    /// flag to indicate if the filter should <see cref="FilterDecision.Accept"/> on a match
+    /// </summary>
+    private bool m_acceptOnMatch = true;
 
-		/// <summary>
-		/// the <see cref="Level"/> to match against
-		/// </summary>
-		private Level m_levelToMatch;
+    /// <summary>
+    /// the <see cref="Level"/> to match against
+    /// </summary>
+    private Level m_levelToMatch;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public LevelMatchFilter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public LevelMatchFilter()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// <see cref="FilterDecision.Accept"/> when matching <see cref="LevelToMatch"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AcceptOnMatch"/> property is a flag that determines
-		/// the behavior when a matching <see cref="Level"/> is found. If the
-		/// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
-		/// logging event, otherwise it will <see cref="FilterDecision.Deny"/> the event.
-		/// </para>
-		/// <para>
-		/// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
-		/// </para>
-		/// </remarks>
-		public bool AcceptOnMatch
-		{
-			get { return m_acceptOnMatch; }
-			set { m_acceptOnMatch = value; }
-		}
+    /// <summary>
+    /// <see cref="FilterDecision.Accept"/> when matching <see cref="LevelToMatch"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AcceptOnMatch"/> property is a flag that determines
+    /// the behavior when a matching <see cref="Level"/> is found. If the
+    /// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
+    /// logging event, otherwise it will <see cref="FilterDecision.Deny"/> the event.
+    /// </para>
+    /// <para>
+    /// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
+    /// </para>
+    /// </remarks>
+    public bool AcceptOnMatch
+    {
+      get { return m_acceptOnMatch; }
+      set { m_acceptOnMatch = value; }
+    }
 
-		/// <summary>
-		/// The <see cref="Level"/> that the filter will match
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The level that this filter will attempt to match against the 
-		/// <see cref="LoggingEvent"/> level. If a match is found then
-		/// the result depends on the value of <see cref="AcceptOnMatch"/>.
-		/// </para>
-		/// </remarks>
-		public Level LevelToMatch
-		{
-			get { return m_levelToMatch; }
-			set { m_levelToMatch = value; }
-		}
+    /// <summary>
+    /// The <see cref="Level"/> that the filter will match
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The level that this filter will attempt to match against the 
+    /// <see cref="LoggingEvent"/> level. If a match is found then
+    /// the result depends on the value of <see cref="AcceptOnMatch"/>.
+    /// </para>
+    /// </remarks>
+    public Level LevelToMatch
+    {
+      get { return m_levelToMatch; }
+      set { m_levelToMatch = value; }
+    }
 
-		#region Override implementation of FilterSkeleton
+    #region Override implementation of FilterSkeleton
 
-		/// <summary>
-		/// Tests if the <see cref="Level"/> of the logging event matches that of the filter
-		/// </summary>
-		/// <param name="loggingEvent">the event to filter</param>
-		/// <returns>see remarks</returns>
-		/// <remarks>
-		/// <para>
-		/// If the <see cref="Level"/> of the event matches the level of the
-		/// filter then the result of the function depends on the
-		/// value of <see cref="AcceptOnMatch"/>. If it is true then
-		/// the function will return <see cref="FilterDecision.Accept"/>, it it is false then it
-		/// will return <see cref="FilterDecision.Deny"/>. If the <see cref="Level"/> does not match then
-		/// the result will be <see cref="FilterDecision.Neutral"/>.
-		/// </para>
-		/// </remarks>
-		public override FilterDecision Decide(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Tests if the <see cref="Level"/> of the logging event matches that of the filter
+    /// </summary>
+    /// <param name="loggingEvent">the event to filter</param>
+    /// <returns>see remarks</returns>
+    /// <remarks>
+    /// <para>
+    /// If the <see cref="Level"/> of the event matches the level of the
+    /// filter then the result of the function depends on the
+    /// value of <see cref="AcceptOnMatch"/>. If it is true then
+    /// the function will return <see cref="FilterDecision.Accept"/>, it it is false then it
+    /// will return <see cref="FilterDecision.Deny"/>. If the <see cref="Level"/> does not match then
+    /// the result will be <see cref="FilterDecision.Neutral"/>.
+    /// </para>
+    /// </remarks>
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			if (m_levelToMatch != null && m_levelToMatch == loggingEvent.Level) 
-			{
-				// Found match
-				return m_acceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
-			}
-			return FilterDecision.Neutral;
-		}
+      if (m_levelToMatch != null && m_levelToMatch == loggingEvent.Level)
+      {
+        // Found match
+        return m_acceptOnMatch ? FilterDecision.Accept : FilterDecision.Deny;
+      }
+      return FilterDecision.Neutral;
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Filter/LevelRangeFilter.cs b/src/log4net/Filter/LevelRangeFilter.cs
index f6e0be0..f29c7fa 100644
--- a/src/log4net/Filter/LevelRangeFilter.cs
+++ b/src/log4net/Filter/LevelRangeFilter.cs
@@ -25,161 +25,161 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// This is a simple filter based on <see cref="Level"/> matching.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The filter admits three options <see cref="LevelMin"/> and <see cref="LevelMax"/>
-	/// that determine the range of priorities that are matched, and
-	/// <see cref="AcceptOnMatch"/>. If there is a match between the range
-	/// of priorities and the <see cref="Level"/> of the <see cref="LoggingEvent"/>, then the 
-	/// <see cref="Decide"/> method returns <see cref="FilterDecision.Accept"/> in case the <see cref="AcceptOnMatch"/> 
-	/// option value is set to <c>true</c>, if it is <c>false</c>
-	/// then <see cref="FilterDecision.Deny"/> is returned. If there is no match, <see cref="FilterDecision.Deny"/> is returned.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class LevelRangeFilter : FilterSkeleton
-	{
-		#region Member Variables
+  /// <summary>
+  /// This is a simple filter based on <see cref="Level"/> matching.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The filter admits three options <see cref="LevelMin"/> and <see cref="LevelMax"/>
+  /// that determine the range of priorities that are matched, and
+  /// <see cref="AcceptOnMatch"/>. If there is a match between the range
+  /// of priorities and the <see cref="Level"/> of the <see cref="LoggingEvent"/>, then the 
+  /// <see cref="Decide"/> method returns <see cref="FilterDecision.Accept"/> in case the <see cref="AcceptOnMatch"/> 
+  /// option value is set to <c>true</c>, if it is <c>false</c>
+  /// then <see cref="FilterDecision.Deny"/> is returned. If there is no match, <see cref="FilterDecision.Deny"/> is returned.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class LevelRangeFilter : FilterSkeleton
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// Flag to indicate the behavior when matching a <see cref="Level"/>
-		/// </summary>
-		private bool m_acceptOnMatch = true;
+    /// <summary>
+    /// Flag to indicate the behavior when matching a <see cref="Level"/>
+    /// </summary>
+    private bool m_acceptOnMatch = true;
 
-		/// <summary>
-		/// the minimum <see cref="Level"/> value to match
-		/// </summary>
-		private Level m_levelMin;
+    /// <summary>
+    /// the minimum <see cref="Level"/> value to match
+    /// </summary>
+    private Level m_levelMin;
 
-		/// <summary>
-		/// the maximum <see cref="Level"/> value to match
-		/// </summary>
-		private Level m_levelMax;
+    /// <summary>
+    /// the maximum <see cref="Level"/> value to match
+    /// </summary>
+    private Level m_levelMax;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public LevelRangeFilter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public LevelRangeFilter()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// <see cref="FilterDecision.Accept"/> when matching <see cref="LevelMin"/> and <see cref="LevelMax"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AcceptOnMatch"/> property is a flag that determines
-		/// the behavior when a matching <see cref="Level"/> is found. If the
-		/// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
-		/// logging event, otherwise it will <see cref="FilterDecision.Neutral"/> the event.
-		/// </para>
-		/// <para>
-		/// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
-		/// </para>
-		/// </remarks>
-		public bool AcceptOnMatch
-		{
-			get { return m_acceptOnMatch; }
-			set { m_acceptOnMatch = value; }
-		}
+    /// <summary>
+    /// <see cref="FilterDecision.Accept"/> when matching <see cref="LevelMin"/> and <see cref="LevelMax"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AcceptOnMatch"/> property is a flag that determines
+    /// the behavior when a matching <see cref="Level"/> is found. If the
+    /// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
+    /// logging event, otherwise it will <see cref="FilterDecision.Neutral"/> the event.
+    /// </para>
+    /// <para>
+    /// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
+    /// </para>
+    /// </remarks>
+    public bool AcceptOnMatch
+    {
+      get { return m_acceptOnMatch; }
+      set { m_acceptOnMatch = value; }
+    }
 
-		/// <summary>
-		/// Set the minimum matched <see cref="Level"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The minimum level that this filter will attempt to match against the 
-		/// <see cref="LoggingEvent"/> level. If a match is found then
-		/// the result depends on the value of <see cref="AcceptOnMatch"/>.
-		/// </para>
-		/// </remarks>
-		public Level LevelMin
-		{
-			get { return m_levelMin; }
-			set { m_levelMin = value; }
-		}
+    /// <summary>
+    /// Set the minimum matched <see cref="Level"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The minimum level that this filter will attempt to match against the 
+    /// <see cref="LoggingEvent"/> level. If a match is found then
+    /// the result depends on the value of <see cref="AcceptOnMatch"/>.
+    /// </para>
+    /// </remarks>
+    public Level LevelMin
+    {
+      get { return m_levelMin; }
+      set { m_levelMin = value; }
+    }
 
-		/// <summary>
-		/// Sets the maximum matched <see cref="Level"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The maximum level that this filter will attempt to match against the 
-		/// <see cref="LoggingEvent"/> level. If a match is found then
-		/// the result depends on the value of <see cref="AcceptOnMatch"/>.
-		/// </para>
-		/// </remarks>
-		public Level LevelMax
-		{
-			get { return m_levelMax; }
-			set { m_levelMax = value; }
-		}
+    /// <summary>
+    /// Sets the maximum matched <see cref="Level"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The maximum level that this filter will attempt to match against the 
+    /// <see cref="LoggingEvent"/> level. If a match is found then
+    /// the result depends on the value of <see cref="AcceptOnMatch"/>.
+    /// </para>
+    /// </remarks>
+    public Level LevelMax
+    {
+      get { return m_levelMax; }
+      set { m_levelMax = value; }
+    }
 
-		#region Override implementation of FilterSkeleton
+    #region Override implementation of FilterSkeleton
 
-		/// <summary>
-		/// Check if the event should be logged.
-		/// </summary>
-		/// <param name="loggingEvent">the logging event to check</param>
-		/// <returns>see remarks</returns>
-		/// <remarks>
-		/// <para>
-		/// If the <see cref="Level"/> of the logging event is outside the range
-		/// matched by this filter then <see cref="FilterDecision.Deny"/>
-		/// is returned. If the <see cref="Level"/> is matched then the value of
-		/// <see cref="AcceptOnMatch"/> is checked. If it is true then
-		/// <see cref="FilterDecision.Accept"/> is returned, otherwise
-		/// <see cref="FilterDecision.Neutral"/> is returned.
-		/// </para>
-		/// </remarks>
-		public override FilterDecision Decide(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Check if the event should be logged.
+    /// </summary>
+    /// <param name="loggingEvent">the logging event to check</param>
+    /// <returns>see remarks</returns>
+    /// <remarks>
+    /// <para>
+    /// If the <see cref="Level"/> of the logging event is outside the range
+    /// matched by this filter then <see cref="FilterDecision.Deny"/>
+    /// is returned. If the <see cref="Level"/> is matched then the value of
+    /// <see cref="AcceptOnMatch"/> is checked. If it is true then
+    /// <see cref="FilterDecision.Accept"/> is returned, otherwise
+    /// <see cref="FilterDecision.Neutral"/> is returned.
+    /// </para>
+    /// </remarks>
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			if (m_levelMin != null) 
-			{
-				if (loggingEvent.Level < m_levelMin) 
-				{
-					// level of event is less than minimum
-					return FilterDecision.Deny;
-				}
-			}
+      if (m_levelMin != null)
+      {
+        if (loggingEvent.Level < m_levelMin)
+        {
+          // level of event is less than minimum
+          return FilterDecision.Deny;
+        }
+      }
 
-			if (m_levelMax != null) 
-			{
-				if (loggingEvent.Level > m_levelMax) 
-				{
-					// level of event is greater than maximum
-					return FilterDecision.Deny;
-				}
-			}
+      if (m_levelMax != null)
+      {
+        if (loggingEvent.Level > m_levelMax)
+        {
+          // level of event is greater than maximum
+          return FilterDecision.Deny;
+        }
+      }
 
-			if (m_acceptOnMatch) 
-			{
-				// this filter set up to bypass later filters and always return
-				// accept if level in range
-				return FilterDecision.Accept;
-			}
-			else 
-			{
-				// event is ok for this filter; allow later filters to have a look..
-				return FilterDecision.Neutral;
-			}
-		}
+      if (m_acceptOnMatch)
+      {
+        // this filter set up to bypass later filters and always return
+        // accept if level in range
+        return FilterDecision.Accept;
+      }
+      else
+      {
+        // event is ok for this filter; allow later filters to have a look..
+        return FilterDecision.Neutral;
+      }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Filter/LoggerMatchFilter.cs b/src/log4net/Filter/LoggerMatchFilter.cs
index 28264ec..8f57744 100644
--- a/src/log4net/Filter/LoggerMatchFilter.cs
+++ b/src/log4net/Filter/LoggerMatchFilter.cs
@@ -25,136 +25,136 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Simple filter to match a string in the event's logger name.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The works very similar to the <see cref="LevelMatchFilter"/>. It admits two 
-	/// options <see cref="LoggerToMatch"/> and <see cref="AcceptOnMatch"/>. If the 
-	/// <see cref="LoggingEvent.LoggerName"/> of the <see cref="LoggingEvent"/> starts 
-	/// with the value of the <see cref="LoggerToMatch"/> option, then the 
-	/// <see cref="Decide"/> method returns <see cref="FilterDecision.Accept"/> in 
-	/// case the <see cref="AcceptOnMatch"/> option value is set to <c>true</c>, 
-	/// if it is <c>false</c> then <see cref="FilterDecision.Deny"/> is returned.
-	/// </para>
-	/// </remarks>
-	/// <author>Daniel Cazzulino</author>
-	public class LoggerMatchFilter : FilterSkeleton
-	{
-		#region Member Variables
+  /// <summary>
+  /// Simple filter to match a string in the event's logger name.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The works very similar to the <see cref="LevelMatchFilter"/>. It admits two 
+  /// options <see cref="LoggerToMatch"/> and <see cref="AcceptOnMatch"/>. If the 
+  /// <see cref="LoggingEvent.LoggerName"/> of the <see cref="LoggingEvent"/> starts 
+  /// with the value of the <see cref="LoggerToMatch"/> option, then the 
+  /// <see cref="Decide"/> method returns <see cref="FilterDecision.Accept"/> in 
+  /// case the <see cref="AcceptOnMatch"/> option value is set to <c>true</c>, 
+  /// if it is <c>false</c> then <see cref="FilterDecision.Deny"/> is returned.
+  /// </para>
+  /// </remarks>
+  /// <author>Daniel Cazzulino</author>
+  public class LoggerMatchFilter : FilterSkeleton
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// Flag to indicate the behavior when we have a match
-		/// </summary>
-		private bool m_acceptOnMatch = true;
+    /// <summary>
+    /// Flag to indicate the behavior when we have a match
+    /// </summary>
+    private bool m_acceptOnMatch = true;
 
-		/// <summary>
-		/// The logger name string to substring match against the event
-		/// </summary>
-		private string m_loggerToMatch;
+    /// <summary>
+    /// The logger name string to substring match against the event
+    /// </summary>
+    private string m_loggerToMatch;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public LoggerMatchFilter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public LoggerMatchFilter()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Properties
+    #region Properties
 
-		/// <summary>
-		/// <see cref="FilterDecision.Accept"/> when matching <see cref="LoggerToMatch"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AcceptOnMatch"/> property is a flag that determines
-		/// the behavior when a matching <see cref="Level"/> is found. If the
-		/// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
-		/// logging event, otherwise it will <see cref="FilterDecision.Deny"/> the event.
-		/// </para>
-		/// <para>
-		/// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
-		/// </para>
-		/// </remarks>
-		public bool AcceptOnMatch
-		{
-			get { return m_acceptOnMatch; }
-			set { m_acceptOnMatch = value; }
-		}
+    /// <summary>
+    /// <see cref="FilterDecision.Accept"/> when matching <see cref="LoggerToMatch"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AcceptOnMatch"/> property is a flag that determines
+    /// the behavior when a matching <see cref="Level"/> is found. If the
+    /// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
+    /// logging event, otherwise it will <see cref="FilterDecision.Deny"/> the event.
+    /// </para>
+    /// <para>
+    /// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
+    /// </para>
+    /// </remarks>
+    public bool AcceptOnMatch
+    {
+      get { return m_acceptOnMatch; }
+      set { m_acceptOnMatch = value; }
+    }
 
-		/// <summary>
-		/// The <see cref="LoggingEvent.LoggerName"/> that the filter will match
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This filter will attempt to match this value against logger name in
-		/// the following way. The match will be done against the beginning of the
-		/// logger name (using <see cref="M:String.StartsWith(string)"/>). The match is
-		/// case sensitive. If a match is found then
-		/// the result depends on the value of <see cref="AcceptOnMatch"/>.
-		/// </para>
-		/// </remarks>
-		public string LoggerToMatch
-		{
-			get { return m_loggerToMatch; }
-			set { m_loggerToMatch = value; }
-		}
+    /// <summary>
+    /// The <see cref="LoggingEvent.LoggerName"/> that the filter will match
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This filter will attempt to match this value against logger name in
+    /// the following way. The match will be done against the beginning of the
+    /// logger name (using <see cref="M:String.StartsWith(string)"/>). The match is
+    /// case sensitive. If a match is found then
+    /// the result depends on the value of <see cref="AcceptOnMatch"/>.
+    /// </para>
+    /// </remarks>
+    public string LoggerToMatch
+    {
+      get { return m_loggerToMatch; }
+      set { m_loggerToMatch = value; }
+    }
 
-		#endregion 
+    #endregion 
 
-		#region Override implementation of FilterSkeleton
+    #region Override implementation of FilterSkeleton
 
-		/// <summary>
-		/// Check if this filter should allow the event to be logged
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <returns>see remarks</returns>
-		/// <remarks>
-		/// <para>
-		/// The rendered message is matched against the <see cref="LoggerToMatch"/>.
-		/// If the <see cref="LoggerToMatch"/> equals the beginning of 
-		/// the incoming <see cref="LoggingEvent.LoggerName"/> (<see cref="M:String.StartsWith(string)"/>)
-		/// then a match will have occurred. If no match occurs
-		/// this function will return <see cref="FilterDecision.Neutral"/>
-		/// allowing other filters to check the event. If a match occurs then
-		/// the value of <see cref="AcceptOnMatch"/> is checked. If it is
-		/// true then <see cref="FilterDecision.Accept"/> is returned otherwise
-		/// <see cref="FilterDecision.Deny"/> is returned.
-		/// </para>
-		/// </remarks>
-		public override FilterDecision Decide(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Check if this filter should allow the event to be logged
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <returns>see remarks</returns>
+    /// <remarks>
+    /// <para>
+    /// The rendered message is matched against the <see cref="LoggerToMatch"/>.
+    /// If the <see cref="LoggerToMatch"/> equals the beginning of 
+    /// the incoming <see cref="LoggingEvent.LoggerName"/> (<see cref="M:String.StartsWith(string)"/>)
+    /// then a match will have occurred. If no match occurs
+    /// this function will return <see cref="FilterDecision.Neutral"/>
+    /// allowing other filters to check the event. If a match occurs then
+    /// the value of <see cref="AcceptOnMatch"/> is checked. If it is
+    /// true then <see cref="FilterDecision.Accept"/> is returned otherwise
+    /// <see cref="FilterDecision.Deny"/> is returned.
+    /// </para>
+    /// </remarks>
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			// Check if we have been setup to filter
-			if ((m_loggerToMatch != null && m_loggerToMatch.Length != 0) && 
-				loggingEvent.LoggerName.StartsWith(m_loggerToMatch))
-			{
-				// we've got a match
-				if (m_acceptOnMatch) 
-				{
-					return FilterDecision.Accept;
-				} 
-				return FilterDecision.Deny;
-			}
-			else
-			{
-				// We cannot filter so allow the filter chain
-				// to continue processing
-				return FilterDecision.Neutral;
-			}
-		}
+      // Check if we have been setup to filter
+      if ((m_loggerToMatch != null && m_loggerToMatch.Length != 0) &&
+        loggingEvent.LoggerName.StartsWith(m_loggerToMatch))
+      {
+        // we've got a match
+        if (m_acceptOnMatch)
+        {
+          return FilterDecision.Accept;
+        }
+        return FilterDecision.Deny;
+      }
+      else
+      {
+        // We cannot filter so allow the filter chain
+        // to continue processing
+        return FilterDecision.Neutral;
+      }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Filter/MdcFilter.cs b/src/log4net/Filter/MdcFilter.cs
index 3ca7953..adfa6ef 100644
--- a/src/log4net/Filter/MdcFilter.cs
+++ b/src/log4net/Filter/MdcFilter.cs
@@ -26,22 +26,22 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Simple filter to match a keyed string in the <see cref="MDC"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Simple filter to match a keyed string in the <see cref="MDC"/>
-	/// </para>
-	/// <para>
-	/// As the MDC has been replaced with layered properties the
-	/// <see cref="PropertyFilter"/> should be used instead.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/*[Obsolete("MdcFilter has been replaced by PropertyFilter")]*/
-	public class MdcFilter : PropertyFilter
-	{
-	}
+  /// <summary>
+  /// Simple filter to match a keyed string in the <see cref="MDC"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Simple filter to match a keyed string in the <see cref="MDC"/>
+  /// </para>
+  /// <para>
+  /// As the MDC has been replaced with layered properties the
+  /// <see cref="PropertyFilter"/> should be used instead.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /*[Obsolete("MdcFilter has been replaced by PropertyFilter")]*/
+  public class MdcFilter : PropertyFilter
+  {
+  }
 }
diff --git a/src/log4net/Filter/NdcFilter.cs b/src/log4net/Filter/NdcFilter.cs
index e1659fe..4b0a3e0 100644
--- a/src/log4net/Filter/NdcFilter.cs
+++ b/src/log4net/Filter/NdcFilter.cs
@@ -26,35 +26,35 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Simple filter to match a string in the <see cref="NDC"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Simple filter to match a string in the <see cref="NDC"/>
-	/// </para>
-	/// <para>
-	/// As the MDC has been replaced with named stacks stored in the
-	/// properties collections the <see cref="PropertyFilter"/> should 
-	/// be used instead.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/*[Obsolete("NdcFilter has been replaced by PropertyFilter")]*/
-	public class NdcFilter : PropertyFilter
-	{
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Sets the <see cref="PropertyFilter.Key"/> to <c>"NDC"</c>.
-		/// </para>
-		/// </remarks>
-		public NdcFilter()
-		{
-			base.Key = "NDC";
-		}
-	}
+  /// <summary>
+  /// Simple filter to match a string in the <see cref="NDC"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Simple filter to match a string in the <see cref="NDC"/>
+  /// </para>
+  /// <para>
+  /// As the MDC has been replaced with named stacks stored in the
+  /// properties collections the <see cref="PropertyFilter"/> should 
+  /// be used instead.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /*[Obsolete("NdcFilter has been replaced by PropertyFilter")]*/
+  public class NdcFilter : PropertyFilter
+  {
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Sets the <see cref="PropertyFilter.Key"/> to <c>"NDC"</c>.
+    /// </para>
+    /// </remarks>
+    public NdcFilter()
+    {
+      base.Key = "NDC";
+    }
+  }
 }
diff --git a/src/log4net/Filter/PropertyFilter.cs b/src/log4net/Filter/PropertyFilter.cs
index a74a03b..c443807 100644
--- a/src/log4net/Filter/PropertyFilter.cs
+++ b/src/log4net/Filter/PropertyFilter.cs
@@ -26,140 +26,140 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Simple filter to match a string an event property
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Simple filter to match a string in the value for a
-	/// specific event property
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class PropertyFilter : StringMatchFilter
-	{
-		#region Member Variables
+  /// <summary>
+  /// Simple filter to match a string an event property
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Simple filter to match a string in the value for a
+  /// specific event property
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class PropertyFilter : StringMatchFilter
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// The key to use to lookup the string from the event properties
-		/// </summary>
-		private string m_key;
+    /// <summary>
+    /// The key to use to lookup the string from the event properties
+    /// </summary>
+    private string m_key;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public PropertyFilter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public PropertyFilter()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// The key to lookup in the event properties and then match against.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The key name to use to lookup in the properties map of the
-		/// <see cref="LoggingEvent"/>. The match will be performed against 
-		/// the value of this property if it exists.
-		/// </para>
-		/// </remarks>
-		public string Key
-		{
-			get { return m_key; }
-			set { m_key = value; }
-		}
+    /// <summary>
+    /// The key to lookup in the event properties and then match against.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The key name to use to lookup in the properties map of the
+    /// <see cref="LoggingEvent"/>. The match will be performed against 
+    /// the value of this property if it exists.
+    /// </para>
+    /// </remarks>
+    public string Key
+    {
+      get { return m_key; }
+      set { m_key = value; }
+    }
 
-		#region Override implementation of FilterSkeleton
+    #region Override implementation of FilterSkeleton
 
-		/// <summary>
-		/// Check if this filter should allow the event to be logged
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <returns>see remarks</returns>
-		/// <remarks>
-		/// <para>
-		/// The event property for the <see cref="Key"/> is matched against 
-		/// the <see cref="StringMatchFilter.StringToMatch"/>.
-		/// If the <see cref="StringMatchFilter.StringToMatch"/> occurs as a substring within
-		/// the property value then a match will have occurred. If no match occurs
-		/// this function will return <see cref="FilterDecision.Neutral"/>
-		/// allowing other filters to check the event. If a match occurs then
-		/// the value of <see cref="StringMatchFilter.AcceptOnMatch"/> is checked. If it is
-		/// true then <see cref="FilterDecision.Accept"/> is returned otherwise
-		/// <see cref="FilterDecision.Deny"/> is returned.
-		/// </para>
-		/// </remarks>
-		public override FilterDecision Decide(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Check if this filter should allow the event to be logged
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <returns>see remarks</returns>
+    /// <remarks>
+    /// <para>
+    /// The event property for the <see cref="Key"/> is matched against 
+    /// the <see cref="StringMatchFilter.StringToMatch"/>.
+    /// If the <see cref="StringMatchFilter.StringToMatch"/> occurs as a substring within
+    /// the property value then a match will have occurred. If no match occurs
+    /// this function will return <see cref="FilterDecision.Neutral"/>
+    /// allowing other filters to check the event. If a match occurs then
+    /// the value of <see cref="StringMatchFilter.AcceptOnMatch"/> is checked. If it is
+    /// true then <see cref="FilterDecision.Accept"/> is returned otherwise
+    /// <see cref="FilterDecision.Deny"/> is returned.
+    /// </para>
+    /// </remarks>
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			// Check if we have a key to lookup the event property value with
-			if (m_key == null)
-			{
-				// We cannot filter so allow the filter chain
-				// to continue processing
-				return FilterDecision.Neutral;
-			}
+      // Check if we have a key to lookup the event property value with
+      if (m_key == null)
+      {
+        // We cannot filter so allow the filter chain
+        // to continue processing
+        return FilterDecision.Neutral;
+      }
 
-			// Lookup the string to match in from the properties using 
-			// the key specified.
-			object msgObj = loggingEvent.LookupProperty(m_key);
+      // Lookup the string to match in from the properties using 
+      // the key specified.
+      object msgObj = loggingEvent.LookupProperty(m_key);
 
-			// Use an ObjectRenderer to convert the property value to a string
-			string msg = loggingEvent.Repository.RendererMap.FindAndRender(msgObj);
+      // Use an ObjectRenderer to convert the property value to a string
+      string msg = loggingEvent.Repository.RendererMap.FindAndRender(msgObj);
 
-			// Check if we have been setup to filter
-			if (msg == null || (m_stringToMatch == null && m_regexToMatch == null))
-			{
-				// We cannot filter so allow the filter chain
-				// to continue processing
-				return FilterDecision.Neutral;
-			}
-    
-			// Firstly check if we are matching using a regex
-			if (m_regexToMatch != null)
-			{
-				// Check the regex
-				if (m_regexToMatch.Match(msg).Success == false)
-				{
-					// No match, continue processing
-					return FilterDecision.Neutral;
-				} 
+      // Check if we have been setup to filter
+      if (msg == null || (m_stringToMatch == null && m_regexToMatch == null))
+      {
+        // We cannot filter so allow the filter chain
+        // to continue processing
+        return FilterDecision.Neutral;
+      }
 
-				// we've got a match
-				if (m_acceptOnMatch) 
-				{
-					return FilterDecision.Accept;
-				} 
-				return FilterDecision.Deny;
-			}
-			else if (m_stringToMatch != null)
-			{
-				// Check substring match
-				if (msg.IndexOf(m_stringToMatch) == -1) 
-				{
-					// No match, continue processing
-					return FilterDecision.Neutral;
-				} 
+      // Firstly check if we are matching using a regex
+      if (m_regexToMatch != null)
+      {
+        // Check the regex
+        if (m_regexToMatch.Match(msg).Success == false)
+        {
+          // No match, continue processing
+          return FilterDecision.Neutral;
+        }
 
-				// we've got a match
-				if (m_acceptOnMatch) 
-				{
-					return FilterDecision.Accept;
-				} 
-				return FilterDecision.Deny;
-			}
-			return FilterDecision.Neutral;
-		}
+        // we've got a match
+        if (m_acceptOnMatch)
+        {
+          return FilterDecision.Accept;
+        }
+        return FilterDecision.Deny;
+      }
+      else if (m_stringToMatch != null)
+      {
+        // Check substring match
+        if (msg.IndexOf(m_stringToMatch) == -1)
+        {
+          // No match, continue processing
+          return FilterDecision.Neutral;
+        }
 
-		#endregion
-	}
+        // we've got a match
+        if (m_acceptOnMatch)
+        {
+          return FilterDecision.Accept;
+        }
+        return FilterDecision.Deny;
+      }
+      return FilterDecision.Neutral;
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Filter/StringMatchFilter.cs b/src/log4net/Filter/StringMatchFilter.cs
index 840a95d..0c4bb7e 100644
--- a/src/log4net/Filter/StringMatchFilter.cs
+++ b/src/log4net/Filter/StringMatchFilter.cs
@@ -26,220 +26,220 @@
 
 namespace log4net.Filter
 {
-	/// <summary>
-	/// Simple filter to match a string in the rendered message
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Simple filter to match a string in the rendered message
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class StringMatchFilter : FilterSkeleton
-	{
-		#region Member Variables
+  /// <summary>
+  /// Simple filter to match a string in the rendered message
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Simple filter to match a string in the rendered message
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class StringMatchFilter : FilterSkeleton
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// Flag to indicate the behavior when we have a match
-		/// </summary>
-		protected bool m_acceptOnMatch = true;
+    /// <summary>
+    /// Flag to indicate the behavior when we have a match
+    /// </summary>
+    protected bool m_acceptOnMatch = true;
 
-		/// <summary>
-		/// The string to substring match against the message
-		/// </summary>
-		protected string m_stringToMatch;
+    /// <summary>
+    /// The string to substring match against the message
+    /// </summary>
+    protected string m_stringToMatch;
 
-		/// <summary>
-		/// A string regex to match
-		/// </summary>
-		protected string m_stringRegexToMatch;
+    /// <summary>
+    /// A string regex to match
+    /// </summary>
+    protected string m_stringRegexToMatch;
 
-		/// <summary>
-		/// A regex object to match (generated from m_stringRegexToMatch)
-		/// </summary>
-		protected Regex m_regexToMatch;
+    /// <summary>
+    /// A regex object to match (generated from m_stringRegexToMatch)
+    /// </summary>
+    protected Regex m_regexToMatch;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public StringMatchFilter()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public StringMatchFilter()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize and precompile the Regex if required
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			if (m_stringRegexToMatch != null)
-			{
+    /// <summary>
+    /// Initialize and precompile the Regex if required
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      if (m_stringRegexToMatch != null)
+      {
 #if NETSTANDARD1_3
-				m_regexToMatch = new Regex(m_stringRegexToMatch);
+        m_regexToMatch = new Regex(m_stringRegexToMatch);
 #else
-				m_regexToMatch = new Regex(m_stringRegexToMatch, RegexOptions.Compiled);
+        m_regexToMatch = new Regex(m_stringRegexToMatch, RegexOptions.Compiled);
 #endif
-			}
-		}
+      }
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// <see cref="FilterDecision.Accept"/> when matching <see cref="StringToMatch"/> or <see cref="RegexToMatch"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="AcceptOnMatch"/> property is a flag that determines
-		/// the behavior when a matching <see cref="Level"/> is found. If the
-		/// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
-		/// logging event, otherwise it will <see cref="FilterDecision.Neutral"/> the event.
-		/// </para>
-		/// <para>
-		/// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
-		/// </para>
-		/// </remarks>
-		public bool AcceptOnMatch
-		{
-			get { return m_acceptOnMatch; }
-			set { m_acceptOnMatch = value; }
-		}
+    /// <summary>
+    /// <see cref="FilterDecision.Accept"/> when matching <see cref="StringToMatch"/> or <see cref="RegexToMatch"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="AcceptOnMatch"/> property is a flag that determines
+    /// the behavior when a matching <see cref="Level"/> is found. If the
+    /// flag is set to true then the filter will <see cref="FilterDecision.Accept"/> the 
+    /// logging event, otherwise it will <see cref="FilterDecision.Neutral"/> the event.
+    /// </para>
+    /// <para>
+    /// The default is <c>true</c> i.e. to <see cref="FilterDecision.Accept"/> the event.
+    /// </para>
+    /// </remarks>
+    public bool AcceptOnMatch
+    {
+      get { return m_acceptOnMatch; }
+      set { m_acceptOnMatch = value; }
+    }
 
-		/// <summary>
-		/// Sets the static string to match
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The string that will be substring matched against
-		/// the rendered message. If the message contains this
-		/// string then the filter will match. If a match is found then
-		/// the result depends on the value of <see cref="AcceptOnMatch"/>.
-		/// </para>
-		/// <para>
-		/// One of <see cref="StringToMatch"/> or <see cref="RegexToMatch"/>
-		/// must be specified.
-		/// </para>
-		/// </remarks>
-		public string StringToMatch
-		{
-			get { return m_stringToMatch; }
-			set { m_stringToMatch = value; }
-		}
+    /// <summary>
+    /// Sets the static string to match
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The string that will be substring matched against
+    /// the rendered message. If the message contains this
+    /// string then the filter will match. If a match is found then
+    /// the result depends on the value of <see cref="AcceptOnMatch"/>.
+    /// </para>
+    /// <para>
+    /// One of <see cref="StringToMatch"/> or <see cref="RegexToMatch"/>
+    /// must be specified.
+    /// </para>
+    /// </remarks>
+    public string StringToMatch
+    {
+      get { return m_stringToMatch; }
+      set { m_stringToMatch = value; }
+    }
 
-		/// <summary>
-		/// Sets the regular expression to match
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The regular expression pattern that will be matched against
-		/// the rendered message. If the message matches this
-		/// pattern then the filter will match. If a match is found then
-		/// the result depends on the value of <see cref="AcceptOnMatch"/>.
-		/// </para>
-		/// <para>
-		/// One of <see cref="StringToMatch"/> or <see cref="RegexToMatch"/>
-		/// must be specified.
-		/// </para>
-		/// </remarks>
-		public string RegexToMatch
-		{
-			get { return m_stringRegexToMatch; }
-			set { m_stringRegexToMatch = value; }
-		}
+    /// <summary>
+    /// Sets the regular expression to match
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The regular expression pattern that will be matched against
+    /// the rendered message. If the message matches this
+    /// pattern then the filter will match. If a match is found then
+    /// the result depends on the value of <see cref="AcceptOnMatch"/>.
+    /// </para>
+    /// <para>
+    /// One of <see cref="StringToMatch"/> or <see cref="RegexToMatch"/>
+    /// must be specified.
+    /// </para>
+    /// </remarks>
+    public string RegexToMatch
+    {
+      get { return m_stringRegexToMatch; }
+      set { m_stringRegexToMatch = value; }
+    }
 
-		#region Override implementation of FilterSkeleton
+    #region Override implementation of FilterSkeleton
 
-		/// <summary>
-		/// Check if this filter should allow the event to be logged
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <returns>see remarks</returns>
-		/// <remarks>
-		/// <para>
-		/// The rendered message is matched against the <see cref="StringToMatch"/>.
-		/// If the <see cref="StringToMatch"/> occurs as a substring within
-		/// the message then a match will have occurred. If no match occurs
-		/// this function will return <see cref="FilterDecision.Neutral"/>
-		/// allowing other filters to check the event. If a match occurs then
-		/// the value of <see cref="AcceptOnMatch"/> is checked. If it is
-		/// true then <see cref="FilterDecision.Accept"/> is returned otherwise
-		/// <see cref="FilterDecision.Deny"/> is returned.
-		/// </para>
-		/// </remarks>
-		public override FilterDecision Decide(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Check if this filter should allow the event to be logged
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <returns>see remarks</returns>
+    /// <remarks>
+    /// <para>
+    /// The rendered message is matched against the <see cref="StringToMatch"/>.
+    /// If the <see cref="StringToMatch"/> occurs as a substring within
+    /// the message then a match will have occurred. If no match occurs
+    /// this function will return <see cref="FilterDecision.Neutral"/>
+    /// allowing other filters to check the event. If a match occurs then
+    /// the value of <see cref="AcceptOnMatch"/> is checked. If it is
+    /// true then <see cref="FilterDecision.Accept"/> is returned otherwise
+    /// <see cref="FilterDecision.Deny"/> is returned.
+    /// </para>
+    /// </remarks>
+    public override FilterDecision Decide(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			string msg = loggingEvent.RenderedMessage;
+      string msg = loggingEvent.RenderedMessage;
 
-			// Check if we have been setup to filter
-			if (msg == null || (m_stringToMatch == null && m_regexToMatch == null))
-			{
-				// We cannot filter so allow the filter chain
-				// to continue processing
-				return FilterDecision.Neutral;
-			}
-    
-			// Firstly check if we are matching using a regex
-			if (m_regexToMatch != null)
-			{
-				// Check the regex
-				if (m_regexToMatch.Match(msg).Success == false)
-				{
-					// No match, continue processing
-					return FilterDecision.Neutral;
-				} 
+      // Check if we have been setup to filter
+      if (msg == null || (m_stringToMatch == null && m_regexToMatch == null))
+      {
+        // We cannot filter so allow the filter chain
+        // to continue processing
+        return FilterDecision.Neutral;
+      }
 
-				// we've got a match
-				if (m_acceptOnMatch) 
-				{
-					return FilterDecision.Accept;
-				} 
-				return FilterDecision.Deny;
-			}
-			else if (m_stringToMatch != null)
-			{
-				// Check substring match
-				if (msg.IndexOf(m_stringToMatch) == -1) 
-				{
-					// No match, continue processing
-					return FilterDecision.Neutral;
-				} 
+      // Firstly check if we are matching using a regex
+      if (m_regexToMatch != null)
+      {
+        // Check the regex
+        if (m_regexToMatch.Match(msg).Success == false)
+        {
+          // No match, continue processing
+          return FilterDecision.Neutral;
+        }
 
-				// we've got a match
-				if (m_acceptOnMatch) 
-				{
-					return FilterDecision.Accept;
-				} 
-				return FilterDecision.Deny;
-			}
-			return FilterDecision.Neutral;
+        // we've got a match
+        if (m_acceptOnMatch)
+        {
+          return FilterDecision.Accept;
+        }
+        return FilterDecision.Deny;
+      }
+      else if (m_stringToMatch != null)
+      {
+        // Check substring match
+        if (msg.IndexOf(m_stringToMatch) == -1)
+        {
+          // No match, continue processing
+          return FilterDecision.Neutral;
+        }
 
-		}
+        // we've got a match
+        if (m_acceptOnMatch)
+        {
+          return FilterDecision.Accept;
+        }
+        return FilterDecision.Deny;
+      }
+      return FilterDecision.Neutral;
 
-		#endregion
-	}
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/GlobalContext.cs b/src/log4net/GlobalContext.cs
index 222b90c..d698858 100644
--- a/src/log4net/GlobalContext.cs
+++ b/src/log4net/GlobalContext.cs
@@ -24,79 +24,79 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// The log4net Global Context.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <c>GlobalContext</c> provides a location for global debugging 
-	/// information to be stored.
-	/// </para>
-	/// <para>
-	/// The global context has a properties map and these properties can 
-	/// be included in the output of log messages. The <see cref="log4net.Layout.PatternLayout"/>
-	/// supports selecting and outputing these properties.
-	/// </para>
-	/// <para>
-	/// By default the <c>log4net:HostName</c> property is set to the name of 
-	/// the current machine.
-	/// </para>
-	/// </remarks>
-	/// <example>
-	/// <code lang="C#">
-	/// GlobalContext.Properties["hostname"] = Environment.MachineName;
-	/// </code>
-	/// </example>
-	/// <threadsafety static="true" instance="true" />
-	/// <author>Nicko Cadell</author>
-	public sealed class GlobalContext
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// The log4net Global Context.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <c>GlobalContext</c> provides a location for global debugging 
+  /// information to be stored.
+  /// </para>
+  /// <para>
+  /// The global context has a properties map and these properties can 
+  /// be included in the output of log messages. The <see cref="log4net.Layout.PatternLayout"/>
+  /// supports selecting and outputing these properties.
+  /// </para>
+  /// <para>
+  /// By default the <c>log4net:HostName</c> property is set to the name of 
+  /// the current machine.
+  /// </para>
+  /// </remarks>
+  /// <example>
+  /// <code lang="C#">
+  /// GlobalContext.Properties["hostname"] = Environment.MachineName;
+  /// </code>
+  /// </example>
+  /// <threadsafety static="true" instance="true" />
+  /// <author>Nicko Cadell</author>
+  public sealed class GlobalContext
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private Constructor. 
-		/// </summary>
-		/// <remarks>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </remarks>
-		private GlobalContext()
-		{
-		}
+    /// <summary>
+    /// Private Constructor. 
+    /// </summary>
+    /// <remarks>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </remarks>
+    private GlobalContext()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		static GlobalContext()
-		{
-			Properties[log4net.Core.LoggingEvent.HostNameProperty] = SystemInfo.HostName;
-		}
+    static GlobalContext()
+    {
+      Properties[log4net.Core.LoggingEvent.HostNameProperty] = SystemInfo.HostName;
+    }
 
-		#region Public Static Properties
+    #region Public Static Properties
 
-		/// <summary>
-		/// The global properties map.
-		/// </summary>
-		/// <value>
-		/// The global properties map.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The global properties map.
-		/// </para>
-		/// </remarks>
-		public static GlobalContextProperties Properties
-		{
-			get { return s_properties; }
-		}
+    /// <summary>
+    /// The global properties map.
+    /// </summary>
+    /// <value>
+    /// The global properties map.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The global properties map.
+    /// </para>
+    /// </remarks>
+    public static GlobalContextProperties Properties
+    {
+      get { return s_properties; }
+    }
 
-		#endregion Public Static Properties
+    #endregion Public Static Properties
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The global context properties instance
-		/// </summary>
-		private static readonly GlobalContextProperties s_properties = new GlobalContextProperties();
+    /// <summary>
+    /// The global context properties instance
+    /// </summary>
+    private static readonly GlobalContextProperties s_properties = new GlobalContextProperties();
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/ILog.cs b/src/log4net/ILog.cs
index 89d01c7..5558b79 100644
--- a/src/log4net/ILog.cs
+++ b/src/log4net/ILog.cs
@@ -24,937 +24,937 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// The ILog interface is use by application to log messages into
-	/// the log4net framework.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Use the <see cref="LogManager"/> to obtain logger instances
-	/// that implement this interface. The <see cref="M:LogManager.GetLogger(Assembly,Type)"/>
-	/// static method is used to get logger instances.
-	/// </para>
-	/// <para>
-	/// This class contains methods for logging at different levels and also
-	/// has properties for determining if those logging levels are
-	/// enabled in the current configuration.
-	/// </para>
-	/// <para>
-	/// This interface can be implemented in different ways. This documentation
-	/// specifies reasonable behavior that a caller can expect from the actual
-	/// implementation, however different implementations reserve the right to
-	/// do things differently.
-	/// </para>
-	/// </remarks>
-	/// <example>Simple example of logging messages
-	/// <code lang="C#">
-	/// ILog log = LogManager.GetLogger("application-log");
-	/// 
-	/// log.Info("Application Start");
-	/// log.Debug("This is a debug message");
-	/// 
-	/// if (log.IsDebugEnabled)
-	/// {
-	///		log.Debug("This is another debug message");
-	/// }
-	/// </code>
-	/// </example>
-	/// <seealso cref="LogManager"/>
-	/// <seealso cref="M:LogManager.GetLogger(Assembly, Type)"/>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface ILog : ILoggerWrapper
-	{
-		/// <overloads>Log a message object with the <see cref="Level.Debug"/> level.</overloads>
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>DEBUG</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <see cref="Level.Debug"/> level. If this logger is
-		/// <c>DEBUG</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Debug(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object,Exception)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void Debug(object message);
-  
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Debug"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="M:Debug(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void Debug(object message, Exception exception);
+  /// <summary>
+  /// The ILog interface is use by application to log messages into
+  /// the log4net framework.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Use the <see cref="LogManager"/> to obtain logger instances
+  /// that implement this interface. The <see cref="M:LogManager.GetLogger(Assembly,Type)"/>
+  /// static method is used to get logger instances.
+  /// </para>
+  /// <para>
+  /// This class contains methods for logging at different levels and also
+  /// has properties for determining if those logging levels are
+  /// enabled in the current configuration.
+  /// </para>
+  /// <para>
+  /// This interface can be implemented in different ways. This documentation
+  /// specifies reasonable behavior that a caller can expect from the actual
+  /// implementation, however different implementations reserve the right to
+  /// do things differently.
+  /// </para>
+  /// </remarks>
+  /// <example>Simple example of logging messages
+  /// <code lang="C#">
+  /// ILog log = LogManager.GetLogger("application-log");
+  /// 
+  /// log.Info("Application Start");
+  /// log.Debug("This is a debug message");
+  /// 
+  /// if (log.IsDebugEnabled)
+  /// {
+  ///    log.Debug("This is another debug message");
+  /// }
+  /// </code>
+  /// </example>
+  /// <seealso cref="LogManager"/>
+  /// <seealso cref="M:LogManager.GetLogger(Assembly, Type)"/>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface ILog : ILoggerWrapper
+  {
+    /// <overloads>Log a message object with the <see cref="Level.Debug"/> level.</overloads>
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>DEBUG</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <see cref="Level.Debug"/> level. If this logger is
+    /// <c>DEBUG</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Debug(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object,Exception)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void Debug(object message);
 
-		/// <overloads>Log a formatted string with the <see cref="Level.Debug"/> level.</overloads>
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void DebugFormat(string format, params object[] args); 
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Debug"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="M:Debug(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void Debug(object message, Exception exception);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void DebugFormat(string format, object arg0); 
+    /// <overloads>Log a formatted string with the <see cref="Level.Debug"/> level.</overloads>
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void DebugFormat(string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void DebugFormat(string format, object arg0, object arg1); 
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void DebugFormat(string format, object arg0);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void DebugFormat(string format, object arg0, object arg1, object arg2); 
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void DebugFormat(string format, object arg0, object arg1);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="IsDebugEnabled"/>
-		void DebugFormat(IFormatProvider provider, string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void DebugFormat(string format, object arg0, object arg1, object arg2);
 
-		/// <overloads>Log a message object with the <see cref="Level.Info"/> level.</overloads>
-		/// <summary>
-		/// Logs a message object with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>INFO</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <see cref="Level.Info"/> level. If this logger is
-		/// <c>INFO</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Info(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <param name="message">The message object to log.</param>
-		/// <seealso cref="M:Info(object,Exception)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void Info(object message);
-  
-		/// <summary>
-		/// Logs a message object with the <c>INFO</c> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="M:Info(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void Info(object message, Exception exception);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Debug(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="IsDebugEnabled"/>
+    void DebugFormat(IFormatProvider provider, string format, params object[] args);
 
-		/// <overloads>Log a formatted message string with the <see cref="Level.Info"/> level.</overloads>
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object,Exception)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void InfoFormat(string format, params object[] args);
+    /// <overloads>Log a message object with the <see cref="Level.Info"/> level.</overloads>
+    /// <summary>
+    /// Logs a message object with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>INFO</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <see cref="Level.Info"/> level. If this logger is
+    /// <c>INFO</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Info(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <param name="message">The message object to log.</param>
+    /// <seealso cref="M:Info(object,Exception)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void Info(object message);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void InfoFormat(string format, object arg0); 
+    /// <summary>
+    /// Logs a message object with the <c>INFO</c> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="M:Info(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void Info(object message, Exception exception);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void InfoFormat(string format, object arg0, object arg1); 
+    /// <overloads>Log a formatted message string with the <see cref="Level.Info"/> level.</overloads>
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object,Exception)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void InfoFormat(string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void InfoFormat(string format, object arg0, object arg1, object arg2); 
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void InfoFormat(string format, object arg0);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Info(object,Exception)"/>
-		/// <seealso cref="IsInfoEnabled"/>
-		void InfoFormat(IFormatProvider provider, string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void InfoFormat(string format, object arg0, object arg1);
 
-		/// <overloads>Log a message object with the <see cref="Level.Warn"/> level.</overloads>
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>WARN</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <see cref="Level.Warn"/> level. If this logger is
-		/// <c>WARN</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Warn(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <param name="message">The message object to log.</param>
-		/// <seealso cref="M:Warn(object,Exception)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void Warn(object message);
-  
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Warn"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="M:Warn(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void Warn(object message, Exception exception);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void InfoFormat(string format, object arg0, object arg1, object arg2);
 
-		/// <overloads>Log a formatted message string with the <see cref="Level.Warn"/> level.</overloads>
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object,Exception)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void WarnFormat(string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Info(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Info(object,Exception)"/>
+    /// <seealso cref="IsInfoEnabled"/>
+    void InfoFormat(IFormatProvider provider, string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void WarnFormat(string format, object arg0); 
+    /// <overloads>Log a message object with the <see cref="Level.Warn"/> level.</overloads>
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>WARN</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <see cref="Level.Warn"/> level. If this logger is
+    /// <c>WARN</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Warn(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <param name="message">The message object to log.</param>
+    /// <seealso cref="M:Warn(object,Exception)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void Warn(object message);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void WarnFormat(string format, object arg0, object arg1); 
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Warn"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="M:Warn(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void Warn(object message, Exception exception);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void WarnFormat(string format, object arg0, object arg1, object arg2); 
+    /// <overloads>Log a formatted message string with the <see cref="Level.Warn"/> level.</overloads>
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object,Exception)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void WarnFormat(string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Warn(object,Exception)"/>
-		/// <seealso cref="IsWarnEnabled"/>
-		void WarnFormat(IFormatProvider provider, string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void WarnFormat(string format, object arg0);
 
-		/// <overloads>Log a message object with the <see cref="Level.Error"/> level.</overloads>
-		/// <summary>
-		/// Logs a message object with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>ERROR</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <see cref="Level.Error"/> level. If this logger is
-		/// <c>ERROR</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Error(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object,Exception)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void Error(object message);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void WarnFormat(string format, object arg0, object arg1);
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Error"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="M:Error(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void Error(object message, Exception exception);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void WarnFormat(string format, object arg0, object arg1, object arg2);
 
-		/// <overloads>Log a formatted message string with the <see cref="Level.Error"/> level.</overloads>
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object,Exception)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void ErrorFormat(string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Warn(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Warn(object,Exception)"/>
+    /// <seealso cref="IsWarnEnabled"/>
+    void WarnFormat(IFormatProvider provider, string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void ErrorFormat(string format, object arg0); 
+    /// <overloads>Log a message object with the <see cref="Level.Error"/> level.</overloads>
+    /// <summary>
+    /// Logs a message object with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>ERROR</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <see cref="Level.Error"/> level. If this logger is
+    /// <c>ERROR</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Error(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object,Exception)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void Error(object message);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void ErrorFormat(string format, object arg0, object arg1); 
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Error"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="M:Error(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void Error(object message, Exception exception);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void ErrorFormat(string format, object arg0, object arg1, object arg2); 
+    /// <overloads>Log a formatted message string with the <see cref="Level.Error"/> level.</overloads>
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object,Exception)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void ErrorFormat(string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Error(object,Exception)"/>
-		/// <seealso cref="IsErrorEnabled"/>
-		void ErrorFormat(IFormatProvider provider, string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void ErrorFormat(string format, object arg0);
 
-		/// <overloads>Log a message object with the <see cref="Level.Fatal"/> level.</overloads>
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>FATAL</c>
-		/// enabled by comparing the level of this logger with the 
-		/// <see cref="Level.Fatal"/> level. If this logger is
-		/// <c>FATAL</c> enabled, then it converts the message object
-		/// (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of the 
-		/// additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="M:Fatal(object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <param name="message">The message object to log.</param>
-		/// <seealso cref="M:Fatal(object,Exception)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void Fatal(object message);
-  
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Fatal"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="M:Fatal(object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void Fatal(object message, Exception exception);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void ErrorFormat(string format, object arg0, object arg1);
 
-		/// <overloads>Log a formatted message string with the <see cref="Level.Fatal"/> level.</overloads>
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object,Exception)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void FatalFormat(string format, params object[] args);
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void ErrorFormat(string format, object arg0, object arg1, object arg2);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void FatalFormat(string format, object arg0); 
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Error(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Error(object,Exception)"/>
+    /// <seealso cref="IsErrorEnabled"/>
+    void ErrorFormat(IFormatProvider provider, string format, params object[] args);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void FatalFormat(string format, object arg0, object arg1); 
+    /// <overloads>Log a message object with the <see cref="Level.Fatal"/> level.</overloads>
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>FATAL</c>
+    /// enabled by comparing the level of this logger with the 
+    /// <see cref="Level.Fatal"/> level. If this logger is
+    /// <c>FATAL</c> enabled, then it converts the message object
+    /// (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of the 
+    /// additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="M:Fatal(object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <param name="message">The message object to log.</param>
+    /// <seealso cref="M:Fatal(object,Exception)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void Fatal(object message);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void FatalFormat(string format, object arg0, object arg1, object arg2); 
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Fatal"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="M:Fatal(object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void Fatal(object message, Exception exception);
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object,Exception)"/>
-		/// <seealso cref="IsFatalEnabled"/>
-		void FatalFormat(IFormatProvider provider, string format, params object[] args);
+    /// <overloads>Log a formatted message string with the <see cref="Level.Fatal"/> level.</overloads>
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object,Exception)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void FatalFormat(string format, params object[] args);
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <see cref="Level.Debug"/> events, <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This function is intended to lessen the computational cost of
-		/// disabled log debug statements.
-		/// </para>
-		/// <para> For some ILog interface <c>log</c>, when you write:</para>
-		/// <code lang="C#">
-		/// log.Debug("This is entry number: " + i );
-		/// </code>
-		/// <para>
-		/// You incur the cost constructing the message, string construction and concatenation in
-		/// this case, regardless of whether the message is logged or not.
-		/// </para>
-		/// <para>
-		/// If you are worried about speed (who isn't), then you should write:
-		/// </para>
-		/// <code lang="C#">
-		/// if (log.IsDebugEnabled)
-		/// { 
-		///     log.Debug("This is entry number: " + i );
-		/// }
-		/// </code>
-		/// <para>
-		/// This way you will not incur the cost of parameter
-		/// construction if debugging is disabled for <c>log</c>. On
-		/// the other hand, if the <c>log</c> is debug enabled, you
-		/// will incur the cost of evaluating whether the logger is debug
-		/// enabled twice. Once in <see cref="IsDebugEnabled"/> and once in
-		/// the <see cref="M:Debug(object)"/>.  This is an insignificant overhead
-		/// since evaluating a logger takes about 1% of the time it
-		/// takes to actually log. This is the preferred style of logging.
-		/// </para>
-		/// <para>Alternatively if your logger is available statically then the is debug
-		/// enabled state can be stored in a static variable like this:
-		/// </para>
-		/// <code lang="C#">
-		/// private static readonly bool isDebugEnabled = log.IsDebugEnabled;
-		/// </code>
-		/// <para>
-		/// Then when you come to log you can write:
-		/// </para>
-		/// <code lang="C#">
-		/// if (isDebugEnabled)
-		/// { 
-		///     log.Debug("This is entry number: " + i );
-		/// }
-		/// </code>
-		/// <para>
-		/// This way the debug enabled state is only queried once
-		/// when the class is loaded. Using a <c>private static readonly</c>
-		/// variable is the most efficient because it is a run time constant
-		/// and can be heavily optimized by the JIT compiler.
-		/// </para>
-		/// <para>
-		/// Of course if you use a static readonly variable to
-		/// hold the enabled state of the logger then you cannot
-		/// change the enabled state at runtime to vary the logging
-		/// that is produced. You have to decide if you need absolute
-		/// speed or runtime flexibility.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="M:Debug(object)"/>
-		/// <seealso cref="M:DebugFormat(IFormatProvider, string, object[])"/>
-		bool IsDebugEnabled { get; }
-  
-		/// <summary>
-		/// Checks if this logger is enabled for the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <see cref="Level.Info"/> events, <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// For more information see <see cref="ILog.IsDebugEnabled"/>.
-		/// </remarks>
-		/// <seealso cref="M:Info(object)"/>
-		/// <seealso cref="M:InfoFormat(IFormatProvider, string, object[])"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		bool IsInfoEnabled { get; }
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void FatalFormat(string format, object arg0);
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <see cref="Level.Warn"/> events, <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// For more information see <see cref="ILog.IsDebugEnabled"/>.
-		/// </remarks>
-		/// <seealso cref="M:Warn(object)"/>
-		/// <seealso cref="M:WarnFormat(IFormatProvider, string, object[])"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		bool IsWarnEnabled { get; }
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void FatalFormat(string format, object arg0, object arg1);
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <see cref="Level.Error"/> events, <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// For more information see <see cref="ILog.IsDebugEnabled"/>.
-		/// </remarks>
-		/// <seealso cref="M:Error(object)"/>
-		/// <seealso cref="M:ErrorFormat(IFormatProvider, string, object[])"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		bool IsErrorEnabled { get; }
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void FatalFormat(string format, object arg0, object arg1, object arg2);
 
-		/// <summary>
-		/// Checks if this logger is enabled for the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this logger is enabled for <see cref="Level.Fatal"/> events, <c>false</c> otherwise.
-		/// </value>
-		/// <remarks>
-		/// For more information see <see cref="ILog.IsDebugEnabled"/>.
-		/// </remarks>
-		/// <seealso cref="M:Fatal(object)"/>
-		/// <seealso cref="M:FatalFormat(IFormatProvider, string, object[])"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		bool IsFatalEnabled { get; }
-	}
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="M:String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="M:Fatal(object)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object,Exception)"/>
+    /// <seealso cref="IsFatalEnabled"/>
+    void FatalFormat(IFormatProvider provider, string format, params object[] args);
+
+    /// <summary>
+    /// Checks if this logger is enabled for the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <see cref="Level.Debug"/> events, <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This function is intended to lessen the computational cost of
+    /// disabled log debug statements.
+    /// </para>
+    /// <para> For some ILog interface <c>log</c>, when you write:</para>
+    /// <code lang="C#">
+    /// log.Debug("This is entry number: " + i );
+    /// </code>
+    /// <para>
+    /// You incur the cost constructing the message, string construction and concatenation in
+    /// this case, regardless of whether the message is logged or not.
+    /// </para>
+    /// <para>
+    /// If you are worried about speed (who isn't), then you should write:
+    /// </para>
+    /// <code lang="C#">
+    /// if (log.IsDebugEnabled)
+    /// { 
+    ///     log.Debug("This is entry number: " + i );
+    /// }
+    /// </code>
+    /// <para>
+    /// This way you will not incur the cost of parameter
+    /// construction if debugging is disabled for <c>log</c>. On
+    /// the other hand, if the <c>log</c> is debug enabled, you
+    /// will incur the cost of evaluating whether the logger is debug
+    /// enabled twice. Once in <see cref="IsDebugEnabled"/> and once in
+    /// the <see cref="M:Debug(object)"/>.  This is an insignificant overhead
+    /// since evaluating a logger takes about 1% of the time it
+    /// takes to actually log. This is the preferred style of logging.
+    /// </para>
+    /// <para>Alternatively if your logger is available statically then the is debug
+    /// enabled state can be stored in a static variable like this:
+    /// </para>
+    /// <code lang="C#">
+    /// private static readonly bool isDebugEnabled = log.IsDebugEnabled;
+    /// </code>
+    /// <para>
+    /// Then when you come to log you can write:
+    /// </para>
+    /// <code lang="C#">
+    /// if (isDebugEnabled)
+    /// { 
+    ///     log.Debug("This is entry number: " + i );
+    /// }
+    /// </code>
+    /// <para>
+    /// This way the debug enabled state is only queried once
+    /// when the class is loaded. Using a <c>private static readonly</c>
+    /// variable is the most efficient because it is a run time constant
+    /// and can be heavily optimized by the JIT compiler.
+    /// </para>
+    /// <para>
+    /// Of course if you use a static readonly variable to
+    /// hold the enabled state of the logger then you cannot
+    /// change the enabled state at runtime to vary the logging
+    /// that is produced. You have to decide if you need absolute
+    /// speed or runtime flexibility.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="M:Debug(object)"/>
+    /// <seealso cref="M:DebugFormat(IFormatProvider, string, object[])"/>
+    bool IsDebugEnabled { get; }
+
+    /// <summary>
+    /// Checks if this logger is enabled for the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <see cref="Level.Info"/> events, <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// For more information see <see cref="ILog.IsDebugEnabled"/>.
+    /// </remarks>
+    /// <seealso cref="M:Info(object)"/>
+    /// <seealso cref="M:InfoFormat(IFormatProvider, string, object[])"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    bool IsInfoEnabled { get; }
+
+    /// <summary>
+    /// Checks if this logger is enabled for the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <see cref="Level.Warn"/> events, <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// For more information see <see cref="ILog.IsDebugEnabled"/>.
+    /// </remarks>
+    /// <seealso cref="M:Warn(object)"/>
+    /// <seealso cref="M:WarnFormat(IFormatProvider, string, object[])"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    bool IsWarnEnabled { get; }
+
+    /// <summary>
+    /// Checks if this logger is enabled for the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <see cref="Level.Error"/> events, <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// For more information see <see cref="ILog.IsDebugEnabled"/>.
+    /// </remarks>
+    /// <seealso cref="M:Error(object)"/>
+    /// <seealso cref="M:ErrorFormat(IFormatProvider, string, object[])"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    bool IsErrorEnabled { get; }
+
+    /// <summary>
+    /// Checks if this logger is enabled for the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this logger is enabled for <see cref="Level.Fatal"/> events, <c>false</c> otherwise.
+    /// </value>
+    /// <remarks>
+    /// For more information see <see cref="ILog.IsDebugEnabled"/>.
+    /// </remarks>
+    /// <seealso cref="M:Fatal(object)"/>
+    /// <seealso cref="M:FatalFormat(IFormatProvider, string, object[])"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    bool IsFatalEnabled { get; }
+  }
 }
diff --git a/src/log4net/Layout/DynamicPatternLayout.cs b/src/log4net/Layout/DynamicPatternLayout.cs
index 28174be..ef6c4bc 100644
--- a/src/log4net/Layout/DynamicPatternLayout.cs
+++ b/src/log4net/Layout/DynamicPatternLayout.cs
@@ -28,116 +28,116 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// A flexible layout configurable with pattern string that re-evaluates on each call.
-	/// </summary>
-	/// <remarks>
-	/// <para>This class is built on <see cref="PatternLayout"></see> and provides all the
-	/// features and capabilities of PatternLayout.  PatternLayout is a 'static' class
-	/// in that its layout is done once at configuration time.  This class will recreate
-	/// the layout on each reference.</para>
-	/// <para>One important difference between PatternLayout and DynamicPatternLayout is the
-	/// treatment of the Header and Footer parameters in the configuration.  The Header and Footer
-	/// parameters for DynamicPatternLayout must be syntactically in the form of a PatternString,
-	/// but should not be marked as type log4net.Util.PatternString.  Doing so causes the
-	/// pattern to be statically converted at configuration time and causes DynamicPatternLayout
-	/// to perform the same as PatternLayout.</para>
-	/// <para>Please see <see cref="PatternLayout"/> for complete documentation.</para>
-	/// <example>
-	///	&lt;layout type="log4net.Layout.DynamicPatternLayout"&gt;
-	///   &lt;param name="Header" value="%newline**** Trace Opened     Local: %date{yyyy-MM-dd HH:mm:ss.fff}     UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /&gt;
-	///   &lt;param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /&gt;
-	/// &lt;/layout&gt;
-	/// </example>
-	/// </remarks>
-	public class DynamicPatternLayout: PatternLayout
-	{
-		#region Member Variables
-		/// <summary>
-		/// The header PatternString
-		/// </summary>
-		private PatternString m_headerPatternString = new PatternString("");
+  /// <summary>
+  /// A flexible layout configurable with pattern string that re-evaluates on each call.
+  /// </summary>
+  /// <remarks>
+  /// <para>This class is built on <see cref="PatternLayout"></see> and provides all the
+  /// features and capabilities of PatternLayout.  PatternLayout is a 'static' class
+  /// in that its layout is done once at configuration time.  This class will recreate
+  /// the layout on each reference.</para>
+  /// <para>One important difference between PatternLayout and DynamicPatternLayout is the
+  /// treatment of the Header and Footer parameters in the configuration.  The Header and Footer
+  /// parameters for DynamicPatternLayout must be syntactically in the form of a PatternString,
+  /// but should not be marked as type log4net.Util.PatternString.  Doing so causes the
+  /// pattern to be statically converted at configuration time and causes DynamicPatternLayout
+  /// to perform the same as PatternLayout.</para>
+  /// <para>Please see <see cref="PatternLayout"/> for complete documentation.</para>
+  /// <example>
+  ///  &lt;layout type="log4net.Layout.DynamicPatternLayout"&gt;
+  ///   &lt;param name="Header" value="%newline**** Trace Opened     Local: %date{yyyy-MM-dd HH:mm:ss.fff}     UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /&gt;
+  ///   &lt;param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /&gt;
+  /// &lt;/layout&gt;
+  /// </example>
+  /// </remarks>
+  public class DynamicPatternLayout : PatternLayout
+  {
+    #region Member Variables
+    /// <summary>
+    /// The header PatternString
+    /// </summary>
+    private PatternString m_headerPatternString = new PatternString("");
 
-		/// <summary>
-		/// The footer PatternString
-		/// </summary>
-		private PatternString m_footerPatternString  = new PatternString("");
-		#endregion
+    /// <summary>
+    /// The footer PatternString
+    /// </summary>
+    private PatternString m_footerPatternString = new PatternString("");
+    #endregion
 
-		#region Constructors
-		/// <summary>
-		/// Constructs a DynamicPatternLayout using the DefaultConversionPattern
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The default pattern just produces the application supplied message.
-		/// </para>
-		/// </remarks>
-		public DynamicPatternLayout()
-			: base()
-		{
-		}
+    #region Constructors
+    /// <summary>
+    /// Constructs a DynamicPatternLayout using the DefaultConversionPattern
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The default pattern just produces the application supplied message.
+    /// </para>
+    /// </remarks>
+    public DynamicPatternLayout()
+      : base()
+    {
+    }
 
-		/// <summary>
-		/// Constructs a DynamicPatternLayout using the supplied conversion pattern
-		/// </summary>
-		/// <param name="pattern">the pattern to use</param>
-		/// <remarks>
-		/// </remarks>
-		public DynamicPatternLayout (string pattern) 
-			: base(pattern)
-		{
-		}
-		#endregion
+    /// <summary>
+    /// Constructs a DynamicPatternLayout using the supplied conversion pattern
+    /// </summary>
+    /// <param name="pattern">the pattern to use</param>
+    /// <remarks>
+    /// </remarks>
+    public DynamicPatternLayout(string pattern)
+      : base(pattern)
+    {
+    }
+    #endregion
 
-		#region Override implementation of LayoutSkeleton
-		/// <summary>
-		/// The header for the layout format.
-		/// </summary>
-		/// <value>the layout header</value>
-		/// <remarks>
-		/// <para>
-		/// The Header text will be appended before any logging events
-		/// are formatted and appended.
-		/// </para>
-		/// The pattern will be formatted on each get operation.
-		/// </remarks>
-		public override string Header
-		{
-			get
-			{
-				return m_headerPatternString.Format();
-			}
-			set
-			{
-				base.Header = value;
-				m_headerPatternString = new PatternString(value);
-			}
-		}		/* property DynamicPatternLayout Header */
+    #region Override implementation of LayoutSkeleton
+    /// <summary>
+    /// The header for the layout format.
+    /// </summary>
+    /// <value>the layout header</value>
+    /// <remarks>
+    /// <para>
+    /// The Header text will be appended before any logging events
+    /// are formatted and appended.
+    /// </para>
+    /// The pattern will be formatted on each get operation.
+    /// </remarks>
+    public override string Header
+    {
+      get
+      {
+        return m_headerPatternString.Format();
+      }
+      set
+      {
+        base.Header = value;
+        m_headerPatternString = new PatternString(value);
+      }
+    }    /* property DynamicPatternLayout Header */
 
-		/// <summary>
-		/// The footer for the layout format.
-		/// </summary>
-		/// <value>the layout footer</value>
-		/// <remarks>
-		/// <para>
-		/// The Footer text will be appended after all the logging events
-		/// have been formatted and appended.
-		/// </para>
-		/// The pattern will be formatted on each get operation.
-		/// </remarks>
-		public override string Footer
-		{
-			get
-			{
-				return m_footerPatternString.Format();
-			}
-			set
-			{
-				base.Footer = value;
-				m_footerPatternString = new PatternString(value);
-			}
-		}		/* property DynamicPatternLayout Footer */
-		#endregion
-	}			/* class DynamicPatternLayout */
-}				/* namespace log4net.Layout */
+    /// <summary>
+    /// The footer for the layout format.
+    /// </summary>
+    /// <value>the layout footer</value>
+    /// <remarks>
+    /// <para>
+    /// The Footer text will be appended after all the logging events
+    /// have been formatted and appended.
+    /// </para>
+    /// The pattern will be formatted on each get operation.
+    /// </remarks>
+    public override string Footer
+    {
+      get
+      {
+        return m_footerPatternString.Format();
+      }
+      set
+      {
+        base.Footer = value;
+        m_footerPatternString = new PatternString(value);
+      }
+    }    /* property DynamicPatternLayout Footer */
+    #endregion
+  }      /* class DynamicPatternLayout */
+}        /* namespace log4net.Layout */
diff --git a/src/log4net/Layout/ExceptionLayout.cs b/src/log4net/Layout/ExceptionLayout.cs
index 9021707..05c111a 100644
--- a/src/log4net/Layout/ExceptionLayout.cs
+++ b/src/log4net/Layout/ExceptionLayout.cs
@@ -26,83 +26,83 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// A Layout that renders only the Exception text from the logging event
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A Layout that renders only the Exception text from the logging event.
-	/// </para>
-	/// <para>
-	/// This Layout should only be used with appenders that utilize multiple
-	/// layouts (e.g. <see cref="log4net.Appender.AdoNetAppender"/>).
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class ExceptionLayout : LayoutSkeleton
-	{
-		#region Constructors
+  /// <summary>
+  /// A Layout that renders only the Exception text from the logging event
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A Layout that renders only the Exception text from the logging event.
+  /// </para>
+  /// <para>
+  /// This Layout should only be used with appenders that utilize multiple
+  /// layouts (e.g. <see cref="log4net.Appender.AdoNetAppender"/>).
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class ExceptionLayout : LayoutSkeleton
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Constructs a ExceptionLayout
-		/// </para>
-		/// </remarks>
-		public ExceptionLayout()
-		{
-			this.IgnoresException = false;
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Constructs a ExceptionLayout
+    /// </para>
+    /// </remarks>
+    public ExceptionLayout()
+    {
+      this.IgnoresException = false;
+    }
 
-		#endregion
-  
-		#region Implementation of IOptionHandler
+    #endregion
 
-		/// <summary>
-		/// Activate component options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Part of the <see cref="IOptionHandler"/> component activation
-		/// framework.
-		/// </para>
-		/// <para>
-		/// This method does nothing as options become effective immediately.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			// nothing to do.
-		}
+    #region Implementation of IOptionHandler
 
-		#endregion
+    /// <summary>
+    /// Activate component options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Part of the <see cref="IOptionHandler"/> component activation
+    /// framework.
+    /// </para>
+    /// <para>
+    /// This method does nothing as options become effective immediately.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      // nothing to do.
+    }
 
-		#region Override implementation of LayoutSkeleton
+    #endregion
 
-		/// <summary>
-		/// Gets the exception text from the logging event
-		/// </summary>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Write the exception string to the <see cref="TextWriter"/>.
-		/// The exception string is retrieved from <see cref="M:LoggingEvent.GetExceptionString()"/>.
-		/// </para>
-		/// </remarks>
-		public override void Format(TextWriter writer, LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    #region Override implementation of LayoutSkeleton
 
-			writer.Write(loggingEvent.GetExceptionString());
-		}
+    /// <summary>
+    /// Gets the exception text from the logging event
+    /// </summary>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Write the exception string to the <see cref="TextWriter"/>.
+    /// The exception string is retrieved from <see cref="M:LoggingEvent.GetExceptionString()"/>.
+    /// </para>
+    /// </remarks>
+    public override void Format(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-		#endregion
-	}
+      writer.Write(loggingEvent.GetExceptionString());
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/ILayout.cs b/src/log4net/Layout/ILayout.cs
index 2bb6aef..6e2e997 100644
--- a/src/log4net/Layout/ILayout.cs
+++ b/src/log4net/Layout/ILayout.cs
@@ -25,97 +25,97 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Interface implemented by layout objects
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// An <see cref="ILayout"/> object is used to format a <see cref="LoggingEvent"/>
-	/// as text. The <see cref="M:Format(TextWriter,LoggingEvent)"/> method is called by an
-	/// appender to transform the <see cref="LoggingEvent"/> into a string.
-	/// </para>
-	/// <para>
-	/// The layout can also supply <see cref="Header"/> and <see cref="Footer"/>
-	/// text that is appender before any events and after all the events respectively.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface ILayout
-	{
-		/// <summary>
-		/// Implement this method to create your own layout format.
-		/// </summary>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <remarks>
-		/// <para>
-		/// This method is called by an appender to format
-		/// the <paramref name="loggingEvent"/> as text and output to a writer.
-		/// </para>
-		/// <para>
-		/// If the caller does not have a <see cref="TextWriter"/> and prefers the
-		/// event to be formatted as a <see cref="String"/> then the following
-		/// code can be used to format the event into a <see cref="StringWriter"/>.
-		/// </para>
-		/// <code lang="C#">
-		/// StringWriter writer = new StringWriter();
-		/// Layout.Format(writer, loggingEvent);
-		/// string formattedEvent = writer.ToString();
-		/// </code>
-		/// </remarks>
-		void Format(TextWriter writer, LoggingEvent loggingEvent);
+  /// <summary>
+  /// Interface implemented by layout objects
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// An <see cref="ILayout"/> object is used to format a <see cref="LoggingEvent"/>
+  /// as text. The <see cref="M:Format(TextWriter,LoggingEvent)"/> method is called by an
+  /// appender to transform the <see cref="LoggingEvent"/> into a string.
+  /// </para>
+  /// <para>
+  /// The layout can also supply <see cref="Header"/> and <see cref="Footer"/>
+  /// text that is appender before any events and after all the events respectively.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface ILayout
+  {
+    /// <summary>
+    /// Implement this method to create your own layout format.
+    /// </summary>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <remarks>
+    /// <para>
+    /// This method is called by an appender to format
+    /// the <paramref name="loggingEvent"/> as text and output to a writer.
+    /// </para>
+    /// <para>
+    /// If the caller does not have a <see cref="TextWriter"/> and prefers the
+    /// event to be formatted as a <see cref="String"/> then the following
+    /// code can be used to format the event into a <see cref="StringWriter"/>.
+    /// </para>
+    /// <code lang="C#">
+    /// StringWriter writer = new StringWriter();
+    /// Layout.Format(writer, loggingEvent);
+    /// string formattedEvent = writer.ToString();
+    /// </code>
+    /// </remarks>
+    void Format(TextWriter writer, LoggingEvent loggingEvent);
 
-		/// <summary>
-		/// The content type output by this layout. 
-		/// </summary>
-		/// <value>The content type</value>
-		/// <remarks>
-		/// <para>
-		/// The content type output by this layout.
-		/// </para>
-		/// <para>
-		/// This is a MIME type e.g. <c>"text/plain"</c>.
-		/// </para>
-		/// </remarks>
-		string ContentType { get; }
+    /// <summary>
+    /// The content type output by this layout. 
+    /// </summary>
+    /// <value>The content type</value>
+    /// <remarks>
+    /// <para>
+    /// The content type output by this layout.
+    /// </para>
+    /// <para>
+    /// This is a MIME type e.g. <c>"text/plain"</c>.
+    /// </para>
+    /// </remarks>
+    string ContentType { get; }
 
-		/// <summary>
-		/// The header for the layout format.
-		/// </summary>
-		/// <value>the layout header</value>
-		/// <remarks>
-		/// <para>
-		/// The Header text will be appended before any logging events
-		/// are formatted and appended.
-		/// </para>
-		/// </remarks>
-		string Header { get; }
+    /// <summary>
+    /// The header for the layout format.
+    /// </summary>
+    /// <value>the layout header</value>
+    /// <remarks>
+    /// <para>
+    /// The Header text will be appended before any logging events
+    /// are formatted and appended.
+    /// </para>
+    /// </remarks>
+    string Header { get; }
 
-		/// <summary>
-		/// The footer for the layout format.
-		/// </summary>
-		/// <value>the layout footer</value>
-		/// <remarks>
-		/// <para>
-		/// The Footer text will be appended after all the logging events
-		/// have been formatted and appended.
-		/// </para>
-		/// </remarks>
-		string Footer { get; }
+    /// <summary>
+    /// The footer for the layout format.
+    /// </summary>
+    /// <value>the layout footer</value>
+    /// <remarks>
+    /// <para>
+    /// The Footer text will be appended after all the logging events
+    /// have been formatted and appended.
+    /// </para>
+    /// </remarks>
+    string Footer { get; }
 
-		/// <summary>
-		/// Flag indicating if this layout handle exceptions
-		/// </summary>
-		/// <value><c>false</c> if this layout handles exceptions</value>
-		/// <remarks>
-		/// <para>
-		/// If this layout handles the exception object contained within
-		/// <see cref="LoggingEvent"/>, then the layout should return
-		/// <c>false</c>. Otherwise, if the layout ignores the exception
-		/// object, then the layout should return <c>true</c>.
-		/// </para>
-		/// </remarks>
-		bool IgnoresException { get; }
-	}
+    /// <summary>
+    /// Flag indicating if this layout handle exceptions
+    /// </summary>
+    /// <value><c>false</c> if this layout handles exceptions</value>
+    /// <remarks>
+    /// <para>
+    /// If this layout handles the exception object contained within
+    /// <see cref="LoggingEvent"/>, then the layout should return
+    /// <c>false</c>. Otherwise, if the layout ignores the exception
+    /// object, then the layout should return <c>true</c>.
+    /// </para>
+    /// </remarks>
+    bool IgnoresException { get; }
+  }
 }
diff --git a/src/log4net/Layout/IRawLayout.cs b/src/log4net/Layout/IRawLayout.cs
index 41cbf97..4f93b01 100644
--- a/src/log4net/Layout/IRawLayout.cs
+++ b/src/log4net/Layout/IRawLayout.cs
@@ -25,37 +25,37 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Interface for raw layout objects
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface used to format a <see cref="LoggingEvent"/>
-	/// to an object.
-	/// </para>
-	/// <para>
-	/// This interface should not be confused with the
-	/// <see cref="ILayout"/> interface. This interface is used in
-	/// only certain specialized situations where a raw object is
-	/// required rather than a formatted string. The <see cref="ILayout"/>
-	/// is not generally useful than this interface.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[TypeConverter(typeof(RawLayoutConverter))]
-	public interface IRawLayout
-	{
-		/// <summary>
-		/// Implement this method to create your own layout format.
-		/// </summary>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <returns>returns the formatted event</returns>
-		/// <remarks>
-		/// <para>
-		/// Implement this method to create your own layout format.
-		/// </para>
-		/// </remarks>
-		object Format(LoggingEvent loggingEvent);
-	}
+  /// <summary>
+  /// Interface for raw layout objects
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface used to format a <see cref="LoggingEvent"/>
+  /// to an object.
+  /// </para>
+  /// <para>
+  /// This interface should not be confused with the
+  /// <see cref="ILayout"/> interface. This interface is used in
+  /// only certain specialized situations where a raw object is
+  /// required rather than a formatted string. The <see cref="ILayout"/>
+  /// is not generally useful than this interface.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [TypeConverter(typeof(RawLayoutConverter))]
+  public interface IRawLayout
+  {
+    /// <summary>
+    /// Implement this method to create your own layout format.
+    /// </summary>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <returns>returns the formatted event</returns>
+    /// <remarks>
+    /// <para>
+    /// Implement this method to create your own layout format.
+    /// </para>
+    /// </remarks>
+    object Format(LoggingEvent loggingEvent);
+  }
 }
diff --git a/src/log4net/Layout/Layout2RawLayoutAdapter.cs b/src/log4net/Layout/Layout2RawLayoutAdapter.cs
index 9b92bf4..7f8ff25 100644
--- a/src/log4net/Layout/Layout2RawLayoutAdapter.cs
+++ b/src/log4net/Layout/Layout2RawLayoutAdapter.cs
@@ -25,69 +25,69 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Adapts any <see cref="ILayout"/> to a <see cref="IRawLayout"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Where an <see cref="IRawLayout"/> is required this adapter
-	/// allows a <see cref="ILayout"/> to be specified.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class Layout2RawLayoutAdapter : IRawLayout
-	{
-		#region Member Variables
+  /// <summary>
+  /// Adapts any <see cref="ILayout"/> to a <see cref="IRawLayout"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Where an <see cref="IRawLayout"/> is required this adapter
+  /// allows a <see cref="ILayout"/> to be specified.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class Layout2RawLayoutAdapter : IRawLayout
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// The layout to adapt
-		/// </summary>
-		private ILayout m_layout;
+    /// <summary>
+    /// The layout to adapt
+    /// </summary>
+    private ILayout m_layout;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Construct a new adapter
-		/// </summary>
-		/// <param name="layout">the layout to adapt</param>
-		/// <remarks>
-		/// <para>
-		/// Create the adapter for the specified <paramref name="layout"/>.
-		/// </para>
-		/// </remarks>
-		public Layout2RawLayoutAdapter(ILayout layout)
-		{
-			m_layout = layout;
-		}
+    /// <summary>
+    /// Construct a new adapter
+    /// </summary>
+    /// <param name="layout">the layout to adapt</param>
+    /// <remarks>
+    /// <para>
+    /// Create the adapter for the specified <paramref name="layout"/>.
+    /// </para>
+    /// </remarks>
+    public Layout2RawLayoutAdapter(ILayout layout)
+    {
+      m_layout = layout;
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IRawLayout
+    #region Implementation of IRawLayout
 
-		/// <summary>
-		/// Format the logging event as an object.
-		/// </summary>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <returns>returns the formatted event</returns>
-		/// <remarks>
-		/// <para>
-		/// Format the logging event as an object.
-		/// </para>
-		/// <para>
-		/// Uses the <see cref="ILayout"/> object supplied to 
-		/// the constructor to perform the formatting.
-		/// </para>
-		/// </remarks>
-		public virtual object Format(LoggingEvent loggingEvent)
-		{
-			using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
-			m_layout.Format(writer, loggingEvent);
-			return writer.ToString();
-		}
+    /// <summary>
+    /// Format the logging event as an object.
+    /// </summary>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <returns>returns the formatted event</returns>
+    /// <remarks>
+    /// <para>
+    /// Format the logging event as an object.
+    /// </para>
+    /// <para>
+    /// Uses the <see cref="ILayout"/> object supplied to 
+    /// the constructor to perform the formatting.
+    /// </para>
+    /// </remarks>
+    public virtual object Format(LoggingEvent loggingEvent)
+    {
+      using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
+      m_layout.Format(writer, loggingEvent);
+      return writer.ToString();
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/LayoutSkeleton.cs b/src/log4net/Layout/LayoutSkeleton.cs
index 1f26c8e..348eb07 100644
--- a/src/log4net/Layout/LayoutSkeleton.cs
+++ b/src/log4net/Layout/LayoutSkeleton.cs
@@ -25,208 +25,208 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Extend this abstract class to create your own log layout format.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This is the base implementation of the <see cref="ILayout"/>
-	/// interface. Most layout objects should extend this class.
-	/// </para>
-	/// </remarks>
-	/// <remarks>
-	/// <note type="inheritinfo">
-	/// <para>
-	/// Subclasses must implement the <see cref="M:Format(TextWriter,LoggingEvent)"/>
-	/// method.
-	/// </para>
-	/// <para>
-	/// Subclasses should set the <see cref="IgnoresException"/> in their default
-	/// constructor.
-	/// </para>
-	/// </note>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class LayoutSkeleton : ILayout, IOptionHandler
-	{
-		#region Member Variables
+  /// <summary>
+  /// Extend this abstract class to create your own log layout format.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This is the base implementation of the <see cref="ILayout"/>
+  /// interface. Most layout objects should extend this class.
+  /// </para>
+  /// </remarks>
+  /// <remarks>
+  /// <note type="inheritinfo">
+  /// <para>
+  /// Subclasses must implement the <see cref="M:Format(TextWriter,LoggingEvent)"/>
+  /// method.
+  /// </para>
+  /// <para>
+  /// Subclasses should set the <see cref="IgnoresException"/> in their default
+  /// constructor.
+  /// </para>
+  /// </note>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class LayoutSkeleton : ILayout, IOptionHandler
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// The header text
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="Header"/> for more information.
-		/// </para>
-		/// </remarks>
-		private string m_header = null;
+    /// <summary>
+    /// The header text
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="Header"/> for more information.
+    /// </para>
+    /// </remarks>
+    private string m_header = null;
 
-		/// <summary>
-		/// The footer text
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// See <see cref="Footer"/> for more information.
-		/// </para>
-		/// </remarks>
-		private string m_footer = null;
+    /// <summary>
+    /// The footer text
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// See <see cref="Footer"/> for more information.
+    /// </para>
+    /// </remarks>
+    private string m_footer = null;
 
-		/// <summary>
-		/// Flag indicating if this layout handles exceptions
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <c>false</c> if this layout handles exceptions
-		/// </para>
-		/// </remarks>
-		private bool m_ignoresException = true;
+    /// <summary>
+    /// Flag indicating if this layout handles exceptions
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <c>false</c> if this layout handles exceptions
+    /// </para>
+    /// </remarks>
+    private bool m_ignoresException = true;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Empty default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Empty default constructor
-		/// </para>
-		/// </remarks>
-		protected LayoutSkeleton()
-		{
-		}
+    /// <summary>
+    /// Empty default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Empty default constructor
+    /// </para>
+    /// </remarks>
+    protected LayoutSkeleton()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Activate component options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// This method must be implemented by the subclass.
-		/// </para>
-		/// </remarks>
-		public abstract void ActivateOptions();
+    /// <summary>
+    /// Activate component options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// This method must be implemented by the subclass.
+    /// </para>
+    /// </remarks>
+    public abstract void ActivateOptions();
 
-		#endregion
+    #endregion
 
-		#region Implementation of ILayout
+    #region Implementation of ILayout
 
-		/// <summary>
-		/// Implement this method to create your own layout format.
-		/// </summary>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <remarks>
-		/// <para>
-		/// This method is called by an appender to format
-		/// the <paramref name="loggingEvent"/> as text.
-		/// </para>
-		/// </remarks>
-		public abstract void Format(TextWriter writer, LoggingEvent loggingEvent);
+    /// <summary>
+    /// Implement this method to create your own layout format.
+    /// </summary>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <remarks>
+    /// <para>
+    /// This method is called by an appender to format
+    /// the <paramref name="loggingEvent"/> as text.
+    /// </para>
+    /// </remarks>
+    public abstract void Format(TextWriter writer, LoggingEvent loggingEvent);
 
-		/// <summary>
-		/// Convenience method for easily formatting the logging event into a string variable.
-		/// </summary>
-		/// <param name="loggingEvent"></param>
-		/// <remarks>
-		/// Creates a new StringWriter instance to store the formatted logging event.
-		/// </remarks>
-		public string Format(LoggingEvent loggingEvent)
-		{
-			using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
-			Format(writer, loggingEvent);
-			return writer.ToString();
-		}
+    /// <summary>
+    /// Convenience method for easily formatting the logging event into a string variable.
+    /// </summary>
+    /// <param name="loggingEvent"></param>
+    /// <remarks>
+    /// Creates a new StringWriter instance to store the formatted logging event.
+    /// </remarks>
+    public string Format(LoggingEvent loggingEvent)
+    {
+      using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
+      Format(writer, loggingEvent);
+      return writer.ToString();
+    }
 
-		/// <summary>
-		/// The content type output by this layout. 
-		/// </summary>
-		/// <value>The content type is <c>"text/plain"</c></value>
-		/// <remarks>
-		/// <para>
-		/// The content type output by this layout.
-		/// </para>
-		/// <para>
-		/// This base class uses the value <c>"text/plain"</c>.
-		/// To change this value a subclass must override this
-		/// property.
-		/// </para>
-		/// </remarks>
-		public virtual string ContentType
-		{
-			get { return "text/plain"; }
-		}
+    /// <summary>
+    /// The content type output by this layout. 
+    /// </summary>
+    /// <value>The content type is <c>"text/plain"</c></value>
+    /// <remarks>
+    /// <para>
+    /// The content type output by this layout.
+    /// </para>
+    /// <para>
+    /// This base class uses the value <c>"text/plain"</c>.
+    /// To change this value a subclass must override this
+    /// property.
+    /// </para>
+    /// </remarks>
+    public virtual string ContentType
+    {
+      get { return "text/plain"; }
+    }
 
-		/// <summary>
-		/// The header for the layout format.
-		/// </summary>
-		/// <value>the layout header</value>
-		/// <remarks>
-		/// <para>
-		/// The Header text will be appended before any logging events
-		/// are formatted and appended.
-		/// </para>
-		/// </remarks>
-		public virtual string Header
-		{
-			get { return m_header; }
-			set { m_header = value; }
-		}
+    /// <summary>
+    /// The header for the layout format.
+    /// </summary>
+    /// <value>the layout header</value>
+    /// <remarks>
+    /// <para>
+    /// The Header text will be appended before any logging events
+    /// are formatted and appended.
+    /// </para>
+    /// </remarks>
+    public virtual string Header
+    {
+      get { return m_header; }
+      set { m_header = value; }
+    }
 
-		/// <summary>
-		/// The footer for the layout format.
-		/// </summary>
-		/// <value>the layout footer</value>
-		/// <remarks>
-		/// <para>
-		/// The Footer text will be appended after all the logging events
-		/// have been formatted and appended.
-		/// </para>
-		/// </remarks>
-		public virtual string Footer
-		{
-			get { return m_footer; }
-			set { m_footer = value; }
-		}
+    /// <summary>
+    /// The footer for the layout format.
+    /// </summary>
+    /// <value>the layout footer</value>
+    /// <remarks>
+    /// <para>
+    /// The Footer text will be appended after all the logging events
+    /// have been formatted and appended.
+    /// </para>
+    /// </remarks>
+    public virtual string Footer
+    {
+      get { return m_footer; }
+      set { m_footer = value; }
+    }
 
-		/// <summary>
-		/// Flag indicating if this layout handles exceptions
-		/// </summary>
-		/// <value><c>false</c> if this layout handles exceptions</value>
-		/// <remarks>
-		/// <para>
-		/// If this layout handles the exception object contained within
-		/// <see cref="LoggingEvent"/>, then the layout should return
-		/// <c>false</c>. Otherwise, if the layout ignores the exception
-		/// object, then the layout should return <c>true</c>.
-		/// </para>
-		/// <para>
-		/// Set this value to override a this default setting. The default
-		/// value is <c>true</c>, this layout does not handle the exception.
-		/// </para>
-		/// </remarks>
-		public virtual bool IgnoresException 
-		{ 
-			get { return m_ignoresException; }
-			set { m_ignoresException = value; }
-		}
+    /// <summary>
+    /// Flag indicating if this layout handles exceptions
+    /// </summary>
+    /// <value><c>false</c> if this layout handles exceptions</value>
+    /// <remarks>
+    /// <para>
+    /// If this layout handles the exception object contained within
+    /// <see cref="LoggingEvent"/>, then the layout should return
+    /// <c>false</c>. Otherwise, if the layout ignores the exception
+    /// object, then the layout should return <c>true</c>.
+    /// </para>
+    /// <para>
+    /// Set this value to override a this default setting. The default
+    /// value is <c>true</c>, this layout does not handle the exception.
+    /// </para>
+    /// </remarks>
+    public virtual bool IgnoresException
+    {
+      get { return m_ignoresException; }
+      set { m_ignoresException = value; }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs b/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs
index 30b7f09..79c7322 100644
--- a/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/AppDomainPatternConverter.cs
@@ -25,31 +25,31 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the event appdomain name to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the <see cref="LoggingEvent.Domain"/> to the output writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Daniel Cazzulino</author>
-	/// <author>Nicko Cadell</author>
-	internal sealed class AppDomainPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the event appdomain name to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="LoggingEvent.Domain"/> to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write(loggingEvent.Domain);
-		}
-	}
+  /// <summary>
+  /// Write the event appdomain name to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the <see cref="LoggingEvent.Domain"/> to the output writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Daniel Cazzulino</author>
+  /// <author>Nicko Cadell</author>
+  internal sealed class AppDomainPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the event appdomain name to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="LoggingEvent.Domain"/> to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.Domain);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/AspNetCachePatternConverter.cs b/src/log4net/Layout/Pattern/AspNetCachePatternConverter.cs
index 31f2fc4..32c8cca 100644
--- a/src/log4net/Layout/Pattern/AspNetCachePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/AspNetCachePatternConverter.cs
@@ -29,50 +29,50 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter for items in the ASP.Net Cache.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs an item from the <see cref="HttpRuntime.Cache" />.
-	/// </para>
-	/// </remarks>
-	/// <author>Ron Grabowski</author>
-	internal sealed class AspNetCachePatternConverter : AspNetPatternLayoutConverter
-	{
-		/// <summary>
-		/// Write the ASP.Net Cache item to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
-		/// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the value of a named property. The property name
-		/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property. If no property has been set, all key value pairs from the Cache will
-		/// be written to the output.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
-		{
-			if (HttpRuntime.Cache != null)
-			{
-				if (Option != null)
-				{
-					WriteObject(writer, loggingEvent.Repository, HttpRuntime.Cache[Option]);
-				}
-				else
-				{
-					WriteObject(writer, loggingEvent.Repository, HttpRuntime.Cache.GetEnumerator());
-				}
-			}
-			else
-			{
-				writer.Write(SystemInfo.NotAvailableText);
-			}
-		}
-	}
+  /// <summary>
+  /// Converter for items in the ASP.Net Cache.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs an item from the <see cref="HttpRuntime.Cache" />.
+  /// </para>
+  /// </remarks>
+  /// <author>Ron Grabowski</author>
+  internal sealed class AspNetCachePatternConverter : AspNetPatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the ASP.Net Cache item to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
+    /// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property. If no property has been set, all key value pairs from the Cache will
+    /// be written to the output.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
+    {
+      if (HttpRuntime.Cache != null)
+      {
+        if (Option != null)
+        {
+          WriteObject(writer, loggingEvent.Repository, HttpRuntime.Cache[Option]);
+        }
+        else
+        {
+          WriteObject(writer, loggingEvent.Repository, HttpRuntime.Cache.GetEnumerator());
+        }
+      }
+      else
+      {
+        writer.Write(SystemInfo.NotAvailableText);
+      }
+    }
+  }
 }
 
 #endif // !NETCF && !SSCLI && !CLIENT_PROFILE
diff --git a/src/log4net/Layout/Pattern/AspNetContextPatternConverter.cs b/src/log4net/Layout/Pattern/AspNetContextPatternConverter.cs
index effefe1..1cd902f 100644
--- a/src/log4net/Layout/Pattern/AspNetContextPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/AspNetContextPatternConverter.cs
@@ -28,42 +28,42 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter for items in the <see cref="HttpContext" />.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs an item from the <see cref="HttpContext" />.
-	/// </para>
-	/// </remarks>
-	/// <author>Ron Grabowski</author>
-	internal sealed class AspNetContextPatternConverter : AspNetPatternLayoutConverter
-	{
-		/// <summary>
-		/// Write the ASP.Net HttpContext item to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
-		/// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the value of a named property. The property name
-		/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
-		{
-			if (Option != null)
-			{
-				WriteObject(writer, loggingEvent.Repository, httpContext.Items[Option]);
-			}
-			else
-			{
-				WriteObject(writer, loggingEvent.Repository, httpContext.Items);
-			}
-		}
-	}
+  /// <summary>
+  /// Converter for items in the <see cref="HttpContext" />.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs an item from the <see cref="HttpContext" />.
+  /// </para>
+  /// </remarks>
+  /// <author>Ron Grabowski</author>
+  internal sealed class AspNetContextPatternConverter : AspNetPatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the ASP.Net HttpContext item to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
+    /// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
+    {
+      if (Option != null)
+      {
+        WriteObject(writer, loggingEvent.Repository, httpContext.Items[Option]);
+      }
+      else
+      {
+        WriteObject(writer, loggingEvent.Repository, httpContext.Items);
+      }
+    }
+  }
 }
 
 #endif // !NETCF && !SSCLI && !CLIENT_PROFILE
diff --git a/src/log4net/Layout/Pattern/AspNetPatternConverter.cs b/src/log4net/Layout/Pattern/AspNetPatternConverter.cs
index f764790..17d2ca1 100644
--- a/src/log4net/Layout/Pattern/AspNetPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/AspNetPatternConverter.cs
@@ -29,38 +29,38 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Abstract class that provides access to the current HttpContext (<see cref="HttpContext.Current" />) that 
-	/// derived classes need.
-	/// </summary>
-	/// <remarks>
-	/// This class handles the case when HttpContext.Current is null by writing
-	/// <see cref="SystemInfo.NotAvailableText" /> to the writer.
-	/// </remarks>
-	/// <author>Ron Grabowski</author>
-	internal abstract class AspNetPatternLayoutConverter : PatternLayoutConverter
-	{
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			if (HttpContext.Current == null)
-			{
-				writer.Write(SystemInfo.NotAvailableText);
-			}
-			else
-			{
-				Convert(writer, loggingEvent, HttpContext.Current);
-			}
-		}
+  /// <summary>
+  /// Abstract class that provides access to the current HttpContext (<see cref="HttpContext.Current" />) that 
+  /// derived classes need.
+  /// </summary>
+  /// <remarks>
+  /// This class handles the case when HttpContext.Current is null by writing
+  /// <see cref="SystemInfo.NotAvailableText" /> to the writer.
+  /// </remarks>
+  /// <author>Ron Grabowski</author>
+  internal abstract class AspNetPatternLayoutConverter : PatternLayoutConverter
+  {
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (HttpContext.Current == null)
+      {
+        writer.Write(SystemInfo.NotAvailableText);
+      }
+      else
+      {
+        Convert(writer, loggingEvent, HttpContext.Current);
+      }
+    }
 
-		/// <summary>
-		/// Derived pattern converters must override this method in order to
-		/// convert conversion specifiers in the correct way.
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
-		/// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
-		protected abstract void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext);
-	}
+    /// <summary>
+    /// Derived pattern converters must override this method in order to
+    /// convert conversion specifiers in the correct way.
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
+    /// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
+    protected abstract void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext);
+  }
 }
 
 #endif // !NETCF && !SSCLI && !CLIENT_PROFILE
diff --git a/src/log4net/Layout/Pattern/AspNetRequestPatternConverter.cs b/src/log4net/Layout/Pattern/AspNetRequestPatternConverter.cs
index 9a7c67b..01b203e 100644
--- a/src/log4net/Layout/Pattern/AspNetRequestPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/AspNetRequestPatternConverter.cs
@@ -29,59 +29,62 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter for items in the ASP.Net Cache.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs an item from the <see cref="HttpRuntime.Cache" />.
-	/// </para>
-	/// </remarks>
-	/// <author>Ron Grabowski</author>
-	internal sealed class AspNetRequestPatternConverter : AspNetPatternLayoutConverter
-	{
-		/// <summary>
-		/// Write the ASP.Net Cache item to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
-		/// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the value of a named property. The property name
-		/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
-		{
-		    HttpRequest request = null;
-		    try {
-			request = httpContext.Request;
-		    } catch (HttpException) {
-			// likely a case of running in IIS integrated mode
-			// when inside an Application_Start event.
-			// treat it like a case of the Request
-			// property returning null
-		    }
+  /// <summary>
+  /// Converter for items in the ASP.Net Cache.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs an item from the <see cref="HttpRuntime.Cache" />.
+  /// </para>
+  /// </remarks>
+  /// <author>Ron Grabowski</author>
+  internal sealed class AspNetRequestPatternConverter : AspNetPatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the ASP.Net Cache item to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
+    /// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
+    {
+      HttpRequest request = null;
+      try
+      {
+        request = httpContext.Request;
+      }
+      catch (HttpException)
+      {
+        // likely a case of running in IIS integrated mode
+        // when inside an Application_Start event.
+        // treat it like a case of the Request
+        // property returning null
+      }
 
-			if (request != null)
-			{
-				if (Option != null)
-				{
-					WriteObject(writer, loggingEvent.Repository, httpContext.Request.Params[Option]);
-				}
-				else
-				{
-					WriteObject(writer, loggingEvent.Repository, httpContext.Request.Params);
-				}
-			}
-			else
-			{
-				writer.Write(SystemInfo.NotAvailableText);
-			}
-		}
-	}
+      if (request != null)
+      {
+        if (Option != null)
+        {
+          WriteObject(writer, loggingEvent.Repository, httpContext.Request.Params[Option]);
+        }
+        else
+        {
+          WriteObject(writer, loggingEvent.Repository, httpContext.Request.Params);
+        }
+      }
+      else
+      {
+        writer.Write(SystemInfo.NotAvailableText);
+      }
+    }
+  }
 }
 
 #endif // !NETCF && !SSCLI && !CLIENT_PROFILE
diff --git a/src/log4net/Layout/Pattern/AspNetSessionPatternConverter.cs b/src/log4net/Layout/Pattern/AspNetSessionPatternConverter.cs
index d7e52b2..8cbcae6 100644
--- a/src/log4net/Layout/Pattern/AspNetSessionPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/AspNetSessionPatternConverter.cs
@@ -29,50 +29,50 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter for items in the ASP.Net Cache.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs an item from the <see cref="HttpRuntime.Cache" />.
-	/// </para>
-	/// </remarks>
-	/// <author>Ron Grabowski</author>
-	internal sealed class AspNetSessionPatternConverter : AspNetPatternLayoutConverter
-	{
-		/// <summary>
-		/// Write the ASP.Net Cache item to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
-		/// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the value of a named property. The property name
-		/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property. If no property has been set, all key value pairs from the Session will
-		/// be written to the output.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
-		{
-			if (httpContext.Session != null)
-			{
-				if (Option != null)
-				{
-					WriteObject(writer, loggingEvent.Repository, httpContext.Session.Contents[Option]);
-				}
-				else
-				{
-					WriteObject(writer, loggingEvent.Repository, httpContext.Session);
-				}
-			}
-			else
-			{
-				writer.Write(SystemInfo.NotAvailableText);
-			}
-		}
-	}
+  /// <summary>
+  /// Converter for items in the ASP.Net Cache.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs an item from the <see cref="HttpRuntime.Cache" />.
+  /// </para>
+  /// </remarks>
+  /// <author>Ron Grabowski</author>
+  internal sealed class AspNetSessionPatternConverter : AspNetPatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the ASP.Net Cache item to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
+    /// <param name="httpContext">The <see cref="HttpContext" /> under which the ASP.Net request is running.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property. If no property has been set, all key value pairs from the Session will
+    /// be written to the output.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent, HttpContext httpContext)
+    {
+      if (httpContext.Session != null)
+      {
+        if (Option != null)
+        {
+          WriteObject(writer, loggingEvent.Repository, httpContext.Session.Contents[Option]);
+        }
+        else
+        {
+          WriteObject(writer, loggingEvent.Repository, httpContext.Session);
+        }
+      }
+      else
+      {
+        writer.Write(SystemInfo.NotAvailableText);
+      }
+    }
+  }
 }
 
 #endif // !NETCF && !SSCLI && !CLIENT_PROFILE
diff --git a/src/log4net/Layout/Pattern/DatePatternConverter.cs b/src/log4net/Layout/Pattern/DatePatternConverter.cs
index c283ba1..7f24bbb 100644
--- a/src/log4net/Layout/Pattern/DatePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/DatePatternConverter.cs
@@ -26,164 +26,164 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
-	/// the date of a <see cref="LoggingEvent"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Render the <see cref="LoggingEvent.TimeStamp"/> to the writer as a string.
-	/// </para>
-	/// <para>
-	/// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
-	/// the formatting of the date. The following values are allowed:
-	/// <list type="definition">
-	///		<listheader>
-	/// 		<term>Option value</term>
-	/// 		<description>Output</description>
-	/// 	</listheader>
-	///		<item>
-	/// 		<term>ISO8601</term>
-	/// 		<description>
-	/// 		Uses the <see cref="Iso8601DateFormatter"/> formatter. 
-	/// 		Formats using the <c>"yyyy-MM-dd HH:mm:ss,fff"</c> pattern.
-	/// 		</description>
-	/// 	</item>
-	/// 	<item>
-	/// 		<term>DATE</term>
-	/// 		<description>
-	/// 		Uses the <see cref="DateTimeDateFormatter"/> formatter. 
-	/// 		Formats using the <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, <c>"06 Nov 1994 15:49:37,459"</c>.
-	/// 		</description>
-	/// 	</item>
-	/// 	<item>
-	/// 		<term>ABSOLUTE</term>
-	/// 		<description>
-	/// 		Uses the <see cref="AbsoluteTimeDateFormatter"/> formatter. 
-	/// 		Formats using the <c>"HH:mm:ss,yyyy"</c> for example, <c>"15:49:37,459"</c>.
-	/// 		</description>
-	/// 	</item>
-	/// 	<item>
-	/// 		<term>other</term>
-	/// 		<description>
-	/// 		Any other pattern string uses the <see cref="SimpleDateFormatter"/> formatter. 
-	/// 		This formatter passes the pattern string to the <see cref="DateTime"/> 
-	/// 		<see cref="M:DateTime.ToString(string)"/> method.
-	/// 		For details on valid patterns see 
-	/// 		<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp">DateTimeFormatInfo Class</a>.
-	/// 		</description>
-	/// 	</item>
-	/// </list>
-	/// </para>
-	/// <para>
-	/// The <see cref="LoggingEvent.TimeStamp"/> is in the local time zone and is rendered in that zone.
-	/// To output the time in Universal time see <see cref="UtcDatePatternConverter"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal class DatePatternConverter : PatternLayoutConverter, IOptionHandler
-	{
-		/// <summary>
-		/// The <see cref="IDateFormatter"/> used to render the date to a string
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="IDateFormatter"/> used to render the date to a string
-		/// </para>
-		/// </remarks>
-		protected IDateFormatter m_dateFormatter;
-	
-		#region Implementation of IOptionHandler
+  /// <summary>
+  /// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
+  /// the date of a <see cref="LoggingEvent"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Render the <see cref="LoggingEvent.TimeStamp"/> to the writer as a string.
+  /// </para>
+  /// <para>
+  /// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
+  /// the formatting of the date. The following values are allowed:
+  /// <list type="definition">
+  ///    <listheader>
+  ///     <term>Option value</term>
+  ///     <description>Output</description>
+  ///   </listheader>
+  ///    <item>
+  ///     <term>ISO8601</term>
+  ///     <description>
+  ///     Uses the <see cref="Iso8601DateFormatter"/> formatter. 
+  ///     Formats using the <c>"yyyy-MM-dd HH:mm:ss,fff"</c> pattern.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>DATE</term>
+  ///     <description>
+  ///     Uses the <see cref="DateTimeDateFormatter"/> formatter. 
+  ///     Formats using the <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, <c>"06 Nov 1994 15:49:37,459"</c>.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>ABSOLUTE</term>
+  ///     <description>
+  ///     Uses the <see cref="AbsoluteTimeDateFormatter"/> formatter. 
+  ///     Formats using the <c>"HH:mm:ss,yyyy"</c> for example, <c>"15:49:37,459"</c>.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>other</term>
+  ///     <description>
+  ///     Any other pattern string uses the <see cref="SimpleDateFormatter"/> formatter. 
+  ///     This formatter passes the pattern string to the <see cref="DateTime"/> 
+  ///     <see cref="M:DateTime.ToString(string)"/> method.
+  ///     For details on valid patterns see 
+  ///     <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp">DateTimeFormatInfo Class</a>.
+  ///     </description>
+  ///   </item>
+  /// </list>
+  /// </para>
+  /// <para>
+  /// The <see cref="LoggingEvent.TimeStamp"/> is in the local time zone and is rendered in that zone.
+  /// To output the time in Universal time see <see cref="UtcDatePatternConverter"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal class DatePatternConverter : PatternLayoutConverter, IOptionHandler
+  {
+    /// <summary>
+    /// The <see cref="IDateFormatter"/> used to render the date to a string
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="IDateFormatter"/> used to render the date to a string
+    /// </para>
+    /// </remarks>
+    protected IDateFormatter m_dateFormatter;
 
-		/// <summary>
-		/// Initialize the converter pattern based on the <see cref="PatternConverter.Option"/> property.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			string dateFormatStr = Option;
-			if (dateFormatStr == null)
-			{
-				dateFormatStr = AbsoluteTimeDateFormatter.Iso8601TimeDateFormat;
-			}
+    #region Implementation of IOptionHandler
 
-			if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.Iso8601TimeDateFormat))
-			{
-				m_dateFormatter = new Iso8601DateFormatter();
-			}
-			else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.AbsoluteTimeDateFormat))
-			{
-				m_dateFormatter = new AbsoluteTimeDateFormatter();
-			}
-			else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.DateAndTimeDateFormat))
-			{
-				m_dateFormatter = new DateTimeDateFormatter();
-			}
-			else
-			{
-				try 
-				{
-					m_dateFormatter = new SimpleDateFormatter(dateFormatStr);
-				}
-				catch (Exception e) 
-				{
-					LogLog.Error(declaringType, "Could not instantiate SimpleDateFormatter with ["+dateFormatStr+"]", e);
-					m_dateFormatter = new Iso8601DateFormatter();
-				}	
-			}
-		}
+    /// <summary>
+    /// Initialize the converter pattern based on the <see cref="PatternConverter.Option"/> property.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      string dateFormatStr = Option;
+      if (dateFormatStr == null)
+      {
+        dateFormatStr = AbsoluteTimeDateFormatter.Iso8601TimeDateFormat;
+      }
 
-		#endregion
+      if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.Iso8601TimeDateFormat))
+      {
+        m_dateFormatter = new Iso8601DateFormatter();
+      }
+      else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.AbsoluteTimeDateFormat))
+      {
+        m_dateFormatter = new AbsoluteTimeDateFormatter();
+      }
+      else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.DateAndTimeDateFormat))
+      {
+        m_dateFormatter = new DateTimeDateFormatter();
+      }
+      else
+      {
+        try
+        {
+          m_dateFormatter = new SimpleDateFormatter(dateFormatStr);
+        }
+        catch (Exception e)
+        {
+          LogLog.Error(declaringType, "Could not instantiate SimpleDateFormatter with [" + dateFormatStr + "]", e);
+          m_dateFormatter = new Iso8601DateFormatter();
+        }
+      }
+    }
 
-		/// <summary>
-		/// Convert the pattern into the rendered message
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Pass the <see cref="LoggingEvent.TimeStamp"/> to the <see cref="IDateFormatter"/>
-		/// for it to render it to the writer.
-		/// </para>
-		/// <para>
-		/// The <see cref="LoggingEvent.TimeStamp"/> passed is in the local time zone.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			try 
-			{
-				m_dateFormatter.FormatDate(loggingEvent.TimeStamp, writer);
-			}
-			catch (Exception ex) 
-			{
-				LogLog.Error(declaringType, "Error occurred while converting date.", ex);
-			}
-		}
+    #endregion
 
-	    #region Private Static Fields
+    /// <summary>
+    /// Convert the pattern into the rendered message
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Pass the <see cref="LoggingEvent.TimeStamp"/> to the <see cref="IDateFormatter"/>
+    /// for it to render it to the writer.
+    /// </para>
+    /// <para>
+    /// The <see cref="LoggingEvent.TimeStamp"/> passed is in the local time zone.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      try
+      {
+        m_dateFormatter.FormatDate(loggingEvent.TimeStamp, writer);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting date.", ex);
+      }
+    }
 
-	    /// <summary>
-	    /// The fully qualified type of the DatePatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(DatePatternConverter);
+    #region Private Static Fields
 
-	    #endregion Private Static Fields
-	}
+    /// <summary>
+    /// The fully qualified type of the DatePatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(DatePatternConverter);
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs b/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs
index 0091304..b2262d4 100644
--- a/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/ExceptionPatternConverter.cs
@@ -23,115 +23,115 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the exception text to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// If an exception object is stored in the logging event
-	/// it will be rendered into the pattern output with a
-	/// trailing newline.
-	/// </para>
-	/// <para>
-	/// If there is no exception then nothing will be output
-	/// and no trailing newline will be appended.
-	/// It is typical to put a newline before the exception
-	/// and to have the exception as the last data in the pattern.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class ExceptionPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		public ExceptionPatternConverter()
-		{
-			// This converter handles the exception
-			IgnoresException = false;
-		}
+  /// <summary>
+  /// Write the exception text to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// If an exception object is stored in the logging event
+  /// it will be rendered into the pattern output with a
+  /// trailing newline.
+  /// </para>
+  /// <para>
+  /// If there is no exception then nothing will be output
+  /// and no trailing newline will be appended.
+  /// It is typical to put a newline before the exception
+  /// and to have the exception as the last data in the pattern.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class ExceptionPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    public ExceptionPatternConverter()
+    {
+      // This converter handles the exception
+      IgnoresException = false;
+    }
 
-		/// <summary>
-		/// Write the exception text to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// If an exception object is stored in the logging event
-		/// it will be rendered into the pattern output with a
-		/// trailing newline.
-		/// </para>
-		/// <para>
-		/// If there is no exception or the exception property specified
-		/// by the Option value does not exist then nothing will be output
-		/// and no trailing newline will be appended.
-		/// It is typical to put a newline before the exception
-		/// and to have the exception as the last data in the pattern.
-		/// </para>
-		/// <para>
-		/// Recognized values for the Option parameter are:
-		/// </para>
-		/// <list type="bullet">
-		///		<item>
-		///			<description>Message</description>
-		///		</item>
-		///		<item>
-		///			<description>Source</description>
-		///		</item>
-		///		<item>
-		///			<description>StackTrace</description>
-		///		</item>
-		///		<item>
-		///			<description>TargetSite</description>
-		///		</item>
-		///		<item>
-		///			<description>HelpLink</description>
-		///		</item>		
-		/// </list>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			if (loggingEvent.ExceptionObject != null && Option != null && Option.Length > 0)
-			{
-				switch (Option.ToLower())
-				{
-					case "message":
-						WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.Message);
-						break;
-#if !NETCF						
-					case "source":
-						WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.Source);
-						break;
-					case "stacktrace":
-						WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.StackTrace);
-						break;
+    /// <summary>
+    /// Write the exception text to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// If an exception object is stored in the logging event
+    /// it will be rendered into the pattern output with a
+    /// trailing newline.
+    /// </para>
+    /// <para>
+    /// If there is no exception or the exception property specified
+    /// by the Option value does not exist then nothing will be output
+    /// and no trailing newline will be appended.
+    /// It is typical to put a newline before the exception
+    /// and to have the exception as the last data in the pattern.
+    /// </para>
+    /// <para>
+    /// Recognized values for the Option parameter are:
+    /// </para>
+    /// <list type="bullet">
+    ///    <item>
+    ///      <description>Message</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>Source</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>StackTrace</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>TargetSite</description>
+    ///    </item>
+    ///    <item>
+    ///      <description>HelpLink</description>
+    ///    </item>    
+    /// </list>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (loggingEvent.ExceptionObject != null && Option != null && Option.Length > 0)
+      {
+        switch (Option.ToLower())
+        {
+          case "message":
+            WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.Message);
+            break;
+#if !NETCF            
+          case "source":
+            WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.Source);
+            break;
+          case "stacktrace":
+            WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.StackTrace);
+            break;
 #if !NETSTANDARD
-					case "targetsite":
-						WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.TargetSite);
-						break;
+          case "targetsite":
+            WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.TargetSite);
+            break;
 #endif
-					case "helplink":
-						WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.HelpLink);
-						break;
-#endif						
-					default:
-						// do not output SystemInfo.NotAvailableText
-						break;
-				}
-			}
-			else
-			{
-				string exceptionString = loggingEvent.GetExceptionString();
-				if (exceptionString != null && exceptionString.Length > 0) 
-				{
-					writer.WriteLine(exceptionString);
-				}
-				else
-				{
-					// do not output SystemInfo.NotAvailableText
-				}
-			}
-		}
-	}
+          case "helplink":
+            WriteObject(writer, loggingEvent.Repository, loggingEvent.ExceptionObject.HelpLink);
+            break;
+#endif            
+          default:
+            // do not output SystemInfo.NotAvailableText
+            break;
+        }
+      }
+      else
+      {
+        string exceptionString = loggingEvent.GetExceptionString();
+        if (exceptionString != null && exceptionString.Length > 0)
+        {
+          writer.WriteLine(exceptionString);
+        }
+        else
+        {
+          // do not output SystemInfo.NotAvailableText
+        }
+      }
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs b/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs
index d555c61..a1d818d 100644
--- a/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/FileLocationPatternConverter.cs
@@ -25,32 +25,32 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Writes the caller location file name to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the value of the <see cref="LocationInfo.FileName"/> for
-	/// the event to the output writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class FileLocationPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the caller location file name to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the value of the <see cref="LocationInfo.FileName"/> for
-		/// the <paramref name="loggingEvent"/> to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write(loggingEvent.LocationInformation.FileName);
-		}
-	}
+  /// <summary>
+  /// Writes the caller location file name to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the value of the <see cref="LocationInfo.FileName"/> for
+  /// the event to the output writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class FileLocationPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the caller location file name to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the value of the <see cref="LocationInfo.FileName"/> for
+    /// the <paramref name="loggingEvent"/> to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.LocationInformation.FileName);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs b/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs
index ac5dab6..1da7519 100644
--- a/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/FullLocationPatternConverter.cs
@@ -25,30 +25,30 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the caller location info to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the <see cref="LocationInfo.FullInfo"/> to the output writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class FullLocationPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the caller location info to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="LocationInfo.FullInfo"/> to the output writer.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write( loggingEvent.LocationInformation.FullInfo );
-		}
-	}
+  /// <summary>
+  /// Write the caller location info to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the <see cref="LocationInfo.FullInfo"/> to the output writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class FullLocationPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the caller location info to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="LocationInfo.FullInfo"/> to the output writer.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.LocationInformation.FullInfo);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/IdentityPatternConverter.cs b/src/log4net/Layout/Pattern/IdentityPatternConverter.cs
index 0ef245c..62db1c3 100644
--- a/src/log4net/Layout/Pattern/IdentityPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/IdentityPatternConverter.cs
@@ -25,34 +25,34 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Writes the event identity to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the value of the <see cref="LoggingEvent.Identity"/> to
-	/// the output writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Daniel Cazzulino</author>
-	/// <author>Nicko Cadell</author>
-	internal sealed class IdentityPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Writes the event identity to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the value of the <paramref name="loggingEvent"/> 
-		/// <see cref="LoggingEvent.Identity"/> to
-		/// the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write(loggingEvent.Identity);
-		}
-	}
+  /// <summary>
+  /// Writes the event identity to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the value of the <see cref="LoggingEvent.Identity"/> to
+  /// the output writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Daniel Cazzulino</author>
+  /// <author>Nicko Cadell</author>
+  internal sealed class IdentityPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Writes the event identity to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the value of the <paramref name="loggingEvent"/> 
+    /// <see cref="LoggingEvent.Identity"/> to
+    /// the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.Identity);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/LevelPatternConverter.cs b/src/log4net/Layout/Pattern/LevelPatternConverter.cs
index 21af92b..2e75693 100644
--- a/src/log4net/Layout/Pattern/LevelPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/LevelPatternConverter.cs
@@ -25,32 +25,32 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the event level to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the display name of the event <see cref="LoggingEvent.Level"/>
-	/// to the writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class LevelPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the event level to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="Level.DisplayName"/> of the <paramref name="loggingEvent"/> <see cref="LoggingEvent.Level"/>
-		/// to the <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write( loggingEvent.Level.DisplayName );
-		}
-	}
+  /// <summary>
+  /// Write the event level to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the display name of the event <see cref="LoggingEvent.Level"/>
+  /// to the writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class LevelPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the event level to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="Level.DisplayName"/> of the <paramref name="loggingEvent"/> <see cref="LoggingEvent.Level"/>
+    /// to the <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.Level.DisplayName);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs b/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs
index 07c91e8..d1f3e3a 100644
--- a/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/LineLocationPatternConverter.cs
@@ -25,32 +25,32 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the caller location line number to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the value of the <see cref="LocationInfo.LineNumber"/> for
-	/// the event to the output writer.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class LineLocationPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the caller location line number to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the value of the <see cref="LocationInfo.LineNumber"/> for
-		/// the <paramref name="loggingEvent"/> to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write(loggingEvent.LocationInformation.LineNumber);
-		}
-	}
+  /// <summary>
+  /// Write the caller location line number to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the value of the <see cref="LocationInfo.LineNumber"/> for
+  /// the event to the output writer.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class LineLocationPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the caller location line number to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the value of the <see cref="LocationInfo.LineNumber"/> for
+    /// the <paramref name="loggingEvent"/> to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.LocationInformation.LineNumber);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/LoggerPatternConverter.cs b/src/log4net/Layout/Pattern/LoggerPatternConverter.cs
index 471b4aa..fe5845a 100644
--- a/src/log4net/Layout/Pattern/LoggerPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/LoggerPatternConverter.cs
@@ -25,30 +25,30 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter for logger name
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs the <see cref="LoggingEvent.LoggerName"/> of the event.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class LoggerPatternConverter : NamedPatternConverter 
-	{
-		/// <summary>
-		/// Gets the fully qualified name of the logger
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <returns>The fully qualified logger name</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the <see cref="LoggingEvent.LoggerName"/> of the <paramref name="loggingEvent"/>.
-		/// </para>
-		/// </remarks>
-		protected override string GetFullyQualifiedName(LoggingEvent loggingEvent) 
-		{
-			return loggingEvent.LoggerName;
-		}
-	}
+  /// <summary>
+  /// Converter for logger name
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs the <see cref="LoggingEvent.LoggerName"/> of the event.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class LoggerPatternConverter : NamedPatternConverter
+  {
+    /// <summary>
+    /// Gets the fully qualified name of the logger
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <returns>The fully qualified logger name</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the <see cref="LoggingEvent.LoggerName"/> of the <paramref name="loggingEvent"/>.
+    /// </para>
+    /// </remarks>
+    protected override string GetFullyQualifiedName(LoggingEvent loggingEvent)
+    {
+      return loggingEvent.LoggerName;
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/MessagePatternConverter.cs b/src/log4net/Layout/Pattern/MessagePatternConverter.cs
index cf0f5af..d9cf372 100644
--- a/src/log4net/Layout/Pattern/MessagePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/MessagePatternConverter.cs
@@ -25,32 +25,32 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Writes the event message to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Uses the <see cref="LoggingEvent.WriteRenderedMessage"/> method
-	/// to write out the event message.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class MessagePatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Writes the event message to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="LoggingEvent.WriteRenderedMessage"/> method
-		/// to write out the event message.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			loggingEvent.WriteRenderedMessage(writer);
-		}
-	}
+  /// <summary>
+  /// Writes the event message to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Uses the <see cref="LoggingEvent.WriteRenderedMessage"/> method
+  /// to write out the event message.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class MessagePatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Writes the event message to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="LoggingEvent.WriteRenderedMessage"/> method
+    /// to write out the event message.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      loggingEvent.WriteRenderedMessage(writer);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs b/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs
index 90fa755..3c935d5 100644
--- a/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/MethodLocationPatternConverter.cs
@@ -25,32 +25,32 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the method name to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the caller location <see cref="LocationInfo.MethodName"/> to
-	/// the output.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class MethodLocationPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the method name to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the caller location <see cref="LocationInfo.MethodName"/> to
-		/// the output.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write(loggingEvent.LocationInformation.MethodName);
-		}
-	}
+  /// <summary>
+  /// Write the method name to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the caller location <see cref="LocationInfo.MethodName"/> to
+  /// the output.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class MethodLocationPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the method name to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the caller location <see cref="LocationInfo.MethodName"/> to
+    /// the output.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.LocationInformation.MethodName);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/NamedPatternConverter.cs b/src/log4net/Layout/Pattern/NamedPatternConverter.cs
index d94a9c8..8512a9a 100644
--- a/src/log4net/Layout/Pattern/NamedPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/NamedPatternConverter.cs
@@ -27,145 +27,145 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter to output and truncate <c>'.'</c> separated strings
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This abstract class supports truncating a <c>'.'</c> separated string
-	/// to show a specified number of elements from the right hand side.
-	/// This is used to truncate class names that are fully qualified.
-	/// </para>
-	/// <para>
-	/// Subclasses should override the <see cref="GetFullyQualifiedName"/> method to
-	/// return the fully qualified string.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public abstract class NamedPatternConverter : PatternLayoutConverter, IOptionHandler
-	{
-		private int m_precision = 0;
+  /// <summary>
+  /// Converter to output and truncate <c>'.'</c> separated strings
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This abstract class supports truncating a <c>'.'</c> separated string
+  /// to show a specified number of elements from the right hand side.
+  /// This is used to truncate class names that are fully qualified.
+  /// </para>
+  /// <para>
+  /// Subclasses should override the <see cref="GetFullyQualifiedName"/> method to
+  /// return the fully qualified string.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public abstract class NamedPatternConverter : PatternLayoutConverter, IOptionHandler
+  {
+    private int m_precision = 0;
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the converter 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			m_precision = 0;
+    /// <summary>
+    /// Initialize the converter 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      m_precision = 0;
 
-			if (Option != null) 
-			{
-				string optStr = Option.Trim();
-				if (optStr.Length > 0)
-				{
-					int precisionVal;
-					if (SystemInfo.TryParse(optStr, out precisionVal))
-					{
-						if (precisionVal <= 0) 
-						{
-							LogLog.Error(declaringType, "NamedPatternConverter: Precision option (" + optStr + ") isn't a positive integer.");
-						}
-						else
-						{
-							m_precision = precisionVal;
-						}
-					} 
-					else
-					{
-						LogLog.Error(declaringType, "NamedPatternConverter: Precision option \"" + optStr + "\" not a decimal integer.");
-					}
-				}
-			}
-		}
+      if (Option != null)
+      {
+        string optStr = Option.Trim();
+        if (optStr.Length > 0)
+        {
+          int precisionVal;
+          if (SystemInfo.TryParse(optStr, out precisionVal))
+          {
+            if (precisionVal <= 0)
+            {
+              LogLog.Error(declaringType, "NamedPatternConverter: Precision option (" + optStr + ") isn't a positive integer.");
+            }
+            else
+            {
+              m_precision = precisionVal;
+            }
+          }
+          else
+          {
+            LogLog.Error(declaringType, "NamedPatternConverter: Precision option \"" + optStr + "\" not a decimal integer.");
+          }
+        }
+      }
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Get the fully qualified string data
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <returns>the fully qualified name</returns>
-		/// <remarks>
-		/// <para>
-		/// Overridden by subclasses to get the fully qualified name before the
-		/// precision is applied to it.
-		/// </para>
-		/// <para>
-		/// Return the fully qualified <c>'.'</c> (dot/period) separated string.
-		/// </para>
-		/// </remarks>
-		protected abstract string GetFullyQualifiedName(LoggingEvent loggingEvent);
-	
-		/// <summary>
-		/// Convert the pattern to the rendered message
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// Render the <see cref="GetFullyQualifiedName"/> to the precision
-		/// specified by the <see cref="PatternConverter.Option"/> property.
-		/// </remarks>
-		protected sealed override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			string name = GetFullyQualifiedName(loggingEvent);
-			if (m_precision <= 0 || name == null || name.Length < 2)
-			{
-				writer.Write(name);
-			}
-			else 
-			{
-				int len = name.Length;
-                string trailingDot = string.Empty;
-                if (name.EndsWith(DOT))
-                {
-                    trailingDot = DOT;
-                    name = name.Substring(0, len - 1);
-                    len--;
-                }
+    /// <summary>
+    /// Get the fully qualified string data
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <returns>the fully qualified name</returns>
+    /// <remarks>
+    /// <para>
+    /// Overridden by subclasses to get the fully qualified name before the
+    /// precision is applied to it.
+    /// </para>
+    /// <para>
+    /// Return the fully qualified <c>'.'</c> (dot/period) separated string.
+    /// </para>
+    /// </remarks>
+    protected abstract string GetFullyQualifiedName(LoggingEvent loggingEvent);
 
-                int end = name.LastIndexOf(DOT);
-				for(int i = 1; end > 0 && i < m_precision; i++) 
-				{
-                    end = name.LastIndexOf('.', end - 1);
-                }
-                if (end == -1)
-                {
-                    writer.Write(name + trailingDot);
-                }
-                else
-                {
-                    writer.Write(name.Substring(end + 1, len - end - 1) + trailingDot);
-                }
-			}	  
-		}
+    /// <summary>
+    /// Convert the pattern to the rendered message
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// Render the <see cref="GetFullyQualifiedName"/> to the precision
+    /// specified by the <see cref="PatternConverter.Option"/> property.
+    /// </remarks>
+    protected sealed override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      string name = GetFullyQualifiedName(loggingEvent);
+      if (m_precision <= 0 || name == null || name.Length < 2)
+      {
+        writer.Write(name);
+      }
+      else
+      {
+        int len = name.Length;
+        string trailingDot = string.Empty;
+        if (name.EndsWith(DOT))
+        {
+          trailingDot = DOT;
+          name = name.Substring(0, len - 1);
+          len--;
+        }
 
-	    #region Private Static Fields
+        int end = name.LastIndexOf(DOT);
+        for (int i = 1; end > 0 && i < m_precision; i++)
+        {
+          end = name.LastIndexOf('.', end - 1);
+        }
+        if (end == -1)
+        {
+          writer.Write(name + trailingDot);
+        }
+        else
+        {
+          writer.Write(name.Substring(end + 1, len - end - 1) + trailingDot);
+        }
+      }
+    }
 
-	    /// <summary>
-	    /// The fully qualified type of the NamedPatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(NamedPatternConverter);
+    #region Private Static Fields
 
-        private const string DOT = ".";
-	    #endregion Private Static Fields
-	}
+    /// <summary>
+    /// The fully qualified type of the NamedPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(NamedPatternConverter);
+
+    private const string DOT = ".";
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Layout/Pattern/NdcPatternConverter.cs b/src/log4net/Layout/Pattern/NdcPatternConverter.cs
index 5721681..a64dbb9 100644
--- a/src/log4net/Layout/Pattern/NdcPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/NdcPatternConverter.cs
@@ -25,38 +25,38 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter to include event NDC
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs the value of the event property named <c>NDC</c>.
-	/// </para>
-	/// <para>
-	/// The <see cref="PropertyPatternConverter"/> should be used instead.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class NdcPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the event NDC to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// As the thread context stacks are now stored in named event properties
-		/// this converter simply looks up the value of the <c>NDC</c> property.
-		/// </para>
-		/// <para>
-		/// The <see cref="PropertyPatternConverter"/> should be used instead.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			// Write the value for the specified key
-			WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty("NDC"));
-		}
-	}
+  /// <summary>
+  /// Converter to include event NDC
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs the value of the event property named <c>NDC</c>.
+  /// </para>
+  /// <para>
+  /// The <see cref="PropertyPatternConverter"/> should be used instead.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class NdcPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the event NDC to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// As the thread context stacks are now stored in named event properties
+    /// this converter simply looks up the value of the <c>NDC</c> property.
+    /// </para>
+    /// <para>
+    /// The <see cref="PropertyPatternConverter"/> should be used instead.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      // Write the value for the specified key
+      WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty("NDC"));
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/PatternLayoutConverter.cs b/src/log4net/Layout/Pattern/PatternLayoutConverter.cs
index b805b39..2337149 100644
--- a/src/log4net/Layout/Pattern/PatternLayoutConverter.cs
+++ b/src/log4net/Layout/Pattern/PatternLayoutConverter.cs
@@ -28,96 +28,96 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Abstract class that provides the formatting functionality that 
-	/// derived classes need.
-	/// </summary>
-	/// <remarks>
-	/// Conversion specifiers in a conversion patterns are parsed to
-	/// individual PatternConverters. Each of which is responsible for
-	/// converting a logging event in a converter specific manner.
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public abstract class PatternLayoutConverter : PatternConverter
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Abstract class that provides the formatting functionality that 
+  /// derived classes need.
+  /// </summary>
+  /// <remarks>
+  /// Conversion specifiers in a conversion patterns are parsed to
+  /// individual PatternConverters. Each of which is responsible for
+  /// converting a logging event in a converter specific manner.
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public abstract class PatternLayoutConverter : PatternConverter
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="PatternLayoutConverter" /> class.
-		/// </summary>
-		protected PatternLayoutConverter() 
-		{  
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="PatternLayoutConverter" /> class.
+    /// </summary>
+    protected PatternLayoutConverter()
+    {
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Properties
+    #region Public Properties
 
-		/// <summary>
-		/// Flag indicating if this converter handles the logging event exception
-		/// </summary>
-		/// <value><c>false</c> if this converter handles the logging event exception</value>
-		/// <remarks>
-		/// <para>
-		/// If this converter handles the exception object contained within
-		/// <see cref="LoggingEvent"/>, then this property should be set to
-		/// <c>false</c>. Otherwise, if the layout ignores the exception
-		/// object, then the property should be set to <c>true</c>.
-		/// </para>
-		/// <para>
-		/// Set this value to override a this default setting. The default
-		/// value is <c>true</c>, this converter does not handle the exception.
-		/// </para>
-		/// </remarks>
-		public virtual bool IgnoresException 
-		{ 
-			get { return m_ignoresException; }
-			set { m_ignoresException = value; }
-		}
+    /// <summary>
+    /// Flag indicating if this converter handles the logging event exception
+    /// </summary>
+    /// <value><c>false</c> if this converter handles the logging event exception</value>
+    /// <remarks>
+    /// <para>
+    /// If this converter handles the exception object contained within
+    /// <see cref="LoggingEvent"/>, then this property should be set to
+    /// <c>false</c>. Otherwise, if the layout ignores the exception
+    /// object, then the property should be set to <c>true</c>.
+    /// </para>
+    /// <para>
+    /// Set this value to override a this default setting. The default
+    /// value is <c>true</c>, this converter does not handle the exception.
+    /// </para>
+    /// </remarks>
+    public virtual bool IgnoresException
+    {
+      get { return m_ignoresException; }
+      set { m_ignoresException = value; }
+    }
 
-		#endregion Public Properties
+    #endregion Public Properties
 
-		#region Protected Abstract Methods
+    #region Protected Abstract Methods
 
-		/// <summary>
-		/// Derived pattern converters must override this method in order to
-		/// convert conversion specifiers in the correct way.
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
-		protected abstract void Convert(TextWriter writer, LoggingEvent loggingEvent);
+    /// <summary>
+    /// Derived pattern converters must override this method in order to
+    /// convert conversion specifiers in the correct way.
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
+    protected abstract void Convert(TextWriter writer, LoggingEvent loggingEvent);
 
-		#endregion Protected Abstract Methods
+    #endregion Protected Abstract Methods
 
-		#region Protected Methods
+    #region Protected Methods
 
-		/// <summary>
-		/// Derived pattern converters must override this method in order to
-		/// convert conversion specifiers in the correct way.
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">The state object on which the pattern converter should be executed.</param>
-		protected override void Convert(TextWriter writer, object state)
-		{
-			LoggingEvent loggingEvent = state as LoggingEvent;
-			if (loggingEvent != null)
-			{
-				Convert(writer, loggingEvent);
-			}
-			else
-			{
-				throw new ArgumentException("state must be of type ["+typeof(LoggingEvent).FullName+"]", "state");
-			}
-		}
+    /// <summary>
+    /// Derived pattern converters must override this method in order to
+    /// convert conversion specifiers in the correct way.
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">The state object on which the pattern converter should be executed.</param>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      LoggingEvent loggingEvent = state as LoggingEvent;
+      if (loggingEvent != null)
+      {
+        Convert(writer, loggingEvent);
+      }
+      else
+      {
+        throw new ArgumentException("state must be of type [" + typeof(LoggingEvent).FullName + "]", "state");
+      }
+    }
 
-		#endregion Protected Methods
+    #endregion Protected Methods
 
-		/// <summary>
-		/// Flag indicating if this converter handles exceptions
-		/// </summary>
-		/// <remarks>
-		/// <c>false</c> if this converter handles exceptions
-		/// </remarks>
-		private bool m_ignoresException = true;
-	}
+    /// <summary>
+    /// Flag indicating if this converter handles exceptions
+    /// </summary>
+    /// <remarks>
+    /// <c>false</c> if this converter handles exceptions
+    /// </remarks>
+    private bool m_ignoresException = true;
+  }
 }
diff --git a/src/log4net/Layout/Pattern/PropertyPatternConverter.cs b/src/log4net/Layout/Pattern/PropertyPatternConverter.cs
index 44a096b..bb66c96 100644
--- a/src/log4net/Layout/Pattern/PropertyPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/PropertyPatternConverter.cs
@@ -27,51 +27,51 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Property pattern converter
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes out the value of a named property. The property name
-	/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-	/// property.
-	/// </para>
-	/// <para>
-	/// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
-	/// then all the properties are written as key value pairs.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class PropertyPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the property value to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the value of a named property. The property name
-		/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property.
-		/// </para>
-		/// <para>
-		/// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
-		/// then all the properties are written as key value pairs.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			if (Option != null)
-			{
-				// Write the value for the specified key
-				WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty(Option));
-			}
-			else
-			{
-				// Write all the key value pairs
-				WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
-			}
-		}
-	}
+  /// <summary>
+  /// Property pattern converter
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes out the value of a named property. The property name
+  /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+  /// property.
+  /// </para>
+  /// <para>
+  /// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+  /// then all the properties are written as key value pairs.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class PropertyPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the property value to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
+    /// </para>
+    /// <para>
+    /// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+    /// then all the properties are written as key value pairs.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (Option != null)
+      {
+        // Write the value for the specified key
+        WriteObject(writer, loggingEvent.Repository, loggingEvent.LookupProperty(Option));
+      }
+      else
+      {
+        // Write all the key value pairs
+        WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
+      }
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs b/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs
index 01b9ae2..29f7982 100644
--- a/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/RelativeTimePatternConverter.cs
@@ -25,46 +25,46 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter to output the relative time of the event
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Converter to output the time of the event relative to the start of the program.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class RelativeTimePatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the relative time to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the relative time of the event in milliseconds.
-		/// That is the number of milliseconds between the event <see cref="LoggingEvent.TimeStamp"/>
-		/// and the <see cref="LoggingEvent.StartTime"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write( TimeDifferenceInMillis(LoggingEvent.StartTimeUtc, loggingEvent.TimeStampUtc).ToString(System.Globalization.NumberFormatInfo.InvariantInfo) );
-		}
+  /// <summary>
+  /// Converter to output the relative time of the event
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Converter to output the time of the event relative to the start of the program.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class RelativeTimePatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the relative time to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the relative time of the event in milliseconds.
+    /// That is the number of milliseconds between the event <see cref="LoggingEvent.TimeStamp"/>
+    /// and the <see cref="LoggingEvent.StartTime"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(TimeDifferenceInMillis(LoggingEvent.StartTimeUtc, loggingEvent.TimeStampUtc).ToString(System.Globalization.NumberFormatInfo.InvariantInfo));
+    }
 
-		/// <summary>
-		/// Helper method to get the time difference between two DateTime objects
-		/// </summary>
-		/// <param name="start">start time (in the current local time zone)</param>
-		/// <param name="end">end time (in the current local time zone)</param>
-		/// <returns>the time difference in milliseconds</returns>
-		private static long TimeDifferenceInMillis(DateTime start, DateTime end)
-		{
-			// We must convert all times to UTC before performing any mathematical
-			// operations on them. This allows use to take into account discontinuities
-			// caused by daylight savings time transitions.
-			return (long)(end.ToUniversalTime() - start.ToUniversalTime()).TotalMilliseconds;
-		}
-	}
+    /// <summary>
+    /// Helper method to get the time difference between two DateTime objects
+    /// </summary>
+    /// <param name="start">start time (in the current local time zone)</param>
+    /// <param name="end">end time (in the current local time zone)</param>
+    /// <returns>the time difference in milliseconds</returns>
+    private static long TimeDifferenceInMillis(DateTime start, DateTime end)
+    {
+      // We must convert all times to UTC before performing any mathematical
+      // operations on them. This allows use to take into account discontinuities
+      // caused by daylight savings time transitions.
+      return (long)(end.ToUniversalTime() - start.ToUniversalTime()).TotalMilliseconds;
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs b/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs
index 9e020cb..a97a1b5 100644
--- a/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/StackTraceDetailPatternConverter.cs
@@ -28,63 +28,63 @@
 
 namespace log4net.Layout.Pattern
 {
-    /// <summary>
-    /// Write the caller stack frames to the output
-    /// </summary>
-    /// <remarks>
-    /// <para>
-    /// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer, using format:
-    /// type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...)
-    /// </para>
-    /// </remarks>
-    /// <author>Adam Davies</author>
-    internal class StackTraceDetailPatternConverter : StackTracePatternConverter
+  /// <summary>
+  /// Write the caller stack frames to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer, using format:
+  /// type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...)
+  /// </para>
+  /// </remarks>
+  /// <author>Adam Davies</author>
+  internal class StackTraceDetailPatternConverter : StackTracePatternConverter
+  {
+    internal override string GetMethodInformation(MethodItem method)
     {
-        internal override string GetMethodInformation(MethodItem method)
+      string returnValue = "";
+
+      try
+      {
+        string param = "";
+        string[] names = method.Parameters;
+        StringBuilder sb = new StringBuilder();
+        if (names != null && names.GetUpperBound(0) > 0)
         {
-            string returnValue="";
-
-            try
-            {
-                string param = "";
-                string[] names = method.Parameters;
-                StringBuilder sb = new StringBuilder();
-                if (names != null && names.GetUpperBound(0) > 0)
-                {
-                    for (int i = 0; i <= names.GetUpperBound(0); i++)
-                    {
-                        sb.AppendFormat("{0}, ", names[i]);
-                    }
-                }
-
-                if (sb.Length > 0)
-                {
-                    sb.Remove(sb.Length - 2, 2);
-                    param = sb.ToString();
-                }
-
-                returnValue=base.GetMethodInformation(method) + "(" + param + ")";
-            }
-            catch (Exception ex)
-            {
-                LogLog.Error(declaringType, "An exception ocurred while retreiving method information.", ex);
-            }
-
-            return returnValue;
+          for (int i = 0; i <= names.GetUpperBound(0); i++)
+          {
+            sb.AppendFormat("{0}, ", names[i]);
+          }
         }
 
-        #region Private Static Fields
+        if (sb.Length > 0)
+        {
+          sb.Remove(sb.Length - 2, 2);
+          param = sb.ToString();
+        }
 
-        /// <summary>
-        /// The fully qualified type of the StackTraceDetailPatternConverter class.
-        /// </summary>
-        /// <remarks>
-        /// Used by the internal logger to record the Type of the
-        /// log message.
-        /// </remarks>
-        private static readonly Type declaringType = typeof(StackTracePatternConverter);
+        returnValue = base.GetMethodInformation(method) + "(" + param + ")";
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "An exception ocurred while retreiving method information.", ex);
+      }
 
-        #endregion Private Static Fields
+      return returnValue;
     }
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the StackTraceDetailPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(StackTracePatternConverter);
+
+    #endregion Private Static Fields
+  }
 }
 #endif // !NETCF && NET_2_0
\ No newline at end of file
diff --git a/src/log4net/Layout/Pattern/StackTracePatternConverter.cs b/src/log4net/Layout/Pattern/StackTracePatternConverter.cs
index 7773868..df3ccb5 100644
--- a/src/log4net/Layout/Pattern/StackTracePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/StackTracePatternConverter.cs
@@ -25,125 +25,125 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the caller stack frames to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer, using format:
-	/// type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1
-	/// </para>
-	/// </remarks>
-	/// <author>Michael Cromwell</author>
-	internal class StackTracePatternConverter : PatternLayoutConverter, IOptionHandler
-	{
-		private int m_stackFrameLevel = 1;
-		
-		/// <summary>
-		/// Initialize the converter
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			if (Option == null)
-				return;
-			
-			string optStr = Option.Trim();
-			if (optStr.Length != 0)
-			{
-				int stackLevelVal;
-				if (SystemInfo.TryParse(optStr, out stackLevelVal))
-				{
-					if (stackLevelVal <= 0) 
-					{
-						LogLog.Error(declaringType, "StackTracePatternConverter: StackeFrameLevel option (" + optStr + ") isn't a positive integer.");
-					}
-					else
-					{
-						m_stackFrameLevel = stackLevelVal;
-					}
-				} 
-				else
-				{
-					LogLog.Error(declaringType, "StackTracePatternConverter: StackFrameLevel option \"" + optStr + "\" not a decimal integer.");
-				}
-			}
-		}
-		
-		/// <summary>
-		/// Write the strack frames to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			StackFrameItem[] stackframes = loggingEvent.LocationInformation.StackFrames;
-			if ((stackframes == null) || (stackframes.Length <= 0))
-			{
-				LogLog.Error(declaringType, "loggingEvent.LocationInformation.StackFrames was null or empty.");
-				return;
-			}
-			
-			int stackFrameIndex = m_stackFrameLevel - 1;
-			while (stackFrameIndex >= 0)
-			{
-				if (stackFrameIndex >= stackframes.Length)
-				{
-					stackFrameIndex--;
-					continue;
-				}
-				
-				StackFrameItem stackFrame = stackframes[stackFrameIndex];
-                writer.Write("{0}.{1}", stackFrame.ClassName, GetMethodInformation(stackFrame.Method));
-				if (stackFrameIndex > 0)
-				{
-                    // TODO: make this user settable?
-					writer.Write(" > ");
-				}
-				stackFrameIndex--;
-			}
-		}
+  /// <summary>
+  /// Write the caller stack frames to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer, using format:
+  /// type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1
+  /// </para>
+  /// </remarks>
+  /// <author>Michael Cromwell</author>
+  internal class StackTracePatternConverter : PatternLayoutConverter, IOptionHandler
+  {
+    private int m_stackFrameLevel = 1;
 
-                /// <summary>
-        /// Returns the Name of the method
-        /// </summary>
-        /// <param name="method"></param>
-        /// <remarks>This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter</remarks>
-        /// <returns>string</returns>
-        internal virtual string GetMethodInformation(MethodItem method)
+    /// <summary>
+    /// Initialize the converter
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      if (Option == null)
+        return;
+
+      string optStr = Option.Trim();
+      if (optStr.Length != 0)
+      {
+        int stackLevelVal;
+        if (SystemInfo.TryParse(optStr, out stackLevelVal))
         {
-            return method.Name;
+          if (stackLevelVal <= 0)
+          {
+            LogLog.Error(declaringType, "StackTracePatternConverter: StackeFrameLevel option (" + optStr + ") isn't a positive integer.");
+          }
+          else
+          {
+            m_stackFrameLevel = stackLevelVal;
+          }
         }
-		
-		#region Private Static Fields
+        else
+        {
+          LogLog.Error(declaringType, "StackTracePatternConverter: StackFrameLevel option \"" + optStr + "\" not a decimal integer.");
+        }
+      }
+    }
 
-	    /// <summary>
-	    /// The fully qualified type of the StackTracePatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(StackTracePatternConverter);
+    /// <summary>
+    /// Write the strack frames to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="LocationInfo.StackFrames"/> to the output writer.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      StackFrameItem[] stackframes = loggingEvent.LocationInformation.StackFrames;
+      if ((stackframes == null) || (stackframes.Length <= 0))
+      {
+        LogLog.Error(declaringType, "loggingEvent.LocationInformation.StackFrames was null or empty.");
+        return;
+      }
 
-	    #endregion Private Static Fields
-	}
+      int stackFrameIndex = m_stackFrameLevel - 1;
+      while (stackFrameIndex >= 0)
+      {
+        if (stackFrameIndex >= stackframes.Length)
+        {
+          stackFrameIndex--;
+          continue;
+        }
+
+        StackFrameItem stackFrame = stackframes[stackFrameIndex];
+        writer.Write("{0}.{1}", stackFrame.ClassName, GetMethodInformation(stackFrame.Method));
+        if (stackFrameIndex > 0)
+        {
+          // TODO: make this user settable?
+          writer.Write(" > ");
+        }
+        stackFrameIndex--;
+      }
+    }
+
+    /// <summary>
+    /// Returns the Name of the method
+    /// </summary>
+    /// <param name="method"></param>
+    /// <remarks>This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter</remarks>
+    /// <returns>string</returns>
+    internal virtual string GetMethodInformation(MethodItem method)
+    {
+      return method.Name;
+    }
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the StackTracePatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(StackTracePatternConverter);
+
+    #endregion Private Static Fields
+  }
 }
 #endif // !NETCF && NET_2_0
diff --git a/src/log4net/Layout/Pattern/ThreadPatternConverter.cs b/src/log4net/Layout/Pattern/ThreadPatternConverter.cs
index 122c361..4d5ce45 100644
--- a/src/log4net/Layout/Pattern/ThreadPatternConverter.cs
+++ b/src/log4net/Layout/Pattern/ThreadPatternConverter.cs
@@ -25,30 +25,30 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter to include event thread name
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the <see cref="LoggingEvent.ThreadName"/> to the output.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class ThreadPatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Write the ThreadName to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="LoggingEvent.ThreadName"/> to the <paramref name="writer" />.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write(loggingEvent.ThreadName);
-		}
-	}
+  /// <summary>
+  /// Converter to include event thread name
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the <see cref="LoggingEvent.ThreadName"/> to the output.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class ThreadPatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Write the ThreadName to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="LoggingEvent.ThreadName"/> to the <paramref name="writer" />.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.ThreadName);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs b/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs
index 8b5fce8..e65b1a5 100644
--- a/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/TypeNamePatternConverter.cs
@@ -25,40 +25,40 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Pattern converter for the class name
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Outputs the <see cref="LocationInfo.ClassName"/> of the event.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class TypeNamePatternConverter : NamedPatternConverter 
-	{
-		/// <summary>
-		/// Gets the fully qualified name of the class
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <returns>The fully qualified type name for the caller location</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the <see cref="LocationInfo.ClassName"/> of the <paramref name="loggingEvent"/>.
-		/// </para>
-		/// </remarks>
-		protected override string GetFullyQualifiedName(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				return string.Empty;
-			}
-			
-			if (loggingEvent.LocationInformation == null)
-			{
-				return string.Empty;
-			}
-			
-			return loggingEvent.LocationInformation.ClassName;
-		}
-	}
+  /// <summary>
+  /// Pattern converter for the class name
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Outputs the <see cref="LocationInfo.ClassName"/> of the event.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class TypeNamePatternConverter : NamedPatternConverter
+  {
+    /// <summary>
+    /// Gets the fully qualified name of the class
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <returns>The fully qualified type name for the caller location</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the <see cref="LocationInfo.ClassName"/> of the <paramref name="loggingEvent"/>.
+    /// </para>
+    /// </remarks>
+    protected override string GetFullyQualifiedName(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        return string.Empty;
+      }
+
+      if (loggingEvent.LocationInformation == null)
+      {
+        return string.Empty;
+      }
+
+      return loggingEvent.LocationInformation.ClassName;
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/UserNamePatternConverter.cs b/src/log4net/Layout/Pattern/UserNamePatternConverter.cs
index 1f64c0c..1b2c49a 100644
--- a/src/log4net/Layout/Pattern/UserNamePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/UserNamePatternConverter.cs
@@ -25,21 +25,21 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Converter to include event user name
-	/// </summary>
-	/// <author>Douglas de la Torre</author>
-	/// <author>Nicko Cadell</author>
-	internal sealed class UserNamePatternConverter : PatternLayoutConverter 
-	{
-		/// <summary>
-		/// Convert the pattern to the rendered message
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			writer.Write( loggingEvent.UserName );
-		}
-	}
+  /// <summary>
+  /// Converter to include event user name
+  /// </summary>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Nicko Cadell</author>
+  internal sealed class UserNamePatternConverter : PatternLayoutConverter
+  {
+    /// <summary>
+    /// Convert the pattern to the rendered message
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      writer.Write(loggingEvent.UserName);
+    }
+  }
 }
diff --git a/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs b/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs
index 95227f7..c4ba2d1 100644
--- a/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs
+++ b/src/log4net/Layout/Pattern/UtcDatePatternConverter.cs
@@ -27,65 +27,65 @@
 
 namespace log4net.Layout.Pattern
 {
-	/// <summary>
-	/// Write the TimeStamp to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
-	/// the date of a <see cref="LoggingEvent"/>.
-	/// </para>
-	/// <para>
-	/// Uses a <see cref="IDateFormatter"/> to format the <see cref="LoggingEvent.TimeStamp"/> 
-	/// in Universal time.
-	/// </para>
-	/// <para>
-	/// See the <see cref="DatePatternConverter"/> for details on the date pattern syntax.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="DatePatternConverter"/>
-	/// <author>Nicko Cadell</author>
-	internal class UtcDatePatternConverter : DatePatternConverter
-	{
-		/// <summary>
-		/// Write the TimeStamp to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <remarks>
-		/// <para>
-		/// Pass the <see cref="LoggingEvent.TimeStamp"/> to the <see cref="IDateFormatter"/>
-		/// for it to render it to the writer.
-		/// </para>
-		/// <para>
-		/// The <see cref="LoggingEvent.TimeStamp"/> passed is in the local time zone, this is converted
-		/// to Universal time before it is rendered.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="DatePatternConverter"/>
-		protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
-		{
-			try 
-			{
-				m_dateFormatter.FormatDate(loggingEvent.TimeStampUtc, writer);
-			}
-			catch (Exception ex) 
-			{
-				LogLog.Error(declaringType, "Error occurred while converting date.", ex);
-			}
-		}
+  /// <summary>
+  /// Write the TimeStamp to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
+  /// the date of a <see cref="LoggingEvent"/>.
+  /// </para>
+  /// <para>
+  /// Uses a <see cref="IDateFormatter"/> to format the <see cref="LoggingEvent.TimeStamp"/> 
+  /// in Universal time.
+  /// </para>
+  /// <para>
+  /// See the <see cref="DatePatternConverter"/> for details on the date pattern syntax.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="DatePatternConverter"/>
+  /// <author>Nicko Cadell</author>
+  internal class UtcDatePatternConverter : DatePatternConverter
+  {
+    /// <summary>
+    /// Write the TimeStamp to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <remarks>
+    /// <para>
+    /// Pass the <see cref="LoggingEvent.TimeStamp"/> to the <see cref="IDateFormatter"/>
+    /// for it to render it to the writer.
+    /// </para>
+    /// <para>
+    /// The <see cref="LoggingEvent.TimeStamp"/> passed is in the local time zone, this is converted
+    /// to Universal time before it is rendered.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="DatePatternConverter"/>
+    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      try
+      {
+        m_dateFormatter.FormatDate(loggingEvent.TimeStampUtc, writer);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting date.", ex);
+      }
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the UtcDatePatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(UtcDatePatternConverter);
+    /// <summary>
+    /// The fully qualified type of the UtcDatePatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(UtcDatePatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Layout/PatternLayout.cs b/src/log4net/Layout/PatternLayout.cs
index 49cad59..bbf131c 100644
--- a/src/log4net/Layout/PatternLayout.cs
+++ b/src/log4net/Layout/PatternLayout.cs
@@ -25,1146 +25,1146 @@
 using log4net.Layout.Pattern;
 using log4net.Util;
 using log4net.Util.PatternStringConverters;
-using AppDomainPatternConverter=log4net.Layout.Pattern.AppDomainPatternConverter;
-using DatePatternConverter=log4net.Layout.Pattern.DatePatternConverter;
-using IdentityPatternConverter=log4net.Layout.Pattern.IdentityPatternConverter;
-using PropertyPatternConverter=log4net.Layout.Pattern.PropertyPatternConverter;
-using UserNamePatternConverter=log4net.Layout.Pattern.UserNamePatternConverter;
-using UtcDatePatternConverter=log4net.Layout.Pattern.UtcDatePatternConverter;
+using AppDomainPatternConverter = log4net.Layout.Pattern.AppDomainPatternConverter;
+using DatePatternConverter = log4net.Layout.Pattern.DatePatternConverter;
+using IdentityPatternConverter = log4net.Layout.Pattern.IdentityPatternConverter;
+using PropertyPatternConverter = log4net.Layout.Pattern.PropertyPatternConverter;
+using UserNamePatternConverter = log4net.Layout.Pattern.UserNamePatternConverter;
+using UtcDatePatternConverter = log4net.Layout.Pattern.UtcDatePatternConverter;
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// A flexible layout configurable with pattern string.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The goal of this class is to <see cref="M:PatternLayout.Format(TextWriter,LoggingEvent)"/> a 
-	/// <see cref="LoggingEvent"/> as a string. The results
-	/// depend on the <i>conversion pattern</i>.
-	/// </para>
-	/// <para>
-	/// The conversion pattern is closely related to the conversion
-	/// pattern of the printf function in C. A conversion pattern is
-	/// composed of literal text and format control expressions called
-	/// <i>conversion specifiers</i>.
-	/// </para>
-	/// <para>
-	/// <i>You are free to insert any literal text within the conversion
-	/// pattern.</i>
-	/// </para>
-	/// <para>
-	/// Each conversion specifier starts with a percent sign (%) and is
-	/// followed by optional <i>format modifiers</i> and a <i>conversion
-	/// pattern name</i>. The conversion pattern name specifies the type of
-	/// data, e.g. logger, level, date, thread name. The format
-	/// modifiers control such things as field width, padding, left and
-	/// right justification. The following is a simple example.
-	/// </para>
-	/// <para>
-	/// Let the conversion pattern be <b>"%-5level [%thread]: %message%newline"</b> and assume
-	/// that the log4net environment was set to use a PatternLayout. Then the
-	/// statements
-	/// </para>
-	/// <code lang="C#">
-	/// ILog log = LogManager.GetLogger(typeof(TestApp));
-	/// log.Debug("Message 1");
-	/// log.Warn("Message 2");   
-	/// </code>
-	/// <para>would yield the output</para>
-	/// <code>
-	/// DEBUG [main]: Message 1
-	/// WARN  [main]: Message 2  
-	/// </code>
-	/// <para>
-	/// Note that there is no explicit separator between text and
-	/// conversion specifiers. The pattern parser knows when it has reached
-	/// the end of a conversion specifier when it reads a conversion
-	/// character. In the example above the conversion specifier
-	/// <b>%-5level</b> means the level of the logging event should be left
-	/// justified to a width of five characters.
-	/// </para>
-	/// <para>
-	/// The recognized conversion pattern names are:
-	/// </para>
-	/// <list type="table">
-	///     <listheader>
-	///         <term>Conversion Pattern Name</term>
-	///         <description>Effect</description>
-	///     </listheader>
-	///     <item>
-	///         <term>a</term>
-	///         <description>Equivalent to <b>appdomain</b></description>
-	///     </item>
-	///     <item>
-	///         <term>appdomain</term>
-	///         <description>
-	///				Used to output the friendly name of the AppDomain where the 
-	///				logging event was generated. 
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>aspnet-cache</term>
-	///         <description>
-    ///             <para>
-    ///             Used to output all cache items in the case of <b>%aspnet-cache</b> or just one named item if used as <b>%aspnet-cache{key}</b>
-    ///             </para>
-    ///             <para>
-    ///             This pattern is not available for Compact Framework or Client Profile assemblies.
-    ///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>aspnet-context</term>
-	///         <description>
-    ///             <para>
-    ///             Used to output all context items in the case of <b>%aspnet-context</b> or just one named item if used as <b>%aspnet-context{key}</b>
-    ///             </para>
-    ///             <para>
-    ///             This pattern is not available for Compact Framework or Client Profile assemblies.
-    ///             </para>
-    ///         </description>
-	///     </item>
-	///     <item>
-	///         <term>aspnet-request</term>
-	///         <description>
-    ///             <para>
-    ///             Used to output all request parameters in the case of <b>%aspnet-request</b> or just one named param if used as <b>%aspnet-request{key}</b>
-    ///             </para>
-    ///             <para>
-    ///             This pattern is not available for Compact Framework or Client Profile assemblies.
-    ///             </para>
-    ///         </description>
-	///     </item>
-	///     <item>
-	///         <term>aspnet-session</term>
-	///         <description>
-    ///             <para>
-    ///             Used to output all session items in the case of <b>%aspnet-session</b> or just one named item if used as <b>%aspnet-session{key}</b>
-    ///             </para>
-    ///             <para>
-    ///             This pattern is not available for Compact Framework or Client Profile assemblies.
-    ///             </para>
-    ///         </description>
-	///     </item>
-	///     <item>
-	///         <term>c</term>
-	///         <description>Equivalent to <b>logger</b></description>
-	///     </item>
-	///     <item>
-	///         <term>C</term>
-	///         <description>Equivalent to <b>type</b></description>
-	///     </item>
-	///     <item>
-	///         <term>class</term>
-	///         <description>Equivalent to <b>type</b></description>
-	///     </item>
-	///     <item>
-	///         <term>d</term>
-	///         <description>Equivalent to <b>date</b></description>
-	///     </item>
-	///     <item>
-	///			<term>date</term> 
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the date of the logging event in the local time zone. 
-	/// 			To output the date in universal time use the <c>%utcdate</c> pattern.
-	/// 			The date conversion 
-	/// 			specifier may be followed by a <i>date format specifier</i> enclosed 
-	/// 			between braces. For example, <b>%date{HH:mm:ss,fff}</b> or
-	/// 			<b>%date{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
-	/// 			given then ISO8601 format is
-	/// 			assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
-	/// 			</para>
-	/// 			<para>
-	/// 			The date format specifier admits the same syntax as the
-	/// 			time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	/// 			<para>
-	/// 			For better results it is recommended to use the log4net date
-	/// 			formatters. These can be specified using one of the strings
-	/// 			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
-	/// 			<see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
-	/// 			<see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
-	/// 			<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
-	/// 			<b>%date{ISO8601}</b> or <b>%date{ABSOLUTE}</b>.
-	/// 			</para>
-	/// 			<para>
-	/// 			These dedicated date formatters perform significantly
-	/// 			better than <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>exception</term>
-	///			<description>
-	///				<para>
-	///				Used to output the exception passed in with the log message.
-	///				</para>
-	///				<para>
-	/// 			If an exception object is stored in the logging event
-	/// 			it will be rendered into the pattern output with a
-	/// 			trailing newline.
-	/// 			If there is no exception then nothing will be output
-	/// 			and no trailing newline will be appended.
-	/// 			It is typical to put a newline before the exception
-	/// 			and to have the exception as the last data in the pattern.
-	///				</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>F</term>
-	///         <description>Equivalent to <b>file</b></description>
-	///     </item>
-	///		<item>
-	///			<term>file</term>
-	///			<description>
-	///				<para>
-	///				Used to output the file name where the logging request was
-	///				issued.
-	///				</para>
-	///				<para>
-	///				<b>WARNING</b> Generating caller location information is
-	///				extremely slow. Its use should be avoided unless execution speed
-	///				is not an issue.
-	///				</para>
-	/// 			<para>
-	/// 			See the note below on the availability of caller location information.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>identity</term>
-	///			<description>
-	///				<para>
-	///				Used to output the user name for the currently active user
-	///				(Principal.Identity.Name).
-	///				</para>
-	///				<para>
-	///				<b>WARNING</b> Generating caller information is
-	///				extremely slow. Its use should be avoided unless execution speed
-	///				is not an issue.
-	///				</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>l</term>
-	///         <description>Equivalent to <b>location</b></description>
-	///     </item>
-	///     <item>
-	///         <term>L</term>
-	///         <description>Equivalent to <b>line</b></description>
-	///     </item>
-	///		<item>
-	///			<term>location</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output location information of the caller which generated
-	/// 			the logging event.
-	/// 			</para>
-	/// 			<para>
-	/// 			The location information depends on the CLI implementation but
-	/// 			usually consists of the fully qualified name of the calling
-	/// 			method followed by the callers source the file name and line
-	/// 			number between parentheses.
-	/// 			</para>
-	/// 			<para>
-	/// 			The location information can be very useful. However, its
-	/// 			generation is <b>extremely</b> slow. Its use should be avoided
-	/// 			unless execution speed is not an issue.
-	/// 			</para>
-	/// 			<para>
-	/// 			See the note below on the availability of caller location information.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>level</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the level of the logging event.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>line</term>
-	///			<description>
-	///				<para>
-	///				Used to output the line number from where the logging request
-	///				was issued.
-	///				</para>
-	///				<para>
-	///				<b>WARNING</b> Generating caller location information is
-	///				extremely slow. Its use should be avoided unless execution speed
-	///				is not an issue.
-	///				</para>
-	/// 			<para>
-	/// 			See the note below on the availability of caller location information.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>logger</term>
-	///         <description>
-	///             <para>
-	///				Used to output the logger of the logging event. The
-	/// 			logger conversion specifier can be optionally followed by
-	/// 			<i>precision specifier</i>, that is a decimal constant in
-	/// 			brackets.
-	///             </para>
-	/// 			<para>
-	/// 			If a precision specifier is given, then only the corresponding
-	/// 			number of right most components of the logger name will be
-	/// 			printed. By default the logger name is printed in full.
-	/// 			</para>
-	/// 			<para>
-	/// 			For example, for the logger name "a.b.c" the pattern
-	/// 			<b>%logger{2}</b> will output "b.c".
-	/// 			</para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>m</term>
-	///         <description>Equivalent to <b>message</b></description>
-	///     </item>
-	///     <item>
-	///         <term>M</term>
-	///         <description>Equivalent to <b>method</b></description>
-	///     </item>
-	///		<item>
-	///			<term>message</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the application supplied message associated with 
-	/// 			the logging event.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>mdc</term>
-	///			<description>
-	/// 			<para>
-	/// 			The MDC (old name for the ThreadContext.Properties) is now part of the
-	/// 			combined event properties. This pattern is supported for compatibility
-	/// 			but is equivalent to <b>property</b>.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>method</term>
-	///			<description>
-	///				<para>
-	///				Used to output the method name where the logging request was
-	///				issued.
-	///				</para>
-	///				<para>
-	///				<b>WARNING</b> Generating caller location information is
-	///				extremely slow. Its use should be avoided unless execution speed
-	///				is not an issue.
-	///				</para>
-	/// 			<para>
-	/// 			See the note below on the availability of caller location information.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>n</term>
-	///         <description>Equivalent to <b>newline</b></description>
-	///     </item>
-	///		<item>
-	///			<term>newline</term>
-	///			<description>
-	/// 			<para>
-	/// 			Outputs the platform dependent line separator character or
-	/// 			characters.
-	/// 			</para>
-	/// 			<para>
-	/// 			This conversion pattern offers the same performance as using 
-	/// 			non-portable line separator strings such as	"\n", or "\r\n". 
-	/// 			Thus, it is the preferred way of specifying a line separator.
-	/// 			</para> 
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>ndc</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the NDC (nested diagnostic context) associated
-	/// 			with the thread that generated the logging event.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>p</term>
-	///         <description>Equivalent to <b>level</b></description>
-	///     </item>
-	///     <item>
-	///         <term>P</term>
-	///         <description>Equivalent to <b>property</b></description>
-	///     </item>
-	///     <item>
-	///         <term>properties</term>
-	///         <description>Equivalent to <b>property</b></description>
-	///     </item>
-	///		<item>
-	///			<term>property</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the an event specific property. The key to 
-	/// 			lookup must be specified within braces and directly following the
-	/// 			pattern specifier, e.g. <b>%property{user}</b> would include the value
-	/// 			from the property that is keyed by the string 'user'. Each property value
-	/// 			that is to be included in the log must be specified separately.
-	/// 			Properties are added to events by loggers or appenders. By default 
-	/// 			the <c>log4net:HostName</c> property is set to the name of machine on 
-	/// 			which the event was originally logged.
-	/// 			</para>
-	/// 			<para>
-	/// 			If no key is specified, e.g. <b>%property</b> then all the keys and their
-	/// 			values are printed in a comma separated list.
-	/// 			</para>
-	/// 			<para>
-	/// 			The properties of an event are combined from a number of different
-	/// 			contexts. These are listed below in the order in which they are searched.
-	/// 			</para>
-	/// 			<list type="definition">
-	/// 				<item>
-	/// 					<term>the event properties</term>
-	/// 					<description>
-	/// 					The event has <see cref="LoggingEvent.Properties"/> that can be set. These 
-	/// 					properties are specific to this event only.
-	/// 					</description>
-	/// 				</item>
-	/// 				<item>
-	/// 					<term>the thread properties</term>
-	/// 					<description>
-	/// 					The <see cref="ThreadContext.Properties"/> that are set on the current
-	/// 					thread. These properties are shared by all events logged on this thread.
-	/// 					</description>
-	/// 				</item>
-	/// 				<item>
-	/// 					<term>the global properties</term>
-	/// 					<description>
-	/// 					The <see cref="GlobalContext.Properties"/> that are set globally. These 
-	/// 					properties are shared by all the threads in the AppDomain.
-	/// 					</description>
-	/// 				</item>
-	/// 			</list>
-	/// 			
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>r</term>
-	///         <description>Equivalent to <b>timestamp</b></description>
-	///     </item>
-	/// 	<item>
-	///			<term>stacktrace</term> 
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the stack trace of the logging event
-	/// 			The stack trace level specifier may be enclosed 
-	/// 			between braces. For example, <b>%stacktrace{level}</b>.  
-	/// 			If no stack trace level specifier is given then 1 is assumed 
-	/// 			</para>
-    /// 			<para>
-    /// 			Output uses the format:
-    /// 			type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1
-    /// 			</para>
-    ///             <para>
-    ///             This pattern is not available for Compact Framework assemblies.
-    ///             </para>
-    ///			</description>
-	///		</item>
-    /// 	<item>
-    ///			<term>stacktracedetail</term> 
-    ///			<description>
-    /// 			<para>
-    /// 			Used to output the stack trace of the logging event
-    /// 			The stack trace level specifier may be enclosed 
-    /// 			between braces. For example, <b>%stacktracedetail{level}</b>.  
-    /// 			If no stack trace level specifier is given then 1 is assumed 
-    /// 			</para>
-    /// 			<para>
-    /// 			Output uses the format:
-    ///             type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...)
-    /// 			</para>
-    ///             <para>
-    ///             This pattern is not available for Compact Framework assemblies.
-    ///             </para>
-    ///			</description>
-    ///		</item>
-    ///     <item>
-	///         <term>t</term>
-	///         <description>Equivalent to <b>thread</b></description>
-	///     </item>
-	///		<item>
-	///			<term>timestamp</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the number of milliseconds elapsed since the start
-	/// 			of the application until the creation of the logging event.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///		<item>
-	///			<term>thread</term>
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the name of the thread that generated the
-	/// 			logging event. Uses the thread number if no name is available.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///			<term>type</term> 
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the fully qualified type name of the caller
-	/// 			issuing the logging request. This conversion specifier
-	/// 			can be optionally followed by <i>precision specifier</i>, that
-	/// 			is a decimal constant in brackets.
-	/// 			</para>
-	/// 			<para>
-	/// 			If a precision specifier is given, then only the corresponding
-	/// 			number of right most components of the class name will be
-	/// 			printed. By default the class name is output in fully qualified form.
-	/// 			</para>
-	/// 			<para>
-	/// 			For example, for the class name "log4net.Layout.PatternLayout", the
-	/// 			pattern <b>%type{1}</b> will output "PatternLayout".
-	/// 			</para>
-	/// 			<para>
-	/// 			<b>WARNING</b> Generating the caller class information is
-	/// 			slow. Thus, its use should be avoided unless execution speed is
-	/// 			not an issue.
-	/// 			</para>
-	/// 			<para>
-	/// 			See the note below on the availability of caller location information.
-	/// 			</para>
-	///			</description>
-	///     </item>
-	///     <item>
-	///         <term>u</term>
-	///         <description>Equivalent to <b>identity</b></description>
-	///     </item>
-	///		<item>
-	///			<term>username</term>
-	///			<description>
-	///				<para>
-	///				Used to output the WindowsIdentity for the currently
-	///				active user.
-	///				</para>
-	///				<para>
-	///				<b>WARNING</b> Generating caller WindowsIdentity information is
-	///				extremely slow. Its use should be avoided unless execution speed
-	///				is not an issue.
-	///				</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///			<term>utcdate</term> 
-	///			<description>
-	/// 			<para>
-	/// 			Used to output the date of the logging event in universal time. 
-	/// 			The date conversion 
-	/// 			specifier may be followed by a <i>date format specifier</i> enclosed 
-	/// 			between braces. For example, <b>%utcdate{HH:mm:ss,fff}</b> or
-	/// 			<b>%utcdate{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
-	/// 			given then ISO8601 format is
-	/// 			assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
-	/// 			</para>
-	/// 			<para>
-	/// 			The date format specifier admits the same syntax as the
-	/// 			time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	/// 			<para>
-	/// 			For better results it is recommended to use the log4net date
-	/// 			formatters. These can be specified using one of the strings
-	/// 			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
-	/// 			<see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
-	/// 			<see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
-	/// 			<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
-	/// 			<b>%utcdate{ISO8601}</b> or <b>%utcdate{ABSOLUTE}</b>.
-	/// 			</para>
-	/// 			<para>
-	/// 			These dedicated date formatters perform significantly
-	/// 			better than <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	///     <item>
-	///         <term>w</term>
-	///         <description>Equivalent to <b>username</b></description>
-	///     </item>
-	///     <item>
-	///         <term>x</term>
-	///         <description>Equivalent to <b>ndc</b></description>
-	///     </item>
-	///     <item>
-	///         <term>X</term>
-	///         <description>Equivalent to <b>mdc</b></description>
-	///     </item>
-	///		<item>
-	///			<term>%</term>
-	///			<description>
-	/// 			<para>
-	/// 			The sequence %% outputs a single percent sign.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	/// </list>
-	/// <para>
-	/// The single letter patterns are deprecated in favor of the 
-	/// longer more descriptive pattern names.
-	/// </para>
-	/// <para>
-	/// By default the relevant information is output as is. However,
-	/// with the aid of format modifiers it is possible to change the
-	/// minimum field width, the maximum field width and justification.
-	/// </para>
-	/// <para>
-	/// The optional format modifier is placed between the percent sign
-	/// and the conversion pattern name.
-	/// </para>
-	/// <para>
-	/// The first optional format modifier is the <i>left justification
-	/// flag</i> which is just the minus (-) character. Then comes the
-	/// optional <i>minimum field width</i> modifier. This is a decimal
-	/// constant that represents the minimum number of characters to
-	/// output. If the data item requires fewer characters, it is padded on
-	/// either the left or the right until the minimum width is
-	/// reached. The default is to pad on the left (right justify) but you
-	/// can specify right padding with the left justification flag. The
-	/// padding character is space. If the data item is larger than the
-	/// minimum field width, the field is expanded to accommodate the
-	/// data. The value is never truncated.
-	/// </para>
-	/// <para>
-	/// This behavior can be changed using the <i>maximum field
-	/// width</i> modifier which is designated by a period followed by a
-	/// decimal constant. If the data item is longer than the maximum
-	/// field, then the extra characters are removed from the
-	/// <i>beginning</i> of the data item and not from the end. For
-	/// example, it the maximum field width is eight and the data item is
-	/// ten characters long, then the first two characters of the data item
-	/// are dropped. This behavior deviates from the printf function in C
-	/// where truncation is done from the end.
-	/// </para>
-	/// <para>
-	/// Below are various format modifier examples for the logger
-	/// conversion specifier.
-	/// </para>
-	/// <div class="tablediv">
-	///		<table class="dtTABLE" cellspacing="0">
-	///			<tr>
-	///				<th>Format modifier</th>
-	///				<th>left justify</th>
-	///				<th>minimum width</th>
-	///				<th>maximum width</th>
-	///				<th>comment</th>
-	///			</tr>
-	///			<tr>
-	///				<td align="center">%20logger</td>
-	///				<td align="center">false</td>
-	///				<td align="center">20</td>
-	///				<td align="center">none</td>
-	///				<td>
-	///					<para>
-	///					Left pad with spaces if the logger name is less than 20
-	///					characters long.
-	///					</para>
-	///				</td>
-	///			</tr>
-	///			<tr>
-	///				<td align="center">%-20logger</td>
-	///				<td align="center">true</td>
-	///				<td align="center">20</td>
-	///				<td align="center">none</td>
-	///				<td>
-	///					<para>
-	///					Right pad with spaces if the logger 
-	///					name is less than 20 characters long.
-	///					</para>
-	///				</td>
-	///			</tr>
-	///			<tr>
-	///				<td align="center">%.30logger</td>
-	///				<td align="center">NA</td>
-	///				<td align="center">none</td>
-	///				<td align="center">30</td>
-	///				<td>
-	///					<para>
-	///					Truncate from the beginning if the logger 
-	///					name is longer than 30 characters.
-	///					</para>
-	///				</td>
-	///			</tr>
-	///			<tr>
-	///				<td align="center"><nobr>%20.30logger</nobr></td>
-	///				<td align="center">false</td>
-	///				<td align="center">20</td>
-	///				<td align="center">30</td>
-	///				<td>
-	///					<para>
-	///					Left pad with spaces if the logger name is shorter than 20
-	///					characters. However, if logger name is longer than 30 characters,
-	///					then truncate from the beginning.
-	///					</para>
-	///				</td>
-	///			</tr>
-	///			<tr>
-	///				<td align="center">%-20.30logger</td>
-	///				<td align="center">true</td>
-	///				<td align="center">20</td>
-	///				<td align="center">30</td>
-	///				<td>
-	///					<para>
-	///					Right pad with spaces if the logger name is shorter than 20
-	///					characters. However, if logger name is longer than 30 characters,
-	///					then truncate from the beginning.
-	///					</para>
-	///				</td>
-	///			</tr>
-	///		</table>
-	///	</div>
-	///	<para>
-	///	<b>Note about caller location information.</b><br />
-	///	The following patterns <c>%type %file %line %method %location %class %C %F %L %l %M</c> 
-	///	all generate caller location information.
-	/// Location information uses the <c>System.Diagnostics.StackTrace</c> class to generate
-	/// a call stack. The caller's information is then extracted from this stack.
-	/// </para>
-	/// <note type="caution">
-	/// <para>
-	/// The <c>System.Diagnostics.StackTrace</c> class is not supported on the 
-	/// .NET Compact Framework 1.0 therefore caller location information is not
-	/// available on that framework.
-	/// </para>
-	/// </note>
-	/// <note type="caution">
-	/// <para>
-	/// The <c>System.Diagnostics.StackTrace</c> class has this to say about Release builds:
-	/// </para>
-	/// <para>
-	/// "StackTrace information will be most informative with Debug build configurations. 
-	/// By default, Debug builds include debug symbols, while Release builds do not. The 
-	/// debug symbols contain most of the file, method name, line number, and column 
-	/// information used in constructing StackFrame and StackTrace objects. StackTrace 
-	/// might not report as many method calls as expected, due to code transformations 
-	/// that occur during optimization."
-	/// </para>
-	/// <para>
-	/// This means that in a Release build the caller information may be incomplete or may 
-	/// not exist at all! Therefore caller location information cannot be relied upon in a Release build.
-	/// </para>
-	/// </note>
-	/// <para>
-	/// Additional pattern converters may be registered with a specific <see cref="PatternLayout"/>
-	/// instance using the <see cref="M:AddConverter(string, Type)"/> method.
-	/// </para>
-	/// </remarks>
-	/// <example>
-	/// This is a more detailed pattern.
-	/// <code><b>%timestamp [%thread] %level %logger %ndc - %message%newline</b></code>
-	/// </example>
-	/// <example>
-	/// A similar pattern except that the relative time is
-	/// right padded if less than 6 digits, thread name is right padded if
-	/// less than 15 characters and truncated if longer and the logger
-	/// name is left padded if shorter than 30 characters and truncated if
-	/// longer.
-	/// <code><b>%-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline</b></code>
-	/// </example>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Douglas de la Torre</author>
-	/// <author>Daniel Cazzulino</author>
-	public class PatternLayout : LayoutSkeleton
-	{
-		#region Constants
+  /// <summary>
+  /// A flexible layout configurable with pattern string.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The goal of this class is to <see cref="M:PatternLayout.Format(TextWriter,LoggingEvent)"/> a 
+  /// <see cref="LoggingEvent"/> as a string. The results
+  /// depend on the <i>conversion pattern</i>.
+  /// </para>
+  /// <para>
+  /// The conversion pattern is closely related to the conversion
+  /// pattern of the printf function in C. A conversion pattern is
+  /// composed of literal text and format control expressions called
+  /// <i>conversion specifiers</i>.
+  /// </para>
+  /// <para>
+  /// <i>You are free to insert any literal text within the conversion
+  /// pattern.</i>
+  /// </para>
+  /// <para>
+  /// Each conversion specifier starts with a percent sign (%) and is
+  /// followed by optional <i>format modifiers</i> and a <i>conversion
+  /// pattern name</i>. The conversion pattern name specifies the type of
+  /// data, e.g. logger, level, date, thread name. The format
+  /// modifiers control such things as field width, padding, left and
+  /// right justification. The following is a simple example.
+  /// </para>
+  /// <para>
+  /// Let the conversion pattern be <b>"%-5level [%thread]: %message%newline"</b> and assume
+  /// that the log4net environment was set to use a PatternLayout. Then the
+  /// statements
+  /// </para>
+  /// <code lang="C#">
+  /// ILog log = LogManager.GetLogger(typeof(TestApp));
+  /// log.Debug("Message 1");
+  /// log.Warn("Message 2");   
+  /// </code>
+  /// <para>would yield the output</para>
+  /// <code>
+  /// DEBUG [main]: Message 1
+  /// WARN  [main]: Message 2  
+  /// </code>
+  /// <para>
+  /// Note that there is no explicit separator between text and
+  /// conversion specifiers. The pattern parser knows when it has reached
+  /// the end of a conversion specifier when it reads a conversion
+  /// character. In the example above the conversion specifier
+  /// <b>%-5level</b> means the level of the logging event should be left
+  /// justified to a width of five characters.
+  /// </para>
+  /// <para>
+  /// The recognized conversion pattern names are:
+  /// </para>
+  /// <list type="table">
+  ///     <listheader>
+  ///         <term>Conversion Pattern Name</term>
+  ///         <description>Effect</description>
+  ///     </listheader>
+  ///     <item>
+  ///         <term>a</term>
+  ///         <description>Equivalent to <b>appdomain</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>appdomain</term>
+  ///         <description>
+  ///        Used to output the friendly name of the AppDomain where the 
+  ///        logging event was generated. 
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>aspnet-cache</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output all cache items in the case of <b>%aspnet-cache</b> or just one named item if used as <b>%aspnet-cache{key}</b>
+  ///             </para>
+  ///             <para>
+  ///             This pattern is not available for Compact Framework or Client Profile assemblies.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>aspnet-context</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output all context items in the case of <b>%aspnet-context</b> or just one named item if used as <b>%aspnet-context{key}</b>
+  ///             </para>
+  ///             <para>
+  ///             This pattern is not available for Compact Framework or Client Profile assemblies.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>aspnet-request</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output all request parameters in the case of <b>%aspnet-request</b> or just one named param if used as <b>%aspnet-request{key}</b>
+  ///             </para>
+  ///             <para>
+  ///             This pattern is not available for Compact Framework or Client Profile assemblies.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>aspnet-session</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output all session items in the case of <b>%aspnet-session</b> or just one named item if used as <b>%aspnet-session{key}</b>
+  ///             </para>
+  ///             <para>
+  ///             This pattern is not available for Compact Framework or Client Profile assemblies.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>c</term>
+  ///         <description>Equivalent to <b>logger</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>C</term>
+  ///         <description>Equivalent to <b>type</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>class</term>
+  ///         <description>Equivalent to <b>type</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>d</term>
+  ///         <description>Equivalent to <b>date</b></description>
+  ///     </item>
+  ///     <item>
+  ///      <term>date</term> 
+  ///      <description>
+  ///       <para>
+  ///       Used to output the date of the logging event in the local time zone. 
+  ///       To output the date in universal time use the <c>%utcdate</c> pattern.
+  ///       The date conversion 
+  ///       specifier may be followed by a <i>date format specifier</i> enclosed 
+  ///       between braces. For example, <b>%date{HH:mm:ss,fff}</b> or
+  ///       <b>%date{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+  ///       given then ISO8601 format is
+  ///       assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
+  ///       </para>
+  ///       <para>
+  ///       The date format specifier admits the same syntax as the
+  ///       time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///       <para>
+  ///       For better results it is recommended to use the log4net date
+  ///       formatters. These can be specified using one of the strings
+  ///       "ABSOLUTE", "DATE" and "ISO8601" for specifying 
+  ///       <see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+  ///       <see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+  ///       <see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+  ///       <b>%date{ISO8601}</b> or <b>%date{ABSOLUTE}</b>.
+  ///       </para>
+  ///       <para>
+  ///       These dedicated date formatters perform significantly
+  ///       better than <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>exception</term>
+  ///      <description>
+  ///        <para>
+  ///        Used to output the exception passed in with the log message.
+  ///        </para>
+  ///        <para>
+  ///       If an exception object is stored in the logging event
+  ///       it will be rendered into the pattern output with a
+  ///       trailing newline.
+  ///       If there is no exception then nothing will be output
+  ///       and no trailing newline will be appended.
+  ///       It is typical to put a newline before the exception
+  ///       and to have the exception as the last data in the pattern.
+  ///        </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>F</term>
+  ///         <description>Equivalent to <b>file</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>file</term>
+  ///      <description>
+  ///        <para>
+  ///        Used to output the file name where the logging request was
+  ///        issued.
+  ///        </para>
+  ///        <para>
+  ///        <b>WARNING</b> Generating caller location information is
+  ///        extremely slow. Its use should be avoided unless execution speed
+  ///        is not an issue.
+  ///        </para>
+  ///       <para>
+  ///       See the note below on the availability of caller location information.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>identity</term>
+  ///      <description>
+  ///        <para>
+  ///        Used to output the user name for the currently active user
+  ///        (Principal.Identity.Name).
+  ///        </para>
+  ///        <para>
+  ///        <b>WARNING</b> Generating caller information is
+  ///        extremely slow. Its use should be avoided unless execution speed
+  ///        is not an issue.
+  ///        </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>l</term>
+  ///         <description>Equivalent to <b>location</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>L</term>
+  ///         <description>Equivalent to <b>line</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>location</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output location information of the caller which generated
+  ///       the logging event.
+  ///       </para>
+  ///       <para>
+  ///       The location information depends on the CLI implementation but
+  ///       usually consists of the fully qualified name of the calling
+  ///       method followed by the callers source the file name and line
+  ///       number between parentheses.
+  ///       </para>
+  ///       <para>
+  ///       The location information can be very useful. However, its
+  ///       generation is <b>extremely</b> slow. Its use should be avoided
+  ///       unless execution speed is not an issue.
+  ///       </para>
+  ///       <para>
+  ///       See the note below on the availability of caller location information.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>level</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output the level of the logging event.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>line</term>
+  ///      <description>
+  ///        <para>
+  ///        Used to output the line number from where the logging request
+  ///        was issued.
+  ///        </para>
+  ///        <para>
+  ///        <b>WARNING</b> Generating caller location information is
+  ///        extremely slow. Its use should be avoided unless execution speed
+  ///        is not an issue.
+  ///        </para>
+  ///       <para>
+  ///       See the note below on the availability of caller location information.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>logger</term>
+  ///         <description>
+  ///             <para>
+  ///        Used to output the logger of the logging event. The
+  ///       logger conversion specifier can be optionally followed by
+  ///       <i>precision specifier</i>, that is a decimal constant in
+  ///       brackets.
+  ///             </para>
+  ///       <para>
+  ///       If a precision specifier is given, then only the corresponding
+  ///       number of right most components of the logger name will be
+  ///       printed. By default the logger name is printed in full.
+  ///       </para>
+  ///       <para>
+  ///       For example, for the logger name "a.b.c" the pattern
+  ///       <b>%logger{2}</b> will output "b.c".
+  ///       </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>m</term>
+  ///         <description>Equivalent to <b>message</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>M</term>
+  ///         <description>Equivalent to <b>method</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>message</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output the application supplied message associated with 
+  ///       the logging event.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>mdc</term>
+  ///      <description>
+  ///       <para>
+  ///       The MDC (old name for the ThreadContext.Properties) is now part of the
+  ///       combined event properties. This pattern is supported for compatibility
+  ///       but is equivalent to <b>property</b>.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>method</term>
+  ///      <description>
+  ///        <para>
+  ///        Used to output the method name where the logging request was
+  ///        issued.
+  ///        </para>
+  ///        <para>
+  ///        <b>WARNING</b> Generating caller location information is
+  ///        extremely slow. Its use should be avoided unless execution speed
+  ///        is not an issue.
+  ///        </para>
+  ///       <para>
+  ///       See the note below on the availability of caller location information.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>n</term>
+  ///         <description>Equivalent to <b>newline</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>newline</term>
+  ///      <description>
+  ///       <para>
+  ///       Outputs the platform dependent line separator character or
+  ///       characters.
+  ///       </para>
+  ///       <para>
+  ///       This conversion pattern offers the same performance as using 
+  ///       non-portable line separator strings such as  "\n", or "\r\n". 
+  ///       Thus, it is the preferred way of specifying a line separator.
+  ///       </para> 
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>ndc</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output the NDC (nested diagnostic context) associated
+  ///       with the thread that generated the logging event.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>p</term>
+  ///         <description>Equivalent to <b>level</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>P</term>
+  ///         <description>Equivalent to <b>property</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>properties</term>
+  ///         <description>Equivalent to <b>property</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>property</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output the an event specific property. The key to 
+  ///       lookup must be specified within braces and directly following the
+  ///       pattern specifier, e.g. <b>%property{user}</b> would include the value
+  ///       from the property that is keyed by the string 'user'. Each property value
+  ///       that is to be included in the log must be specified separately.
+  ///       Properties are added to events by loggers or appenders. By default 
+  ///       the <c>log4net:HostName</c> property is set to the name of machine on 
+  ///       which the event was originally logged.
+  ///       </para>
+  ///       <para>
+  ///       If no key is specified, e.g. <b>%property</b> then all the keys and their
+  ///       values are printed in a comma separated list.
+  ///       </para>
+  ///       <para>
+  ///       The properties of an event are combined from a number of different
+  ///       contexts. These are listed below in the order in which they are searched.
+  ///       </para>
+  ///       <list type="definition">
+  ///         <item>
+  ///           <term>the event properties</term>
+  ///           <description>
+  ///           The event has <see cref="LoggingEvent.Properties"/> that can be set. These 
+  ///           properties are specific to this event only.
+  ///           </description>
+  ///         </item>
+  ///         <item>
+  ///           <term>the thread properties</term>
+  ///           <description>
+  ///           The <see cref="ThreadContext.Properties"/> that are set on the current
+  ///           thread. These properties are shared by all events logged on this thread.
+  ///           </description>
+  ///         </item>
+  ///         <item>
+  ///           <term>the global properties</term>
+  ///           <description>
+  ///           The <see cref="GlobalContext.Properties"/> that are set globally. These 
+  ///           properties are shared by all the threads in the AppDomain.
+  ///           </description>
+  ///         </item>
+  ///       </list>
+  ///       
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>r</term>
+  ///         <description>Equivalent to <b>timestamp</b></description>
+  ///     </item>
+  ///   <item>
+  ///      <term>stacktrace</term> 
+  ///      <description>
+  ///       <para>
+  ///       Used to output the stack trace of the logging event
+  ///       The stack trace level specifier may be enclosed 
+  ///       between braces. For example, <b>%stacktrace{level}</b>.  
+  ///       If no stack trace level specifier is given then 1 is assumed 
+  ///       </para>
+  ///       <para>
+  ///       Output uses the format:
+  ///       type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1
+  ///       </para>
+  ///             <para>
+  ///             This pattern is not available for Compact Framework assemblies.
+  ///             </para>
+  ///      </description>
+  ///    </item>
+  ///   <item>
+  ///      <term>stacktracedetail</term> 
+  ///      <description>
+  ///       <para>
+  ///       Used to output the stack trace of the logging event
+  ///       The stack trace level specifier may be enclosed 
+  ///       between braces. For example, <b>%stacktracedetail{level}</b>.  
+  ///       If no stack trace level specifier is given then 1 is assumed 
+  ///       </para>
+  ///       <para>
+  ///       Output uses the format:
+  ///             type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...)
+  ///       </para>
+  ///             <para>
+  ///             This pattern is not available for Compact Framework assemblies.
+  ///             </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>t</term>
+  ///         <description>Equivalent to <b>thread</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>timestamp</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output the number of milliseconds elapsed since the start
+  ///       of the application until the creation of the logging event.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///    <item>
+  ///      <term>thread</term>
+  ///      <description>
+  ///       <para>
+  ///       Used to output the name of the thread that generated the
+  ///       logging event. Uses the thread number if no name is available.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///      <term>type</term> 
+  ///      <description>
+  ///       <para>
+  ///       Used to output the fully qualified type name of the caller
+  ///       issuing the logging request. This conversion specifier
+  ///       can be optionally followed by <i>precision specifier</i>, that
+  ///       is a decimal constant in brackets.
+  ///       </para>
+  ///       <para>
+  ///       If a precision specifier is given, then only the corresponding
+  ///       number of right most components of the class name will be
+  ///       printed. By default the class name is output in fully qualified form.
+  ///       </para>
+  ///       <para>
+  ///       For example, for the class name "log4net.Layout.PatternLayout", the
+  ///       pattern <b>%type{1}</b> will output "PatternLayout".
+  ///       </para>
+  ///       <para>
+  ///       <b>WARNING</b> Generating the caller class information is
+  ///       slow. Thus, its use should be avoided unless execution speed is
+  ///       not an issue.
+  ///       </para>
+  ///       <para>
+  ///       See the note below on the availability of caller location information.
+  ///       </para>
+  ///      </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>u</term>
+  ///         <description>Equivalent to <b>identity</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>username</term>
+  ///      <description>
+  ///        <para>
+  ///        Used to output the WindowsIdentity for the currently
+  ///        active user.
+  ///        </para>
+  ///        <para>
+  ///        <b>WARNING</b> Generating caller WindowsIdentity information is
+  ///        extremely slow. Its use should be avoided unless execution speed
+  ///        is not an issue.
+  ///        </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///      <term>utcdate</term> 
+  ///      <description>
+  ///       <para>
+  ///       Used to output the date of the logging event in universal time. 
+  ///       The date conversion 
+  ///       specifier may be followed by a <i>date format specifier</i> enclosed 
+  ///       between braces. For example, <b>%utcdate{HH:mm:ss,fff}</b> or
+  ///       <b>%utcdate{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+  ///       given then ISO8601 format is
+  ///       assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
+  ///       </para>
+  ///       <para>
+  ///       The date format specifier admits the same syntax as the
+  ///       time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///       <para>
+  ///       For better results it is recommended to use the log4net date
+  ///       formatters. These can be specified using one of the strings
+  ///       "ABSOLUTE", "DATE" and "ISO8601" for specifying 
+  ///       <see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+  ///       <see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+  ///       <see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+  ///       <b>%utcdate{ISO8601}</b> or <b>%utcdate{ABSOLUTE}</b>.
+  ///       </para>
+  ///       <para>
+  ///       These dedicated date formatters perform significantly
+  ///       better than <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  ///     <item>
+  ///         <term>w</term>
+  ///         <description>Equivalent to <b>username</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>x</term>
+  ///         <description>Equivalent to <b>ndc</b></description>
+  ///     </item>
+  ///     <item>
+  ///         <term>X</term>
+  ///         <description>Equivalent to <b>mdc</b></description>
+  ///     </item>
+  ///    <item>
+  ///      <term>%</term>
+  ///      <description>
+  ///       <para>
+  ///       The sequence %% outputs a single percent sign.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  /// </list>
+  /// <para>
+  /// The single letter patterns are deprecated in favor of the 
+  /// longer more descriptive pattern names.
+  /// </para>
+  /// <para>
+  /// By default the relevant information is output as is. However,
+  /// with the aid of format modifiers it is possible to change the
+  /// minimum field width, the maximum field width and justification.
+  /// </para>
+  /// <para>
+  /// The optional format modifier is placed between the percent sign
+  /// and the conversion pattern name.
+  /// </para>
+  /// <para>
+  /// The first optional format modifier is the <i>left justification
+  /// flag</i> which is just the minus (-) character. Then comes the
+  /// optional <i>minimum field width</i> modifier. This is a decimal
+  /// constant that represents the minimum number of characters to
+  /// output. If the data item requires fewer characters, it is padded on
+  /// either the left or the right until the minimum width is
+  /// reached. The default is to pad on the left (right justify) but you
+  /// can specify right padding with the left justification flag. The
+  /// padding character is space. If the data item is larger than the
+  /// minimum field width, the field is expanded to accommodate the
+  /// data. The value is never truncated.
+  /// </para>
+  /// <para>
+  /// This behavior can be changed using the <i>maximum field
+  /// width</i> modifier which is designated by a period followed by a
+  /// decimal constant. If the data item is longer than the maximum
+  /// field, then the extra characters are removed from the
+  /// <i>beginning</i> of the data item and not from the end. For
+  /// example, it the maximum field width is eight and the data item is
+  /// ten characters long, then the first two characters of the data item
+  /// are dropped. This behavior deviates from the printf function in C
+  /// where truncation is done from the end.
+  /// </para>
+  /// <para>
+  /// Below are various format modifier examples for the logger
+  /// conversion specifier.
+  /// </para>
+  /// <div class="tablediv">
+  ///    <table class="dtTABLE" cellspacing="0">
+  ///      <tr>
+  ///        <th>Format modifier</th>
+  ///        <th>left justify</th>
+  ///        <th>minimum width</th>
+  ///        <th>maximum width</th>
+  ///        <th>comment</th>
+  ///      </tr>
+  ///      <tr>
+  ///        <td align="center">%20logger</td>
+  ///        <td align="center">false</td>
+  ///        <td align="center">20</td>
+  ///        <td align="center">none</td>
+  ///        <td>
+  ///          <para>
+  ///          Left pad with spaces if the logger name is less than 20
+  ///          characters long.
+  ///          </para>
+  ///        </td>
+  ///      </tr>
+  ///      <tr>
+  ///        <td align="center">%-20logger</td>
+  ///        <td align="center">true</td>
+  ///        <td align="center">20</td>
+  ///        <td align="center">none</td>
+  ///        <td>
+  ///          <para>
+  ///          Right pad with spaces if the logger 
+  ///          name is less than 20 characters long.
+  ///          </para>
+  ///        </td>
+  ///      </tr>
+  ///      <tr>
+  ///        <td align="center">%.30logger</td>
+  ///        <td align="center">NA</td>
+  ///        <td align="center">none</td>
+  ///        <td align="center">30</td>
+  ///        <td>
+  ///          <para>
+  ///          Truncate from the beginning if the logger 
+  ///          name is longer than 30 characters.
+  ///          </para>
+  ///        </td>
+  ///      </tr>
+  ///      <tr>
+  ///        <td align="center"><nobr>%20.30logger</nobr></td>
+  ///        <td align="center">false</td>
+  ///        <td align="center">20</td>
+  ///        <td align="center">30</td>
+  ///        <td>
+  ///          <para>
+  ///          Left pad with spaces if the logger name is shorter than 20
+  ///          characters. However, if logger name is longer than 30 characters,
+  ///          then truncate from the beginning.
+  ///          </para>
+  ///        </td>
+  ///      </tr>
+  ///      <tr>
+  ///        <td align="center">%-20.30logger</td>
+  ///        <td align="center">true</td>
+  ///        <td align="center">20</td>
+  ///        <td align="center">30</td>
+  ///        <td>
+  ///          <para>
+  ///          Right pad with spaces if the logger name is shorter than 20
+  ///          characters. However, if logger name is longer than 30 characters,
+  ///          then truncate from the beginning.
+  ///          </para>
+  ///        </td>
+  ///      </tr>
+  ///    </table>
+  ///  </div>
+  ///  <para>
+  ///  <b>Note about caller location information.</b><br />
+  ///  The following patterns <c>%type %file %line %method %location %class %C %F %L %l %M</c> 
+  ///  all generate caller location information.
+  /// Location information uses the <c>System.Diagnostics.StackTrace</c> class to generate
+  /// a call stack. The caller's information is then extracted from this stack.
+  /// </para>
+  /// <note type="caution">
+  /// <para>
+  /// The <c>System.Diagnostics.StackTrace</c> class is not supported on the 
+  /// .NET Compact Framework 1.0 therefore caller location information is not
+  /// available on that framework.
+  /// </para>
+  /// </note>
+  /// <note type="caution">
+  /// <para>
+  /// The <c>System.Diagnostics.StackTrace</c> class has this to say about Release builds:
+  /// </para>
+  /// <para>
+  /// "StackTrace information will be most informative with Debug build configurations. 
+  /// By default, Debug builds include debug symbols, while Release builds do not. The 
+  /// debug symbols contain most of the file, method name, line number, and column 
+  /// information used in constructing StackFrame and StackTrace objects. StackTrace 
+  /// might not report as many method calls as expected, due to code transformations 
+  /// that occur during optimization."
+  /// </para>
+  /// <para>
+  /// This means that in a Release build the caller information may be incomplete or may 
+  /// not exist at all! Therefore caller location information cannot be relied upon in a Release build.
+  /// </para>
+  /// </note>
+  /// <para>
+  /// Additional pattern converters may be registered with a specific <see cref="PatternLayout"/>
+  /// instance using the <see cref="M:AddConverter(string, Type)"/> method.
+  /// </para>
+  /// </remarks>
+  /// <example>
+  /// This is a more detailed pattern.
+  /// <code><b>%timestamp [%thread] %level %logger %ndc - %message%newline</b></code>
+  /// </example>
+  /// <example>
+  /// A similar pattern except that the relative time is
+  /// right padded if less than 6 digits, thread name is right padded if
+  /// less than 15 characters and truncated if longer and the logger
+  /// name is left padded if shorter than 30 characters and truncated if
+  /// longer.
+  /// <code><b>%-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline</b></code>
+  /// </example>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Douglas de la Torre</author>
+  /// <author>Daniel Cazzulino</author>
+  public class PatternLayout : LayoutSkeleton
+  {
+    #region Constants
 
-		/// <summary>
-		/// Default pattern string for log output. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default pattern string for log output. 
-		/// Currently set to the string <b>"%message%newline"</b> 
-		/// which just prints the application supplied message. 
-		/// </para>
-		/// </remarks>
-		public const string DefaultConversionPattern ="%message%newline";
+    /// <summary>
+    /// Default pattern string for log output. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default pattern string for log output. 
+    /// Currently set to the string <b>"%message%newline"</b> 
+    /// which just prints the application supplied message. 
+    /// </para>
+    /// </remarks>
+    public const string DefaultConversionPattern = "%message%newline";
 
-		/// <summary>
-		/// A detailed conversion pattern
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// A conversion pattern which includes Time, Thread, Logger, and Nested Context.
-		/// Current value is <b>%timestamp [%thread] %level %logger %ndc - %message%newline</b>.
-		/// </para>
-		/// </remarks>
-		public const string DetailConversionPattern = "%timestamp [%thread] %level %logger %ndc - %message%newline";
+    /// <summary>
+    /// A detailed conversion pattern
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// A conversion pattern which includes Time, Thread, Logger, and Nested Context.
+    /// Current value is <b>%timestamp [%thread] %level %logger %ndc - %message%newline</b>.
+    /// </para>
+    /// </remarks>
+    public const string DetailConversionPattern = "%timestamp [%thread] %level %logger %ndc - %message%newline";
 
-		#endregion
+    #endregion
 
-		#region Static Fields
+    #region Static Fields
 
-		/// <summary>
-		/// Internal map of converter identifiers to converter types.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This static map is overridden by the m_converterRegistry instance map
-		/// </para>
-		/// </remarks>
-		private static Hashtable s_globalRulesRegistry;
+    /// <summary>
+    /// Internal map of converter identifiers to converter types.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This static map is overridden by the m_converterRegistry instance map
+    /// </para>
+    /// </remarks>
+    private static Hashtable s_globalRulesRegistry;
 
-		#endregion Static Fields
+    #endregion Static Fields
 
-		#region Member Variables
-    
-		/// <summary>
-		/// the pattern
-		/// </summary>
-		private string m_pattern;
-  
-		/// <summary>
-		/// the head of the pattern converter chain
-		/// </summary>
-		private PatternConverter m_head;
+    #region Member Variables
 
-		/// <summary>
-		/// patterns defined on this PatternLayout only
-		/// </summary>
-		private Hashtable m_instanceRulesRegistry = new Hashtable();
+    /// <summary>
+    /// the pattern
+    /// </summary>
+    private string m_pattern;
 
-		#endregion
+    /// <summary>
+    /// the head of the pattern converter chain
+    /// </summary>
+    private PatternConverter m_head;
 
-		#region Static Constructor
+    /// <summary>
+    /// patterns defined on this PatternLayout only
+    /// </summary>
+    private Hashtable m_instanceRulesRegistry = new Hashtable();
 
-		/// <summary>
-		/// Initialize the global registry
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Defines the builtin global rules.
-		/// </para>
-		/// </remarks>
-		static PatternLayout()
-		{
-			s_globalRulesRegistry = new Hashtable(45);
+    #endregion
 
-			s_globalRulesRegistry.Add("literal", typeof(LiteralPatternConverter));
-			s_globalRulesRegistry.Add("newline", typeof(NewLinePatternConverter));
-			s_globalRulesRegistry.Add("n", typeof(NewLinePatternConverter));
+    #region Static Constructor
 
-// .NET Compact Framework 1.0 has no support for ASP.NET
-// SSCLI 1.0 has no support for ASP.NET
+    /// <summary>
+    /// Initialize the global registry
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Defines the builtin global rules.
+    /// </para>
+    /// </remarks>
+    static PatternLayout()
+    {
+      s_globalRulesRegistry = new Hashtable(45);
+
+      s_globalRulesRegistry.Add("literal", typeof(LiteralPatternConverter));
+      s_globalRulesRegistry.Add("newline", typeof(NewLinePatternConverter));
+      s_globalRulesRegistry.Add("n", typeof(NewLinePatternConverter));
+
+      // .NET Compact Framework 1.0 has no support for ASP.NET
+      // SSCLI 1.0 has no support for ASP.NET
 #if !NETCF && !SSCLI && !CLIENT_PROFILE && !NETSTANDARD
-			s_globalRulesRegistry.Add("aspnet-cache", typeof(AspNetCachePatternConverter));
-			s_globalRulesRegistry.Add("aspnet-context", typeof(AspNetContextPatternConverter));
-			s_globalRulesRegistry.Add("aspnet-request", typeof(AspNetRequestPatternConverter));
-			s_globalRulesRegistry.Add("aspnet-session", typeof(AspNetSessionPatternConverter));
+      s_globalRulesRegistry.Add("aspnet-cache", typeof(AspNetCachePatternConverter));
+      s_globalRulesRegistry.Add("aspnet-context", typeof(AspNetContextPatternConverter));
+      s_globalRulesRegistry.Add("aspnet-request", typeof(AspNetRequestPatternConverter));
+      s_globalRulesRegistry.Add("aspnet-session", typeof(AspNetSessionPatternConverter));
 #endif
 
-			s_globalRulesRegistry.Add("c", typeof(LoggerPatternConverter));
-			s_globalRulesRegistry.Add("logger", typeof(LoggerPatternConverter));
+      s_globalRulesRegistry.Add("c", typeof(LoggerPatternConverter));
+      s_globalRulesRegistry.Add("logger", typeof(LoggerPatternConverter));
 
-			s_globalRulesRegistry.Add("C", typeof(TypeNamePatternConverter));
-			s_globalRulesRegistry.Add("class", typeof(TypeNamePatternConverter));
-			s_globalRulesRegistry.Add("type", typeof(TypeNamePatternConverter));
+      s_globalRulesRegistry.Add("C", typeof(TypeNamePatternConverter));
+      s_globalRulesRegistry.Add("class", typeof(TypeNamePatternConverter));
+      s_globalRulesRegistry.Add("type", typeof(TypeNamePatternConverter));
 
-			s_globalRulesRegistry.Add("d", typeof(DatePatternConverter));
-			s_globalRulesRegistry.Add("date", typeof(DatePatternConverter));
+      s_globalRulesRegistry.Add("d", typeof(DatePatternConverter));
+      s_globalRulesRegistry.Add("date", typeof(DatePatternConverter));
 
-			s_globalRulesRegistry.Add("exception", typeof(ExceptionPatternConverter));
+      s_globalRulesRegistry.Add("exception", typeof(ExceptionPatternConverter));
 
-			s_globalRulesRegistry.Add("F", typeof(FileLocationPatternConverter));
-			s_globalRulesRegistry.Add("file", typeof(FileLocationPatternConverter));
+      s_globalRulesRegistry.Add("F", typeof(FileLocationPatternConverter));
+      s_globalRulesRegistry.Add("file", typeof(FileLocationPatternConverter));
 
-			s_globalRulesRegistry.Add("l", typeof(FullLocationPatternConverter));
-			s_globalRulesRegistry.Add("location", typeof(FullLocationPatternConverter));
+      s_globalRulesRegistry.Add("l", typeof(FullLocationPatternConverter));
+      s_globalRulesRegistry.Add("location", typeof(FullLocationPatternConverter));
 
-			s_globalRulesRegistry.Add("L", typeof(LineLocationPatternConverter));
-			s_globalRulesRegistry.Add("line", typeof(LineLocationPatternConverter));
+      s_globalRulesRegistry.Add("L", typeof(LineLocationPatternConverter));
+      s_globalRulesRegistry.Add("line", typeof(LineLocationPatternConverter));
 
-			s_globalRulesRegistry.Add("m", typeof(MessagePatternConverter));
-			s_globalRulesRegistry.Add("message", typeof(MessagePatternConverter));
+      s_globalRulesRegistry.Add("m", typeof(MessagePatternConverter));
+      s_globalRulesRegistry.Add("message", typeof(MessagePatternConverter));
 
-			s_globalRulesRegistry.Add("M", typeof(MethodLocationPatternConverter));
-			s_globalRulesRegistry.Add("method", typeof(MethodLocationPatternConverter));
+      s_globalRulesRegistry.Add("M", typeof(MethodLocationPatternConverter));
+      s_globalRulesRegistry.Add("method", typeof(MethodLocationPatternConverter));
 
-			s_globalRulesRegistry.Add("p", typeof(LevelPatternConverter));
-			s_globalRulesRegistry.Add("level", typeof(LevelPatternConverter));
+      s_globalRulesRegistry.Add("p", typeof(LevelPatternConverter));
+      s_globalRulesRegistry.Add("level", typeof(LevelPatternConverter));
 
-			s_globalRulesRegistry.Add("P", typeof(PropertyPatternConverter));
-			s_globalRulesRegistry.Add("property", typeof(PropertyPatternConverter));
-			s_globalRulesRegistry.Add("properties", typeof(PropertyPatternConverter));
+      s_globalRulesRegistry.Add("P", typeof(PropertyPatternConverter));
+      s_globalRulesRegistry.Add("property", typeof(PropertyPatternConverter));
+      s_globalRulesRegistry.Add("properties", typeof(PropertyPatternConverter));
 
-			s_globalRulesRegistry.Add("r", typeof(RelativeTimePatternConverter));
-			s_globalRulesRegistry.Add("timestamp", typeof(RelativeTimePatternConverter));
-			
+      s_globalRulesRegistry.Add("r", typeof(RelativeTimePatternConverter));
+      s_globalRulesRegistry.Add("timestamp", typeof(RelativeTimePatternConverter));
+
 #if !NETCF && !NETSTANDARD1_3
-			s_globalRulesRegistry.Add("stacktrace", typeof(StackTracePatternConverter));
-            s_globalRulesRegistry.Add("stacktracedetail", typeof(StackTraceDetailPatternConverter));
+      s_globalRulesRegistry.Add("stacktrace", typeof(StackTracePatternConverter));
+      s_globalRulesRegistry.Add("stacktracedetail", typeof(StackTraceDetailPatternConverter));
 #endif
 
-			s_globalRulesRegistry.Add("t", typeof(ThreadPatternConverter));
-			s_globalRulesRegistry.Add("thread", typeof(ThreadPatternConverter));
+      s_globalRulesRegistry.Add("t", typeof(ThreadPatternConverter));
+      s_globalRulesRegistry.Add("thread", typeof(ThreadPatternConverter));
 
-			// For backwards compatibility the NDC patterns
-			s_globalRulesRegistry.Add("x", typeof(NdcPatternConverter));
-			s_globalRulesRegistry.Add("ndc", typeof(NdcPatternConverter));
+      // For backwards compatibility the NDC patterns
+      s_globalRulesRegistry.Add("x", typeof(NdcPatternConverter));
+      s_globalRulesRegistry.Add("ndc", typeof(NdcPatternConverter));
 
-			// For backwards compatibility the MDC patterns just do a property lookup
-			s_globalRulesRegistry.Add("X", typeof(PropertyPatternConverter));
-			s_globalRulesRegistry.Add("mdc", typeof(PropertyPatternConverter));
+      // For backwards compatibility the MDC patterns just do a property lookup
+      s_globalRulesRegistry.Add("X", typeof(PropertyPatternConverter));
+      s_globalRulesRegistry.Add("mdc", typeof(PropertyPatternConverter));
 
-			s_globalRulesRegistry.Add("a", typeof(AppDomainPatternConverter));
-			s_globalRulesRegistry.Add("appdomain", typeof(AppDomainPatternConverter));
+      s_globalRulesRegistry.Add("a", typeof(AppDomainPatternConverter));
+      s_globalRulesRegistry.Add("appdomain", typeof(AppDomainPatternConverter));
 
-			s_globalRulesRegistry.Add("u", typeof(IdentityPatternConverter));
-			s_globalRulesRegistry.Add("identity", typeof(IdentityPatternConverter));
+      s_globalRulesRegistry.Add("u", typeof(IdentityPatternConverter));
+      s_globalRulesRegistry.Add("identity", typeof(IdentityPatternConverter));
 
-			s_globalRulesRegistry.Add("utcdate", typeof(UtcDatePatternConverter));
-			s_globalRulesRegistry.Add("utcDate", typeof(UtcDatePatternConverter));
-			s_globalRulesRegistry.Add("UtcDate", typeof(UtcDatePatternConverter));
+      s_globalRulesRegistry.Add("utcdate", typeof(UtcDatePatternConverter));
+      s_globalRulesRegistry.Add("utcDate", typeof(UtcDatePatternConverter));
+      s_globalRulesRegistry.Add("UtcDate", typeof(UtcDatePatternConverter));
 
-			s_globalRulesRegistry.Add("w", typeof(UserNamePatternConverter));
-			s_globalRulesRegistry.Add("username", typeof(UserNamePatternConverter));
-		}
+      s_globalRulesRegistry.Add("w", typeof(UserNamePatternConverter));
+      s_globalRulesRegistry.Add("username", typeof(UserNamePatternConverter));
+    }
 
-		#endregion Static Constructor
+    #endregion Static Constructor
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Constructs a PatternLayout using the DefaultConversionPattern
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The default pattern just produces the application supplied message.
-		/// </para>
-		/// <para>
-		/// Note to Inheritors: This constructor calls the virtual method
-		/// <see cref="CreatePatternParser"/>. If you override this method be
-		/// aware that it will be called before your is called constructor.
-		/// </para>
-		/// <para>
-		/// As per the <see cref="IOptionHandler"/> contract the <see cref="ActivateOptions"/>
-		/// method must be called after the properties on this object have been
-		/// configured.
-		/// </para>
-		/// </remarks>
-		public PatternLayout() : this(DefaultConversionPattern)
-		{
-		}
+    /// <summary>
+    /// Constructs a PatternLayout using the DefaultConversionPattern
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The default pattern just produces the application supplied message.
+    /// </para>
+    /// <para>
+    /// Note to Inheritors: This constructor calls the virtual method
+    /// <see cref="CreatePatternParser"/>. If you override this method be
+    /// aware that it will be called before your is called constructor.
+    /// </para>
+    /// <para>
+    /// As per the <see cref="IOptionHandler"/> contract the <see cref="ActivateOptions"/>
+    /// method must be called after the properties on this object have been
+    /// configured.
+    /// </para>
+    /// </remarks>
+    public PatternLayout() : this(DefaultConversionPattern)
+    {
+    }
 
-		/// <summary>
-		/// Constructs a PatternLayout using the supplied conversion pattern
-		/// </summary>
-		/// <param name="pattern">the pattern to use</param>
-		/// <remarks>
-		/// <para>
-		/// Note to Inheritors: This constructor calls the virtual method
-		/// <see cref="CreatePatternParser"/>. If you override this method be
-		/// aware that it will be called before your is called constructor.
-		/// </para>
-		/// <para>
-		/// When using this constructor the <see cref="ActivateOptions"/> method 
-		/// need not be called. This may not be the case when using a subclass.
-		/// </para>
-		/// </remarks>
-		public PatternLayout(string pattern) 
-		{
-			// By default we do not process the exception
-			IgnoresException = true;
+    /// <summary>
+    /// Constructs a PatternLayout using the supplied conversion pattern
+    /// </summary>
+    /// <param name="pattern">the pattern to use</param>
+    /// <remarks>
+    /// <para>
+    /// Note to Inheritors: This constructor calls the virtual method
+    /// <see cref="CreatePatternParser"/>. If you override this method be
+    /// aware that it will be called before your is called constructor.
+    /// </para>
+    /// <para>
+    /// When using this constructor the <see cref="ActivateOptions"/> method 
+    /// need not be called. This may not be the case when using a subclass.
+    /// </para>
+    /// </remarks>
+    public PatternLayout(string pattern)
+    {
+      // By default we do not process the exception
+      IgnoresException = true;
 
-			m_pattern = pattern;
-			if (m_pattern == null)
-			{
-				m_pattern = DefaultConversionPattern;
-			}
+      m_pattern = pattern;
+      if (m_pattern == null)
+      {
+        m_pattern = DefaultConversionPattern;
+      }
 
-			ActivateOptions();
-		}
+      ActivateOptions();
+    }
 
-		#endregion
-  
-		/// <summary>
-		/// The pattern formatting string
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <b>ConversionPattern</b> option. This is the string which
-		/// controls formatting and consists of a mix of literal content and
-		/// conversion specifiers.
-		/// </para>
-		/// </remarks>
-		public string ConversionPattern
-		{
-			get { return m_pattern;	}
-			set { m_pattern = value; }
-		}
+    #endregion
 
-		/// <summary>
-		/// Create the pattern parser instance
-		/// </summary>
-		/// <param name="pattern">the pattern to parse</param>
-		/// <returns>The <see cref="PatternParser"/> that will format the event</returns>
-		/// <remarks>
-		/// <para>
-		/// Creates the <see cref="PatternParser"/> used to parse the conversion string. Sets the
-		/// global and instance rules on the <see cref="PatternParser"/>.
-		/// </para>
-		/// </remarks>
-		protected virtual PatternParser CreatePatternParser(string pattern) 
-		{
-			PatternParser patternParser = new PatternParser(pattern);
+    /// <summary>
+    /// The pattern formatting string
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <b>ConversionPattern</b> option. This is the string which
+    /// controls formatting and consists of a mix of literal content and
+    /// conversion specifiers.
+    /// </para>
+    /// </remarks>
+    public string ConversionPattern
+    {
+      get { return m_pattern; }
+      set { m_pattern = value; }
+    }
 
-			// Add all the builtin patterns
-			foreach(DictionaryEntry entry in s_globalRulesRegistry)
-			{
-                ConverterInfo converterInfo = new ConverterInfo();
-                converterInfo.Name = (string)entry.Key;
-                converterInfo.Type = (Type)entry.Value;
-                patternParser.PatternConverters[entry.Key] = converterInfo;
-			}
-			// Add the instance patterns
-			foreach(DictionaryEntry entry in m_instanceRulesRegistry)
-			{
-				patternParser.PatternConverters[entry.Key] = entry.Value;
-			}
+    /// <summary>
+    /// Create the pattern parser instance
+    /// </summary>
+    /// <param name="pattern">the pattern to parse</param>
+    /// <returns>The <see cref="PatternParser"/> that will format the event</returns>
+    /// <remarks>
+    /// <para>
+    /// Creates the <see cref="PatternParser"/> used to parse the conversion string. Sets the
+    /// global and instance rules on the <see cref="PatternParser"/>.
+    /// </para>
+    /// </remarks>
+    protected virtual PatternParser CreatePatternParser(string pattern)
+    {
+      PatternParser patternParser = new PatternParser(pattern);
 
-			return patternParser;
-		}
-  
-		#region Implementation of IOptionHandler
+      // Add all the builtin patterns
+      foreach (DictionaryEntry entry in s_globalRulesRegistry)
+      {
+        ConverterInfo converterInfo = new ConverterInfo();
+        converterInfo.Name = (string)entry.Key;
+        converterInfo.Type = (Type)entry.Value;
+        patternParser.PatternConverters[entry.Key] = converterInfo;
+      }
+      // Add the instance patterns
+      foreach (DictionaryEntry entry in m_instanceRulesRegistry)
+      {
+        patternParser.PatternConverters[entry.Key] = entry.Value;
+      }
 
-		/// <summary>
-		/// Initialize layout options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			m_head = CreatePatternParser(m_pattern).Parse();
+      return patternParser;
+    }
 
-			PatternConverter curConverter = m_head;
-			while(curConverter != null)
-			{
-				PatternLayoutConverter layoutConverter = curConverter as PatternLayoutConverter;
-				if (layoutConverter != null)
-				{
-					if (!layoutConverter.IgnoresException)
-					{
-						// Found converter that handles the exception
-						this.IgnoresException = false;
+    #region Implementation of IOptionHandler
 
-						break;
-					}
-				}
-				curConverter = curConverter.Next;
-			}
-		}
+    /// <summary>
+    /// Initialize layout options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      m_head = CreatePatternParser(m_pattern).Parse();
 
-		#endregion
+      PatternConverter curConverter = m_head;
+      while (curConverter != null)
+      {
+        PatternLayoutConverter layoutConverter = curConverter as PatternLayoutConverter;
+        if (layoutConverter != null)
+        {
+          if (!layoutConverter.IgnoresException)
+          {
+            // Found converter that handles the exception
+            this.IgnoresException = false;
 
-		#region Override implementation of LayoutSkeleton
+            break;
+          }
+        }
+        curConverter = curConverter.Next;
+      }
+    }
 
-		/// <summary>
-		/// Produces a formatted string as specified by the conversion pattern.
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <remarks>
-		/// <para>
-		/// Parse the <see cref="LoggingEvent"/> using the patter format
-		/// specified in the <see cref="ConversionPattern"/> property.
-		/// </para>
-		/// </remarks>
-		public override void Format(TextWriter writer, LoggingEvent loggingEvent) 
-		{
-			if (writer == null)
-			{
-				throw new ArgumentNullException("writer");
-			}
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    #endregion
 
-			PatternConverter c = m_head;
+    #region Override implementation of LayoutSkeleton
 
-			// loop through the chain of pattern converters
-			while(c != null) 
-			{
-				c.Format(writer, loggingEvent);
-				c = c.Next;
-			}
-		}
+    /// <summary>
+    /// Produces a formatted string as specified by the conversion pattern.
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <remarks>
+    /// <para>
+    /// Parse the <see cref="LoggingEvent"/> using the patter format
+    /// specified in the <see cref="ConversionPattern"/> property.
+    /// </para>
+    /// </remarks>
+    public override void Format(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (writer == null)
+      {
+        throw new ArgumentNullException("writer");
+      }
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-		#endregion
+      PatternConverter c = m_head;
 
-		/// <summary>
-		/// Add a converter to this PatternLayout
-		/// </summary>
-		/// <param name="converterInfo">the converter info</param>
-		/// <remarks>
-		/// <para>
-		/// This version of the method is used by the configurator.
-		/// Programmatic users should use the alternative <see cref="M:AddConverter(string,Type)"/> method.
-		/// </para>
-		/// </remarks>
-		public void AddConverter(ConverterInfo converterInfo)
-		{
-            if (converterInfo == null) throw new ArgumentNullException("converterInfo");
+      // loop through the chain of pattern converters
+      while (c != null)
+      {
+        c.Format(writer, loggingEvent);
+        c = c.Next;
+      }
+    }
 
-            if (!typeof(PatternConverter).IsAssignableFrom(converterInfo.Type))
-            {
-                throw new ArgumentException("The converter type specified [" + converterInfo.Type + "] must be a subclass of log4net.Util.PatternConverter", "converterInfo");
-            }
-            m_instanceRulesRegistry[converterInfo.Name] = converterInfo;
-		}
+    #endregion
 
-		/// <summary>
-		/// Add a converter to this PatternLayout
-		/// </summary>
-		/// <param name="name">the name of the conversion pattern for this converter</param>
-		/// <param name="type">the type of the converter</param>
-		/// <remarks>
-		/// <para>
-		/// Add a named pattern converter to this instance. This
-		/// converter will be used in the formatting of the event.
-		/// This method must be called before <see cref="ActivateOptions"/>.
-		/// </para>
-		/// <para>
-		/// The <paramref name="type"/> specified must extend the 
-		/// <see cref="PatternConverter"/> type.
-		/// </para>
-		/// </remarks>
-		public void AddConverter(string name, Type type)
-		{
-            if (name == null) throw new ArgumentNullException("name");
-            if (type == null) throw new ArgumentNullException("type");
+    /// <summary>
+    /// Add a converter to this PatternLayout
+    /// </summary>
+    /// <param name="converterInfo">the converter info</param>
+    /// <remarks>
+    /// <para>
+    /// This version of the method is used by the configurator.
+    /// Programmatic users should use the alternative <see cref="M:AddConverter(string,Type)"/> method.
+    /// </para>
+    /// </remarks>
+    public void AddConverter(ConverterInfo converterInfo)
+    {
+      if (converterInfo == null) throw new ArgumentNullException("converterInfo");
 
-            ConverterInfo converterInfo = new ConverterInfo();
-            converterInfo.Name = name;
-            converterInfo.Type = type;
+      if (!typeof(PatternConverter).IsAssignableFrom(converterInfo.Type))
+      {
+        throw new ArgumentException("The converter type specified [" + converterInfo.Type + "] must be a subclass of log4net.Util.PatternConverter", "converterInfo");
+      }
+      m_instanceRulesRegistry[converterInfo.Name] = converterInfo;
+    }
 
-            AddConverter(converterInfo);
-		}
-	}
+    /// <summary>
+    /// Add a converter to this PatternLayout
+    /// </summary>
+    /// <param name="name">the name of the conversion pattern for this converter</param>
+    /// <param name="type">the type of the converter</param>
+    /// <remarks>
+    /// <para>
+    /// Add a named pattern converter to this instance. This
+    /// converter will be used in the formatting of the event.
+    /// This method must be called before <see cref="ActivateOptions"/>.
+    /// </para>
+    /// <para>
+    /// The <paramref name="type"/> specified must extend the 
+    /// <see cref="PatternConverter"/> type.
+    /// </para>
+    /// </remarks>
+    public void AddConverter(string name, Type type)
+    {
+      if (name == null) throw new ArgumentNullException("name");
+      if (type == null) throw new ArgumentNullException("type");
+
+      ConverterInfo converterInfo = new ConverterInfo();
+      converterInfo.Name = name;
+      converterInfo.Type = type;
+
+      AddConverter(converterInfo);
+    }
+  }
 }
diff --git a/src/log4net/Layout/RawLayoutConverter.cs b/src/log4net/Layout/RawLayoutConverter.cs
index 1a210e6..905d684 100644
--- a/src/log4net/Layout/RawLayoutConverter.cs
+++ b/src/log4net/Layout/RawLayoutConverter.cs
@@ -23,64 +23,64 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Type converter for the <see cref="IRawLayout"/> interface
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Used to convert objects to the <see cref="IRawLayout"/> interface.
-	/// Supports converting from the <see cref="ILayout"/> interface to
-	/// the <see cref="IRawLayout"/> interface using the <see cref="Layout2RawLayoutAdapter"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class RawLayoutConverter : IConvertFrom
-	{
-		#region Override Implementation of IRawLayout
+  /// <summary>
+  /// Type converter for the <see cref="IRawLayout"/> interface
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Used to convert objects to the <see cref="IRawLayout"/> interface.
+  /// Supports converting from the <see cref="ILayout"/> interface to
+  /// the <see cref="IRawLayout"/> interface using the <see cref="Layout2RawLayoutAdapter"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class RawLayoutConverter : IConvertFrom
+  {
+    #region Override Implementation of IRawLayout
 
-		/// <summary>
-		/// Can the sourceType be converted to an <see cref="IRawLayout"/>
-		/// </summary>
-		/// <param name="sourceType">the source to be to be converted</param>
-		/// <returns><c>true</c> if the source type can be converted to <see cref="IRawLayout"/></returns>
-		/// <remarks>
-		/// <para>
-		/// Test if the <paramref name="sourceType"/> can be converted to a
-		/// <see cref="IRawLayout"/>. Only <see cref="ILayout"/> is supported
-		/// as the <paramref name="sourceType"/>.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(Type sourceType) 
-		{
-			// Accept an ILayout object
-			return (typeof(ILayout).IsAssignableFrom(sourceType));
-		}
+    /// <summary>
+    /// Can the sourceType be converted to an <see cref="IRawLayout"/>
+    /// </summary>
+    /// <param name="sourceType">the source to be to be converted</param>
+    /// <returns><c>true</c> if the source type can be converted to <see cref="IRawLayout"/></returns>
+    /// <remarks>
+    /// <para>
+    /// Test if the <paramref name="sourceType"/> can be converted to a
+    /// <see cref="IRawLayout"/>. Only <see cref="ILayout"/> is supported
+    /// as the <paramref name="sourceType"/>.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(Type sourceType)
+    {
+      // Accept an ILayout object
+      return (typeof(ILayout).IsAssignableFrom(sourceType));
+    }
 
-		/// <summary>
-		/// Convert the value to a <see cref="IRawLayout"/> object
-		/// </summary>
-		/// <param name="source">the value to convert</param>
-		/// <returns>the <see cref="IRawLayout"/> object</returns>
-		/// <remarks>
-		/// <para>
-		/// Convert the <paramref name="source"/> object to a 
-		/// <see cref="IRawLayout"/> object. If the <paramref name="source"/> object
-		/// is a <see cref="ILayout"/> then the <see cref="Layout2RawLayoutAdapter"/>
-		/// is used to adapt between the two interfaces, otherwise an
-		/// exception is thrown.
-		/// </para>
-		/// </remarks>
-		public object ConvertFrom(object source) 
-		{
-			ILayout layout = source as ILayout;
-			if (layout != null) 
-			{
-				return new Layout2RawLayoutAdapter(layout);
-			}
-			throw ConversionNotSupportedException.Create(typeof(IRawLayout), source);
-		}
+    /// <summary>
+    /// Convert the value to a <see cref="IRawLayout"/> object
+    /// </summary>
+    /// <param name="source">the value to convert</param>
+    /// <returns>the <see cref="IRawLayout"/> object</returns>
+    /// <remarks>
+    /// <para>
+    /// Convert the <paramref name="source"/> object to a 
+    /// <see cref="IRawLayout"/> object. If the <paramref name="source"/> object
+    /// is a <see cref="ILayout"/> then the <see cref="Layout2RawLayoutAdapter"/>
+    /// is used to adapt between the two interfaces, otherwise an
+    /// exception is thrown.
+    /// </para>
+    /// </remarks>
+    public object ConvertFrom(object source)
+    {
+      ILayout layout = source as ILayout;
+      if (layout != null)
+      {
+        return new Layout2RawLayoutAdapter(layout);
+      }
+      throw ConversionNotSupportedException.Create(typeof(IRawLayout), source);
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/RawPropertyLayout.cs b/src/log4net/Layout/RawPropertyLayout.cs
index f50dda2..60b2c6b 100644
--- a/src/log4net/Layout/RawPropertyLayout.cs
+++ b/src/log4net/Layout/RawPropertyLayout.cs
@@ -25,66 +25,66 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Extract the value of a property from the <see cref="LoggingEvent"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Extract the value of a property from the <see cref="LoggingEvent"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class RawPropertyLayout : IRawLayout
-	{
-		#region Constructors
+  /// <summary>
+  /// Extract the value of a property from the <see cref="LoggingEvent"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Extract the value of a property from the <see cref="LoggingEvent"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class RawPropertyLayout : IRawLayout
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Constructs a RawPropertyLayout
-		/// </summary>
-		public RawPropertyLayout()
-		{
-		}
+    /// <summary>
+    /// Constructs a RawPropertyLayout
+    /// </summary>
+    public RawPropertyLayout()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		private string m_key;
+    private string m_key;
 
-		/// <summary>
-		/// The name of the value to lookup in the LoggingEvent Properties collection.
-		/// </summary>
-		/// <value>
-		/// Value to lookup in the LoggingEvent Properties collection
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// String name of the property to lookup in the <see cref="LoggingEvent"/>.
-		/// </para>
-		/// </remarks>
-		public string Key
-		{
-			get { return m_key; }
-			set { m_key = value; }
-		}
-  
-		#region Implementation of IRawLayout
+    /// <summary>
+    /// The name of the value to lookup in the LoggingEvent Properties collection.
+    /// </summary>
+    /// <value>
+    /// Value to lookup in the LoggingEvent Properties collection
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// String name of the property to lookup in the <see cref="LoggingEvent"/>.
+    /// </para>
+    /// </remarks>
+    public string Key
+    {
+      get { return m_key; }
+      set { m_key = value; }
+    }
 
-		/// <summary>
-		/// Lookup the property for <see cref="Key"/>
-		/// </summary>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <returns>returns property value</returns>
-		/// <remarks>
-		/// <para>
-		/// Looks up and returns the object value of the property
-		/// named <see cref="Key"/>. If there is no property defined
-		/// with than name then <c>null</c> will be returned.
-		/// </para>
-		/// </remarks>
-		public virtual object Format(LoggingEvent loggingEvent)
-		{
-			return loggingEvent.LookupProperty(m_key);
-		}
+    #region Implementation of IRawLayout
 
-		#endregion
-	}
+    /// <summary>
+    /// Lookup the property for <see cref="Key"/>
+    /// </summary>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <returns>returns property value</returns>
+    /// <remarks>
+    /// <para>
+    /// Looks up and returns the object value of the property
+    /// named <see cref="Key"/>. If there is no property defined
+    /// with than name then <c>null</c> will be returned.
+    /// </para>
+    /// </remarks>
+    public virtual object Format(LoggingEvent loggingEvent)
+    {
+      return loggingEvent.LookupProperty(m_key);
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/RawTimeStampLayout.cs b/src/log4net/Layout/RawTimeStampLayout.cs
index 66a4dec..e8921dd 100644
--- a/src/log4net/Layout/RawTimeStampLayout.cs
+++ b/src/log4net/Layout/RawTimeStampLayout.cs
@@ -25,50 +25,50 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Extract the date from the <see cref="LoggingEvent"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Extract the date from the <see cref="LoggingEvent"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class RawTimeStampLayout : IRawLayout
-	{
-		#region Constructors
+  /// <summary>
+  /// Extract the date from the <see cref="LoggingEvent"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Extract the date from the <see cref="LoggingEvent"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class RawTimeStampLayout : IRawLayout
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Constructs a RawTimeStampLayout
-		/// </summary>
-		public RawTimeStampLayout()
-		{
-		}
+    /// <summary>
+    /// Constructs a RawTimeStampLayout
+    /// </summary>
+    public RawTimeStampLayout()
+    {
+    }
 
-		#endregion
-  
-		#region Implementation of IRawLayout
+    #endregion
 
-		/// <summary>
-		/// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
-		/// </summary>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <returns>returns the time stamp</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
-		/// </para>
-		/// <para>
-		/// The time stamp is in local time. To format the time stamp
-		/// in universal time use <see cref="RawUtcTimeStampLayout"/>.
-		/// </para>
-		/// </remarks>
-		public virtual object Format(LoggingEvent loggingEvent)
-		{
-			return loggingEvent.TimeStamp;
-		}
+    #region Implementation of IRawLayout
 
-		#endregion
-	}
+    /// <summary>
+    /// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
+    /// </summary>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <returns>returns the time stamp</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
+    /// </para>
+    /// <para>
+    /// The time stamp is in local time. To format the time stamp
+    /// in universal time use <see cref="RawUtcTimeStampLayout"/>.
+    /// </para>
+    /// </remarks>
+    public virtual object Format(LoggingEvent loggingEvent)
+    {
+      return loggingEvent.TimeStamp;
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/RawUtcTimeStampLayout.cs b/src/log4net/Layout/RawUtcTimeStampLayout.cs
index 2c232ae..7694140 100644
--- a/src/log4net/Layout/RawUtcTimeStampLayout.cs
+++ b/src/log4net/Layout/RawUtcTimeStampLayout.cs
@@ -25,50 +25,50 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Extract the date from the <see cref="LoggingEvent"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Extract the date from the <see cref="LoggingEvent"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class RawUtcTimeStampLayout : IRawLayout
-	{
-		#region Constructors
+  /// <summary>
+  /// Extract the date from the <see cref="LoggingEvent"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Extract the date from the <see cref="LoggingEvent"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class RawUtcTimeStampLayout : IRawLayout
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Constructs a RawUtcTimeStampLayout
-		/// </summary>
-		public RawUtcTimeStampLayout()
-		{
-		}
+    /// <summary>
+    /// Constructs a RawUtcTimeStampLayout
+    /// </summary>
+    public RawUtcTimeStampLayout()
+    {
+    }
 
-		#endregion
-  
-		#region Implementation of IRawLayout
+    #endregion
 
-		/// <summary>
-		/// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
-		/// </summary>
-		/// <param name="loggingEvent">The event to format</param>
-		/// <returns>returns the time stamp</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
-		/// </para>
-		/// <para>
-		/// The time stamp is in universal time. To format the time stamp
-		/// in local time use <see cref="RawTimeStampLayout"/>.
-		/// </para>
-		/// </remarks>
-		public virtual object Format(LoggingEvent loggingEvent)
-		{
-			return loggingEvent.TimeStampUtc;
-		}
+    #region Implementation of IRawLayout
 
-		#endregion
-	}
+    /// <summary>
+    /// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
+    /// </summary>
+    /// <param name="loggingEvent">The event to format</param>
+    /// <returns>returns the time stamp</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="LoggingEvent.TimeStamp"/> as a <see cref="DateTime"/>.
+    /// </para>
+    /// <para>
+    /// The time stamp is in universal time. To format the time stamp
+    /// in local time use <see cref="RawTimeStampLayout"/>.
+    /// </para>
+    /// </remarks>
+    public virtual object Format(LoggingEvent loggingEvent)
+    {
+      return loggingEvent.TimeStampUtc;
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/SimpleLayout.cs b/src/log4net/Layout/SimpleLayout.cs
index 5efe0d0..99f1138 100644
--- a/src/log4net/Layout/SimpleLayout.cs
+++ b/src/log4net/Layout/SimpleLayout.cs
@@ -26,86 +26,86 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// A very simple layout
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// SimpleLayout consists of the level of the log statement,
-	/// followed by " - " and then the log message itself. For example,
-	/// <code>
-	/// DEBUG - Hello world
-	/// </code>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class SimpleLayout : LayoutSkeleton
-	{
-		#region Constructors
+  /// <summary>
+  /// A very simple layout
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// SimpleLayout consists of the level of the log statement,
+  /// followed by " - " and then the log message itself. For example,
+  /// <code>
+  /// DEBUG - Hello world
+  /// </code>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class SimpleLayout : LayoutSkeleton
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Constructs a SimpleLayout
-		/// </summary>
-		public SimpleLayout()
-		{
-			IgnoresException = true;
-		}
+    /// <summary>
+    /// Constructs a SimpleLayout
+    /// </summary>
+    public SimpleLayout()
+    {
+      IgnoresException = true;
+    }
 
-		#endregion
-  
-		#region Implementation of IOptionHandler
+    #endregion
 
-		/// <summary>
-		/// Initialize layout options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			// nothing to do.
-		}
+    #region Implementation of IOptionHandler
 
-		#endregion
+    /// <summary>
+    /// Initialize layout options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      // nothing to do.
+    }
 
-		#region Override implementation of LayoutSkeleton
+    #endregion
 
-		/// <summary>
-		/// Produces a simple formatted output.
-		/// </summary>
-		/// <param name="loggingEvent">the event being logged</param>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <remarks>
-		/// <para>
-		/// Formats the event as the level of the even,
-		/// followed by " - " and then the log message itself. The
-		/// output is terminated by a newline.
-		/// </para>
-		/// </remarks>
-		public override void Format(TextWriter writer, LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    #region Override implementation of LayoutSkeleton
 
-			writer.Write(loggingEvent.Level.DisplayName);
-			writer.Write(" - ");
-			loggingEvent.WriteRenderedMessage(writer);
-			writer.WriteLine();
-		}
+    /// <summary>
+    /// Produces a simple formatted output.
+    /// </summary>
+    /// <param name="loggingEvent">the event being logged</param>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <remarks>
+    /// <para>
+    /// Formats the event as the level of the even,
+    /// followed by " - " and then the log message itself. The
+    /// output is terminated by a newline.
+    /// </para>
+    /// </remarks>
+    public override void Format(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-		#endregion
-	}
+      writer.Write(loggingEvent.Level.DisplayName);
+      writer.Write(" - ");
+      loggingEvent.WriteRenderedMessage(writer);
+      writer.WriteLine();
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Layout/XmlLayout.cs b/src/log4net/Layout/XmlLayout.cs
index 7c5c0c2..b30686a 100644
--- a/src/log4net/Layout/XmlLayout.cs
+++ b/src/log4net/Layout/XmlLayout.cs
@@ -26,362 +26,362 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Layout that formats the log events as XML elements.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The output of the <see cref="XmlLayout" /> consists of a series of 
-	/// log4net:event elements. It does not output a complete well-formed XML 
-	/// file. The output is designed to be included as an <em>external entity</em>
-	/// in a separate file to form a correct XML file.
-	/// </para>
-	/// <para>
-	/// For example, if <c>abc</c> is the name of the file where
-	/// the <see cref="XmlLayout" /> output goes, then a well-formed XML file would 
-	/// be:
-	/// </para>
-	/// <code lang="XML">
-	/// &lt;?xml version="1.0" ?&gt;
-	/// 
-	/// &lt;!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [&lt;!ENTITY data SYSTEM "abc"&gt;]&gt;
-	///
-	/// &lt;log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2&gt;
-	///     &amp;data;
-	/// &lt;/log4net:events&gt;
-	/// </code>
-	/// <para>
-	/// This approach enforces the independence of the <see cref="XmlLayout" /> 
-	/// and the appender where it is embedded.
-	/// </para>
-	/// <para>
-	/// The <c>version</c> attribute helps components to correctly
-	/// interpret output generated by <see cref="XmlLayout" />. The value of 
-	/// this attribute should be "1.2" for release 1.2 and later.
-	/// </para>
-	/// <para>
-	/// Alternatively the <c>Header</c> and <c>Footer</c> properties can be
-	/// configured to output the correct XML header, open tag and close tag.
-	/// When setting the <c>Header</c> and <c>Footer</c> properties it is essential
-	/// that the underlying data store not be appendable otherwise the data
-	/// will become invalid XML.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class XmlLayout : XmlLayoutBase
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Layout that formats the log events as XML elements.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The output of the <see cref="XmlLayout" /> consists of a series of 
+  /// log4net:event elements. It does not output a complete well-formed XML 
+  /// file. The output is designed to be included as an <em>external entity</em>
+  /// in a separate file to form a correct XML file.
+  /// </para>
+  /// <para>
+  /// For example, if <c>abc</c> is the name of the file where
+  /// the <see cref="XmlLayout" /> output goes, then a well-formed XML file would 
+  /// be:
+  /// </para>
+  /// <code lang="XML">
+  /// &lt;?xml version="1.0" ?&gt;
+  /// 
+  /// &lt;!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [&lt;!ENTITY data SYSTEM "abc"&gt;]&gt;
+  ///
+  /// &lt;log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2&gt;
+  ///     &amp;data;
+  /// &lt;/log4net:events&gt;
+  /// </code>
+  /// <para>
+  /// This approach enforces the independence of the <see cref="XmlLayout" /> 
+  /// and the appender where it is embedded.
+  /// </para>
+  /// <para>
+  /// The <c>version</c> attribute helps components to correctly
+  /// interpret output generated by <see cref="XmlLayout" />. The value of 
+  /// this attribute should be "1.2" for release 1.2 and later.
+  /// </para>
+  /// <para>
+  /// Alternatively the <c>Header</c> and <c>Footer</c> properties can be
+  /// configured to output the correct XML header, open tag and close tag.
+  /// When setting the <c>Header</c> and <c>Footer</c> properties it is essential
+  /// that the underlying data store not be appendable otherwise the data
+  /// will become invalid XML.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class XmlLayout : XmlLayoutBase
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructs an XmlLayout
-		/// </summary>
-		public XmlLayout() : base()
-		{
-		}
+    /// <summary>
+    /// Constructs an XmlLayout
+    /// </summary>
+    public XmlLayout() : base()
+    {
+    }
 
-		/// <summary>
-		/// Constructs an XmlLayout.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <b>LocationInfo</b> option takes a boolean value. By
-		/// default, it is set to false which means there will be no location
-		/// information output by this layout. If the the option is set to
-		/// true, then the file name and line number of the statement
-		/// at the origin of the log statement will be output. 
-		/// </para>
-		/// <para>
-		/// If you are embedding this layout within an SmtpAppender
-		/// then make sure to set the <b>LocationInfo</b> option of that 
-		/// appender as well.
-		/// </para>
-		/// </remarks>
-		public XmlLayout(bool locationInfo) :  base(locationInfo)
-		{
-		}
+    /// <summary>
+    /// Constructs an XmlLayout.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <b>LocationInfo</b> option takes a boolean value. By
+    /// default, it is set to false which means there will be no location
+    /// information output by this layout. If the the option is set to
+    /// true, then the file name and line number of the statement
+    /// at the origin of the log statement will be output. 
+    /// </para>
+    /// <para>
+    /// If you are embedding this layout within an SmtpAppender
+    /// then make sure to set the <b>LocationInfo</b> option of that 
+    /// appender as well.
+    /// </para>
+    /// </remarks>
+    public XmlLayout(bool locationInfo) : base(locationInfo)
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// The prefix to use for all element names
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The default prefix is <b>log4net</b>. Set this property
-		/// to change the prefix. If the prefix is set to an empty string
-		/// then no prefix will be written.
-		/// </para>
-		/// </remarks>
-		public string Prefix
-		{
-			get { return m_prefix; }
-			set { m_prefix = value; }
-		}
+    /// <summary>
+    /// The prefix to use for all element names
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The default prefix is <b>log4net</b>. Set this property
+    /// to change the prefix. If the prefix is set to an empty string
+    /// then no prefix will be written.
+    /// </para>
+    /// </remarks>
+    public string Prefix
+    {
+      get { return m_prefix; }
+      set { m_prefix = value; }
+    }
 
-		
-		/// <summary>
-		/// Set whether or not to base64 encode the message.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// By default the log message will be written as text to the xml
-		/// output. This can cause problems when the message contains binary
-		/// data. By setting this to true the contents of the message will be
-		/// base64 encoded. If this is set then invalid character replacement
-		/// (see <see cref="XmlLayoutBase.InvalidCharReplacement"/>) will not be performed
-		/// on the log message.
-		/// </para>
-		/// </remarks>
-		public bool Base64EncodeMessage
-		{
-			get {return m_base64Message;}
-			set {m_base64Message=value;}
-		}
 
-		/// <summary>
-		/// Set whether or not to base64 encode the property values.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// By default the properties will be written as text to the xml
-		/// output. This can cause problems when one or more properties contain
-		/// binary data. By setting this to true the values of the properties
-		/// will be base64 encoded. If this is set then invalid character replacement
-		/// (see <see cref="XmlLayoutBase.InvalidCharReplacement"/>) will not be performed
-		/// on the property values.
-		/// </para>
-		/// </remarks>
-		public bool Base64EncodeProperties
-		{
-			get {return m_base64Properties;}
-			set {m_base64Properties=value;}
-		}
+    /// <summary>
+    /// Set whether or not to base64 encode the message.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// By default the log message will be written as text to the xml
+    /// output. This can cause problems when the message contains binary
+    /// data. By setting this to true the contents of the message will be
+    /// base64 encoded. If this is set then invalid character replacement
+    /// (see <see cref="XmlLayoutBase.InvalidCharReplacement"/>) will not be performed
+    /// on the log message.
+    /// </para>
+    /// </remarks>
+    public bool Base64EncodeMessage
+    {
+      get { return m_base64Message; }
+      set { m_base64Message = value; }
+    }
 
-		#endregion Public Instance Properties
+    /// <summary>
+    /// Set whether or not to base64 encode the property values.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// By default the properties will be written as text to the xml
+    /// output. This can cause problems when one or more properties contain
+    /// binary data. By setting this to true the values of the properties
+    /// will be base64 encoded. If this is set then invalid character replacement
+    /// (see <see cref="XmlLayoutBase.InvalidCharReplacement"/>) will not be performed
+    /// on the property values.
+    /// </para>
+    /// </remarks>
+    public bool Base64EncodeProperties
+    {
+      get { return m_base64Properties; }
+      set { m_base64Properties = value; }
+    }
 
-		#region Implementation of IOptionHandler
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// Initialize layout options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// Builds a cache of the element names
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			base.ActivateOptions();
+    #region Implementation of IOptionHandler
 
-			// Cache the full element names including the prefix
-			if (m_prefix != null && m_prefix.Length > 0)
-			{
-				m_elmEvent = m_prefix + ":" + ELM_EVENT;
-				m_elmMessage = m_prefix + ":" + ELM_MESSAGE;
-				m_elmProperties = m_prefix + ":" + ELM_PROPERTIES;
-				m_elmData = m_prefix + ":" + ELM_DATA;
-				m_elmException = m_prefix + ":" + ELM_EXCEPTION;
-				m_elmLocation = m_prefix + ":" + ELM_LOCATION;
-			}
-		}
-		
-		#endregion Implementation of IOptionHandler
+    /// <summary>
+    /// Initialize layout options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// Builds a cache of the element names
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      base.ActivateOptions();
 
-		#region Override implementation of XMLLayoutBase
+      // Cache the full element names including the prefix
+      if (m_prefix != null && m_prefix.Length > 0)
+      {
+        m_elmEvent = m_prefix + ":" + ELM_EVENT;
+        m_elmMessage = m_prefix + ":" + ELM_MESSAGE;
+        m_elmProperties = m_prefix + ":" + ELM_PROPERTIES;
+        m_elmData = m_prefix + ":" + ELM_DATA;
+        m_elmException = m_prefix + ":" + ELM_EXCEPTION;
+        m_elmLocation = m_prefix + ":" + ELM_LOCATION;
+      }
+    }
 
-		/// <summary>
-		/// Does the actual writing of the XML.
-		/// </summary>
-		/// <param name="writer">The writer to use to output the event to.</param>
-		/// <param name="loggingEvent">The event to write.</param>
-		/// <remarks>
-		/// <para>
-		/// Override the base class <see cref="XmlLayoutBase.FormatXml"/> method
-		/// to write the <see cref="LoggingEvent"/> to the <see cref="XmlWriter"/>.
-		/// </para>
-		/// </remarks>
-		protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
-		{
-			#if NETSTANDARD
-			writer.WriteStartElement(m_prefix, ELM_EVENT, m_prefix);
-			// writer.WriteAttributeString("xmlns", "log4net", null, "http://logging.apache.org/log4net/schemas/log4net-events-1.2");
-			#else
-			writer.WriteStartElement(m_elmEvent);
-			#endif
-			writer.WriteAttributeString(ATTR_LOGGER, loggingEvent.LoggerName);
+    #endregion Implementation of IOptionHandler
+
+    #region Override implementation of XMLLayoutBase
+
+    /// <summary>
+    /// Does the actual writing of the XML.
+    /// </summary>
+    /// <param name="writer">The writer to use to output the event to.</param>
+    /// <param name="loggingEvent">The event to write.</param>
+    /// <remarks>
+    /// <para>
+    /// Override the base class <see cref="XmlLayoutBase.FormatXml"/> method
+    /// to write the <see cref="LoggingEvent"/> to the <see cref="XmlWriter"/>.
+    /// </para>
+    /// </remarks>
+    protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
+    {
+#if NETSTANDARD
+      writer.WriteStartElement(m_prefix, ELM_EVENT, m_prefix);
+      // writer.WriteAttributeString("xmlns", "log4net", null, "http://logging.apache.org/log4net/schemas/log4net-events-1.2");
+#else
+      writer.WriteStartElement(m_elmEvent);
+#endif
+      writer.WriteAttributeString(ATTR_LOGGER, loggingEvent.LoggerName);
 
 #if NET_2_0 || NETCF_2_0 || MONO_2_0 || NETSTANDARD
-			writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp, XmlDateTimeSerializationMode.Local));
+      writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp, XmlDateTimeSerializationMode.Local));
 #else
-			writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp));
+      writer.WriteAttributeString(ATTR_TIMESTAMP, XmlConvert.ToString(loggingEvent.TimeStamp));
 #endif
 
-			writer.WriteAttributeString(ATTR_LEVEL, loggingEvent.Level.DisplayName);
-			writer.WriteAttributeString(ATTR_THREAD, loggingEvent.ThreadName);
+      writer.WriteAttributeString(ATTR_LEVEL, loggingEvent.Level.DisplayName);
+      writer.WriteAttributeString(ATTR_THREAD, loggingEvent.ThreadName);
 
-			if (loggingEvent.Domain != null && loggingEvent.Domain.Length > 0)
-			{
-				writer.WriteAttributeString(ATTR_DOMAIN, loggingEvent.Domain);
-			}
-			if (loggingEvent.Identity != null && loggingEvent.Identity.Length > 0)
-			{
-				writer.WriteAttributeString(ATTR_IDENTITY, loggingEvent.Identity);
-			}
-			if (loggingEvent.UserName != null && loggingEvent.UserName.Length > 0)
-			{
-				writer.WriteAttributeString(ATTR_USERNAME, loggingEvent.UserName);
-			}
-    
-			// Append the message text
-			#if NETSTANDARD
-			writer.WriteStartElement(m_prefix, ELM_MESSAGE, m_prefix);
-			#else
-			writer.WriteStartElement(m_elmMessage);
-			#endif
-			if (!this.Base64EncodeMessage)
-			{
-				Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
-			}
-			else
-			{
-				byte[] messageBytes = Encoding.UTF8.GetBytes(loggingEvent.RenderedMessage);
-				string base64Message = Convert.ToBase64String(messageBytes, 0, messageBytes.Length);
-				Transform.WriteEscapedXmlString(writer, base64Message,this.InvalidCharReplacement);
-			}
-			writer.WriteEndElement();
+      if (loggingEvent.Domain != null && loggingEvent.Domain.Length > 0)
+      {
+        writer.WriteAttributeString(ATTR_DOMAIN, loggingEvent.Domain);
+      }
+      if (loggingEvent.Identity != null && loggingEvent.Identity.Length > 0)
+      {
+        writer.WriteAttributeString(ATTR_IDENTITY, loggingEvent.Identity);
+      }
+      if (loggingEvent.UserName != null && loggingEvent.UserName.Length > 0)
+      {
+        writer.WriteAttributeString(ATTR_USERNAME, loggingEvent.UserName);
+      }
 
-			PropertiesDictionary properties = loggingEvent.GetProperties();
+      // Append the message text
+#if NETSTANDARD
+      writer.WriteStartElement(m_prefix, ELM_MESSAGE, m_prefix);
+#else
+      writer.WriteStartElement(m_elmMessage);
+#endif
+      if (!this.Base64EncodeMessage)
+      {
+        Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
+      }
+      else
+      {
+        byte[] messageBytes = Encoding.UTF8.GetBytes(loggingEvent.RenderedMessage);
+        string base64Message = Convert.ToBase64String(messageBytes, 0, messageBytes.Length);
+        Transform.WriteEscapedXmlString(writer, base64Message, this.InvalidCharReplacement);
+      }
+      writer.WriteEndElement();
 
-			// Append the properties text
-			if (properties.Count > 0)
-			{
-				#if NETSTANDARD
-				writer.WriteStartElement(m_prefix, ELM_PROPERTIES, m_prefix);
-				#else
-				writer.WriteStartElement(m_elmProperties);
-				#endif
-				foreach(System.Collections.DictionaryEntry entry in properties)
-				{
-					#if NETSTANDARD
-					writer.WriteStartElement(m_prefix, ELM_DATA, m_prefix);
-					#else
-					writer.WriteStartElement(m_elmData);
-					#endif
-					writer.WriteAttributeString(ATTR_NAME, Transform.MaskXmlInvalidCharacters((string)entry.Key,this.InvalidCharReplacement));
+      PropertiesDictionary properties = loggingEvent.GetProperties();
 
-					// Use an ObjectRenderer to convert the object to a string
-					string valueStr =null;
-					if (!this.Base64EncodeProperties)
-					{
-						valueStr = Transform.MaskXmlInvalidCharacters(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value),this.InvalidCharReplacement);
-					}
-					else
-					{
-						byte[] propertyValueBytes = Encoding.UTF8.GetBytes(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value));
-						valueStr = Convert.ToBase64String(propertyValueBytes, 0, propertyValueBytes.Length);
-					}
-					writer.WriteAttributeString(ATTR_VALUE, valueStr);
+      // Append the properties text
+      if (properties.Count > 0)
+      {
+#if NETSTANDARD
+        writer.WriteStartElement(m_prefix, ELM_PROPERTIES, m_prefix);
+#else
+        writer.WriteStartElement(m_elmProperties);
+#endif
+        foreach (System.Collections.DictionaryEntry entry in properties)
+        {
+#if NETSTANDARD
+          writer.WriteStartElement(m_prefix, ELM_DATA, m_prefix);
+#else
+          writer.WriteStartElement(m_elmData);
+#endif
+          writer.WriteAttributeString(ATTR_NAME, Transform.MaskXmlInvalidCharacters((string)entry.Key, this.InvalidCharReplacement));
 
-					writer.WriteEndElement();
-				}
-				writer.WriteEndElement();
-			}
+          // Use an ObjectRenderer to convert the object to a string
+          string valueStr = null;
+          if (!this.Base64EncodeProperties)
+          {
+            valueStr = Transform.MaskXmlInvalidCharacters(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value), this.InvalidCharReplacement);
+          }
+          else
+          {
+            byte[] propertyValueBytes = Encoding.UTF8.GetBytes(loggingEvent.Repository.RendererMap.FindAndRender(entry.Value));
+            valueStr = Convert.ToBase64String(propertyValueBytes, 0, propertyValueBytes.Length);
+          }
+          writer.WriteAttributeString(ATTR_VALUE, valueStr);
 
-			string exceptionStr = loggingEvent.GetExceptionString();
-			if (exceptionStr != null && exceptionStr.Length > 0)
-			{
-				// Append the stack trace line
-				#if NETSTANDARD
-				writer.WriteStartElement(m_prefix, ELM_EXCEPTION, m_prefix);
-				#else
-				writer.WriteStartElement(m_elmException);
-				#endif
-				Transform.WriteEscapedXmlString(writer, exceptionStr,this.InvalidCharReplacement);
-				writer.WriteEndElement();
-			}
+          writer.WriteEndElement();
+        }
+        writer.WriteEndElement();
+      }
 
-			if (LocationInfo)
-			{ 
-				LocationInfo locationInfo = loggingEvent.LocationInformation;
+      string exceptionStr = loggingEvent.GetExceptionString();
+      if (exceptionStr != null && exceptionStr.Length > 0)
+      {
+        // Append the stack trace line
+#if NETSTANDARD
+        writer.WriteStartElement(m_prefix, ELM_EXCEPTION, m_prefix);
+#else
+        writer.WriteStartElement(m_elmException);
+#endif
+        Transform.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
+        writer.WriteEndElement();
+      }
 
-				#if NETSTANDARD
-				writer.WriteStartElement(m_prefix, ELM_LOCATION, m_prefix);
-				#else
-				writer.WriteStartElement(m_elmLocation);
-				#endif
-				writer.WriteAttributeString(ATTR_CLASS, locationInfo.ClassName);
-				writer.WriteAttributeString(ATTR_METHOD, locationInfo.MethodName);
-				writer.WriteAttributeString(ATTR_FILE, locationInfo.FileName);
-				writer.WriteAttributeString(ATTR_LINE, locationInfo.LineNumber);
-				writer.WriteEndElement();
-			}
+      if (LocationInfo)
+      {
+        LocationInfo locationInfo = loggingEvent.LocationInformation;
 
-			writer.WriteEndElement();
-		}
+#if NETSTANDARD
+        writer.WriteStartElement(m_prefix, ELM_LOCATION, m_prefix);
+#else
+        writer.WriteStartElement(m_elmLocation);
+#endif
+        writer.WriteAttributeString(ATTR_CLASS, locationInfo.ClassName);
+        writer.WriteAttributeString(ATTR_METHOD, locationInfo.MethodName);
+        writer.WriteAttributeString(ATTR_FILE, locationInfo.FileName);
+        writer.WriteAttributeString(ATTR_LINE, locationInfo.LineNumber);
+        writer.WriteEndElement();
+      }
 
-		#endregion Override implementation of XMLLayoutBase
+      writer.WriteEndElement();
+    }
 
-		#region Private Instance Fields
-  
-		/// <summary>
-		/// The prefix to use for all generated element names
-		/// </summary>
-		private string m_prefix = PREFIX;
+    #endregion Override implementation of XMLLayoutBase
 
-		private string m_elmEvent = ELM_EVENT;
-		private string m_elmMessage = ELM_MESSAGE;
-		private string m_elmData = ELM_DATA;
-		private string m_elmProperties = ELM_PROPERTIES;
-		private string m_elmException = ELM_EXCEPTION;
-		private string m_elmLocation = ELM_LOCATION;
+    #region Private Instance Fields
 
-		private bool m_base64Message=false;
-		private bool m_base64Properties=false;
+    /// <summary>
+    /// The prefix to use for all generated element names
+    /// </summary>
+    private string m_prefix = PREFIX;
 
-		#endregion Private Instance Fields
+    private string m_elmEvent = ELM_EVENT;
+    private string m_elmMessage = ELM_MESSAGE;
+    private string m_elmData = ELM_DATA;
+    private string m_elmProperties = ELM_PROPERTIES;
+    private string m_elmException = ELM_EXCEPTION;
+    private string m_elmLocation = ELM_LOCATION;
 
-		#region Private Static Fields
+    private bool m_base64Message = false;
+    private bool m_base64Properties = false;
 
-		private const string PREFIX = "log4net";
+    #endregion Private Instance Fields
 
-		private const string ELM_EVENT = "event";
-		private const string ELM_MESSAGE = "message";
-		private const string ELM_PROPERTIES = "properties";
-		private const string ELM_GLOBAL_PROPERTIES = "global-properties";
-		private const string ELM_DATA = "data";
-		private const string ELM_EXCEPTION = "exception";
-		private const string ELM_LOCATION = "locationInfo";
+    #region Private Static Fields
 
-		private const string ATTR_LOGGER = "logger";
-		private const string ATTR_TIMESTAMP = "timestamp";
-		private const string ATTR_LEVEL = "level";
-		private const string ATTR_THREAD = "thread";
-		private const string ATTR_DOMAIN = "domain";
-		private const string ATTR_IDENTITY = "identity";
-		private const string ATTR_USERNAME = "username";
-		private const string ATTR_CLASS = "class";
-		private const string ATTR_METHOD = "method";
-		private const string ATTR_FILE = "file";
-		private const string ATTR_LINE = "line";
-		private const string ATTR_NAME = "name";
-		private const string ATTR_VALUE = "value";
+    private const string PREFIX = "log4net";
+
+    private const string ELM_EVENT = "event";
+    private const string ELM_MESSAGE = "message";
+    private const string ELM_PROPERTIES = "properties";
+    private const string ELM_GLOBAL_PROPERTIES = "global-properties";
+    private const string ELM_DATA = "data";
+    private const string ELM_EXCEPTION = "exception";
+    private const string ELM_LOCATION = "locationInfo";
+
+    private const string ATTR_LOGGER = "logger";
+    private const string ATTR_TIMESTAMP = "timestamp";
+    private const string ATTR_LEVEL = "level";
+    private const string ATTR_THREAD = "thread";
+    private const string ATTR_DOMAIN = "domain";
+    private const string ATTR_IDENTITY = "identity";
+    private const string ATTR_USERNAME = "username";
+    private const string ATTR_CLASS = "class";
+    private const string ATTR_METHOD = "method";
+    private const string ATTR_FILE = "file";
+    private const string ATTR_LINE = "line";
+    private const string ATTR_NAME = "name";
+    private const string ATTR_VALUE = "value";
 
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
diff --git a/src/log4net/Layout/XmlLayoutBase.cs b/src/log4net/Layout/XmlLayoutBase.cs
index 2f35f8b..eb57228 100644
--- a/src/log4net/Layout/XmlLayoutBase.cs
+++ b/src/log4net/Layout/XmlLayoutBase.cs
@@ -27,229 +27,229 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Layout that formats the log events as XML elements.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This is an abstract class that must be subclassed by an implementation 
-	/// to conform to a specific schema.
-	/// </para>
-	/// <para>
-	/// Deriving classes must implement the <see cref="FormatXml"/> method.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class XmlLayoutBase : LayoutSkeleton
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Layout that formats the log events as XML elements.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This is an abstract class that must be subclassed by an implementation 
+  /// to conform to a specific schema.
+  /// </para>
+  /// <para>
+  /// Deriving classes must implement the <see cref="FormatXml"/> method.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class XmlLayoutBase : LayoutSkeleton
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Protected constructor to support subclasses
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="XmlLayoutBase" /> class
-		/// with no location info.
-		/// </para>
-		/// </remarks>
-		protected XmlLayoutBase() : this(false)
-		{
-			IgnoresException = false;
-		}
+    /// <summary>
+    /// Protected constructor to support subclasses
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="XmlLayoutBase" /> class
+    /// with no location info.
+    /// </para>
+    /// </remarks>
+    protected XmlLayoutBase() : this(false)
+    {
+      IgnoresException = false;
+    }
 
-		/// <summary>
-		/// Protected constructor to support subclasses
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <paramref name="locationInfo" /> parameter determines whether 
-		/// location information will be output by the layout. If 
-		/// <paramref name="locationInfo" /> is set to <c>true</c>, then the 
-		/// file name and line number of the statement at the origin of the log 
-		/// statement will be output. 
-		/// </para>
-		/// <para>
-		/// If you are embedding this layout within an SMTPAppender
-		/// then make sure to set the <b>LocationInfo</b> option of that 
-		/// appender as well.
-		/// </para>
-		/// </remarks>
-		protected XmlLayoutBase(bool locationInfo)
-		{
-			IgnoresException = false;
-			m_locationInfo = locationInfo;
-		}
+    /// <summary>
+    /// Protected constructor to support subclasses
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <paramref name="locationInfo" /> parameter determines whether 
+    /// location information will be output by the layout. If 
+    /// <paramref name="locationInfo" /> is set to <c>true</c>, then the 
+    /// file name and line number of the statement at the origin of the log 
+    /// statement will be output. 
+    /// </para>
+    /// <para>
+    /// If you are embedding this layout within an SMTPAppender
+    /// then make sure to set the <b>LocationInfo</b> option of that 
+    /// appender as well.
+    /// </para>
+    /// </remarks>
+    protected XmlLayoutBase(bool locationInfo)
+    {
+      IgnoresException = false;
+      m_locationInfo = locationInfo;
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets a value indicating whether to include location information in 
-		/// the XML events.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if location information should be included in the XML 
-		/// events; otherwise, <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// If <see cref="LocationInfo" /> is set to <c>true</c>, then the file 
-		/// name and line number of the statement at the origin of the log 
-		/// statement will be output. 
-		/// </para>
-		/// <para>
-		/// If you are embedding this layout within an <c>SMTPAppender</c>
-		/// then make sure to set the <b>LocationInfo</b> option of that 
-		/// appender as well.
-		/// </para>
-		/// </remarks>
-		public bool LocationInfo
-		{
-			get { return m_locationInfo; }
-			set { m_locationInfo = value; }
-		}
-		/// <summary>
-		/// The string to replace characters that can not be expressed in XML with.
-		/// <remarks>
-		/// <para>
-		/// Not all characters may be expressed in XML. This property contains the
-		/// string to replace those that can not with. This defaults to a ?. Set it
-		/// to the empty string to simply remove offending characters. For more
-		/// details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets
-		/// Character replacement will occur in  the log message, the property names 
-		/// and the property values.
-		/// </para>
-		/// </remarks>
-		/// </summary>
-		public string InvalidCharReplacement
-		{
-			get {return m_invalidCharReplacement;}
-			set {m_invalidCharReplacement=value;}
-		}
-		#endregion
+    /// <summary>
+    /// Gets a value indicating whether to include location information in 
+    /// the XML events.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if location information should be included in the XML 
+    /// events; otherwise, <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If <see cref="LocationInfo" /> is set to <c>true</c>, then the file 
+    /// name and line number of the statement at the origin of the log 
+    /// statement will be output. 
+    /// </para>
+    /// <para>
+    /// If you are embedding this layout within an <c>SMTPAppender</c>
+    /// then make sure to set the <b>LocationInfo</b> option of that 
+    /// appender as well.
+    /// </para>
+    /// </remarks>
+    public bool LocationInfo
+    {
+      get { return m_locationInfo; }
+      set { m_locationInfo = value; }
+    }
+    /// <summary>
+    /// The string to replace characters that can not be expressed in XML with.
+    /// <remarks>
+    /// <para>
+    /// Not all characters may be expressed in XML. This property contains the
+    /// string to replace those that can not with. This defaults to a ?. Set it
+    /// to the empty string to simply remove offending characters. For more
+    /// details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets
+    /// Character replacement will occur in  the log message, the property names 
+    /// and the property values.
+    /// </para>
+    /// </remarks>
+    /// </summary>
+    public string InvalidCharReplacement
+    {
+      get { return m_invalidCharReplacement; }
+      set { m_invalidCharReplacement = value; }
+    }
+    #endregion
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize layout options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public override void ActivateOptions() 
-		{
-			// nothing to do
-		}
+    /// <summary>
+    /// Initialize layout options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public override void ActivateOptions()
+    {
+      // nothing to do
+    }
 
-		#endregion Implementation of IOptionHandler
+    #endregion Implementation of IOptionHandler
 
-		#region Override implementation of LayoutSkeleton
+    #region Override implementation of LayoutSkeleton
 
-		/// <summary>
-		/// Gets the content type output by this layout. 
-		/// </summary>
-		/// <value>
-		/// As this is the XML layout, the value is always <c>"text/xml"</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// As this is the XML layout, the value is always <c>"text/xml"</c>.
-		/// </para>
-		/// </remarks>
-		public override string ContentType
-		{
-			get { return "text/xml"; }
-		}
+    /// <summary>
+    /// Gets the content type output by this layout. 
+    /// </summary>
+    /// <value>
+    /// As this is the XML layout, the value is always <c>"text/xml"</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// As this is the XML layout, the value is always <c>"text/xml"</c>.
+    /// </para>
+    /// </remarks>
+    public override string ContentType
+    {
+      get { return "text/xml"; }
+    }
 
-		/// <summary>
-		/// Produces a formatted string.
-		/// </summary>
-		/// <param name="loggingEvent">The event being logged.</param>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <remarks>
-		/// <para>
-		/// Format the <see cref="LoggingEvent"/> and write it to the <see cref="TextWriter"/>.
-		/// </para>
-		/// <para>
-		/// This method creates an <see cref="XmlTextWriter"/> that writes to the
-		/// <paramref name="writer"/>. The <see cref="XmlTextWriter"/> is passed 
-		/// to the <see cref="FormatXml"/> method. Subclasses should override the
-		/// <see cref="FormatXml"/> method rather than this method.
-		/// </para>
-		/// </remarks>
-		public override void Format(TextWriter writer, LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Produces a formatted string.
+    /// </summary>
+    /// <param name="loggingEvent">The event being logged.</param>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <remarks>
+    /// <para>
+    /// Format the <see cref="LoggingEvent"/> and write it to the <see cref="TextWriter"/>.
+    /// </para>
+    /// <para>
+    /// This method creates an <see cref="XmlTextWriter"/> that writes to the
+    /// <paramref name="writer"/>. The <see cref="XmlTextWriter"/> is passed 
+    /// to the <see cref="FormatXml"/> method. Subclasses should override the
+    /// <see cref="FormatXml"/> method rather than this method.
+    /// </para>
+    /// </remarks>
+    public override void Format(TextWriter writer, LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 #if NETSTANDARD
-			var settings = new XmlWriterSettings
-			{
-				Indent = false,
-				OmitXmlDeclaration = true
-			};
-			using var xmlWriter = XmlWriter.Create(new ProtectCloseTextWriter(writer), settings);
+      var settings = new XmlWriterSettings
+      {
+        Indent = false,
+        OmitXmlDeclaration = true
+      };
+      using var xmlWriter = XmlWriter.Create(new ProtectCloseTextWriter(writer), settings);
 #else
-			using XmlTextWriter xmlWriter = new XmlTextWriter(new ProtectCloseTextWriter(writer));
-			xmlWriter.Formatting = Formatting.None;
-			xmlWriter.Namespaces = false;
+      using XmlTextWriter xmlWriter = new XmlTextWriter(new ProtectCloseTextWriter(writer));
+      xmlWriter.Formatting = Formatting.None;
+      xmlWriter.Namespaces = false;
 #endif
-			// Write the event to the writer
-			FormatXml(xmlWriter, loggingEvent);
+      // Write the event to the writer
+      FormatXml(xmlWriter, loggingEvent);
 
-			xmlWriter.WriteWhitespace(SystemInfo.NewLine);
+      xmlWriter.WriteWhitespace(SystemInfo.NewLine);
 
-			// Close on xmlWriter will ensure xml is flushed
-			// the protected writer will ignore the actual close
-			// -> Dispose from using var will close & flush
-		}
+      // Close on xmlWriter will ensure xml is flushed
+      // the protected writer will ignore the actual close
+      // -> Dispose from using var will close & flush
+    }
 
-		#endregion Override implementation of LayoutSkeleton
+    #endregion Override implementation of LayoutSkeleton
 
-		#region Protected Instance Methods
+    #region Protected Instance Methods
 
-		/// <summary>
-		/// Does the actual writing of the XML.
-		/// </summary>
-		/// <param name="writer">The writer to use to output the event to.</param>
-		/// <param name="loggingEvent">The event to write.</param>
-		/// <remarks>
-		/// <para>
-		/// Subclasses should override this method to format
-		/// the <see cref="LoggingEvent"/> as XML.
-		/// </para>
-		/// </remarks>
-		protected abstract void FormatXml(XmlWriter writer, LoggingEvent loggingEvent);
+    /// <summary>
+    /// Does the actual writing of the XML.
+    /// </summary>
+    /// <param name="writer">The writer to use to output the event to.</param>
+    /// <param name="loggingEvent">The event to write.</param>
+    /// <remarks>
+    /// <para>
+    /// Subclasses should override this method to format
+    /// the <see cref="LoggingEvent"/> as XML.
+    /// </para>
+    /// </remarks>
+    protected abstract void FormatXml(XmlWriter writer, LoggingEvent loggingEvent);
 
-		#endregion Protected Instance Methods
+    #endregion Protected Instance Methods
 
-		#region Private Instance Fields
-  
-		/// <summary>
-		/// Flag to indicate if location information should be included in
-		/// the XML events.
-		/// </summary>
-		private bool m_locationInfo = false;
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The string to replace invalid chars with
-		/// </summary>
-		private string m_invalidCharReplacement="?";
+    /// <summary>
+    /// Flag to indicate if location information should be included in
+    /// the XML events.
+    /// </summary>
+    private bool m_locationInfo = false;
 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// The string to replace invalid chars with
+    /// </summary>
+    private string m_invalidCharReplacement = "?";
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs
index d5ac73f..448b145 100644
--- a/src/log4net/Layout/XmlLayoutSchemaLog4j.cs
+++ b/src/log4net/Layout/XmlLayoutSchemaLog4j.cs
@@ -27,83 +27,83 @@
 
 namespace log4net.Layout
 {
-	/// <summary>
-	/// Layout that formats the log events as XML elements compatible with the log4j schema
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Formats the log events according to the http://logging.apache.org/log4j schema.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class XmlLayoutSchemaLog4j : XmlLayoutBase
-	{
-		#region Static Members
+  /// <summary>
+  /// Layout that formats the log events as XML elements compatible with the log4j schema
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Formats the log events according to the http://logging.apache.org/log4j schema.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class XmlLayoutSchemaLog4j : XmlLayoutBase
+  {
+    #region Static Members
 
-		/// <summary>
-		/// The 1st of January 1970 in UTC
-		/// </summary>
-		private static readonly DateTime s_date1970 = new DateTime(1970, 1, 1);
+    /// <summary>
+    /// The 1st of January 1970 in UTC
+    /// </summary>
+    private static readonly DateTime s_date1970 = new DateTime(1970, 1, 1);
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Constructs an XMLLayoutSchemaLog4j
-		/// </summary>
-		public XmlLayoutSchemaLog4j() : base()
-		{
-		}
+    /// <summary>
+    /// Constructs an XMLLayoutSchemaLog4j
+    /// </summary>
+    public XmlLayoutSchemaLog4j() : base()
+    {
+    }
 
-		/// <summary>
-		/// Constructs an XMLLayoutSchemaLog4j.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <b>LocationInfo</b> option takes a boolean value. By
-		/// default, it is set to false which means there will be no location
-		/// information output by this layout. If the the option is set to
-		/// true, then the file name and line number of the statement
-		/// at the origin of the log statement will be output. 
-		/// </para>
-		/// <para>
-		/// If you are embedding this layout within an SMTPAppender
-		/// then make sure to set the <b>LocationInfo</b> option of that 
-		/// appender as well.
-		/// </para>
-		/// </remarks>
-		public XmlLayoutSchemaLog4j(bool locationInfo) :  base(locationInfo)
-		{
-		}
+    /// <summary>
+    /// Constructs an XMLLayoutSchemaLog4j.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <b>LocationInfo</b> option takes a boolean value. By
+    /// default, it is set to false which means there will be no location
+    /// information output by this layout. If the the option is set to
+    /// true, then the file name and line number of the statement
+    /// at the origin of the log statement will be output. 
+    /// </para>
+    /// <para>
+    /// If you are embedding this layout within an SMTPAppender
+    /// then make sure to set the <b>LocationInfo</b> option of that 
+    /// appender as well.
+    /// </para>
+    /// </remarks>
+    public XmlLayoutSchemaLog4j(bool locationInfo) : base(locationInfo)
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Public Properties
+    #region Public Properties
 
-		/// <summary>
-		/// The version of the log4j schema to use.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Only version 1.2 of the log4j schema is supported.
-		/// </para>
-		/// </remarks>
-		public string Version
-		{
-			get { return "1.2"; }
-			set 
-			{ 
-				if (value != "1.2")
-				{
-					throw new ArgumentException("Only version 1.2 of the log4j schema is currently supported");
-				}
-			}
-		}
+    /// <summary>
+    /// The version of the log4j schema to use.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Only version 1.2 of the log4j schema is supported.
+    /// </para>
+    /// </remarks>
+    public string Version
+    {
+      get { return "1.2"; }
+      set
+      {
+        if (value != "1.2")
+        {
+          throw new ArgumentException("Only version 1.2 of the log4j schema is currently supported");
+        }
+      }
+    }
 
-		#endregion
+    #endregion
 
-		/* Example log4j schema event
+    /* Example log4j schema event
 
 <log4j:event logger="first logger" level="ERROR" thread="Thread-3" timestamp="1051494121460">
   <log4j:message><![CDATA[errormsg 3]]></log4j:message>
@@ -112,7 +112,7 @@
     <log4j:data name="some string" value="some valuethird"/>
   </log4j:MDC>
   <log4j:throwable><![CDATA[java.lang.Exception: someexception-third
- 	at org.apache.log4j.chainsaw.Generator.run(Generator.java:94)
+   at org.apache.log4j.chainsaw.Generator.run(Generator.java:94)
 ]]></log4j:throwable>
   <log4j:locationInfo class="org.apache.log4j.chainsaw.Generator"
 method="run" file="Generator.java" line="94"/>
@@ -122,159 +122,159 @@
   </log4j:properties>
 </log4j:event>
 
-		*/
+    */
 
-		/* Since log4j 1.3 the log4j:MDC has been combined into the log4j:properties element */
+    /* Since log4j 1.3 the log4j:MDC has been combined into the log4j:properties element */
 
-		/// <summary>
-		/// Actually do the writing of the xml
-		/// </summary>
-		/// <param name="writer">the writer to use</param>
-		/// <param name="loggingEvent">the event to write</param>
-		/// <remarks>
-		/// <para>
-		/// Generate XML that is compatible with the log4j schema.
-		/// </para>
-		/// </remarks>
-		protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
-		{
-			// Translate logging events for log4j
+    /// <summary>
+    /// Actually do the writing of the xml
+    /// </summary>
+    /// <param name="writer">the writer to use</param>
+    /// <param name="loggingEvent">the event to write</param>
+    /// <remarks>
+    /// <para>
+    /// Generate XML that is compatible with the log4j schema.
+    /// </para>
+    /// </remarks>
+    protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
+    {
+      // Translate logging events for log4j
 
-			// Translate hostname property
-			if (loggingEvent.LookupProperty(LoggingEvent.HostNameProperty) != null && 
-				loggingEvent.LookupProperty("log4jmachinename") == null)
-			{
-				loggingEvent.GetProperties()["log4jmachinename"] = loggingEvent.LookupProperty(LoggingEvent.HostNameProperty);
-			}
+      // Translate hostname property
+      if (loggingEvent.LookupProperty(LoggingEvent.HostNameProperty) != null &&
+        loggingEvent.LookupProperty("log4jmachinename") == null)
+      {
+        loggingEvent.GetProperties()["log4jmachinename"] = loggingEvent.LookupProperty(LoggingEvent.HostNameProperty);
+      }
 
-			// translate appdomain name
-			if (loggingEvent.LookupProperty("log4japp") == null && 
-				loggingEvent.Domain != null && 
-				loggingEvent.Domain.Length > 0)
-			{
-				loggingEvent.GetProperties()["log4japp"] = loggingEvent.Domain;
-			}
+      // translate appdomain name
+      if (loggingEvent.LookupProperty("log4japp") == null &&
+        loggingEvent.Domain != null &&
+        loggingEvent.Domain.Length > 0)
+      {
+        loggingEvent.GetProperties()["log4japp"] = loggingEvent.Domain;
+      }
 
-			// translate identity name
-			if (loggingEvent.Identity != null && 
-				loggingEvent.Identity.Length > 0 && 
-				loggingEvent.LookupProperty(LoggingEvent.IdentityProperty) == null)
-			{
-				loggingEvent.GetProperties()[LoggingEvent.IdentityProperty] = loggingEvent.Identity;
-			}
+      // translate identity name
+      if (loggingEvent.Identity != null &&
+        loggingEvent.Identity.Length > 0 &&
+        loggingEvent.LookupProperty(LoggingEvent.IdentityProperty) == null)
+      {
+        loggingEvent.GetProperties()[LoggingEvent.IdentityProperty] = loggingEvent.Identity;
+      }
 
-			// translate user name
-			if (loggingEvent.UserName != null && 
-				loggingEvent.UserName.Length > 0 && 
-				loggingEvent.LookupProperty(LoggingEvent.UserNameProperty) == null)
-			{
-				loggingEvent.GetProperties()[LoggingEvent.UserNameProperty] = loggingEvent.UserName;
-			}
+      // translate user name
+      if (loggingEvent.UserName != null &&
+        loggingEvent.UserName.Length > 0 &&
+        loggingEvent.LookupProperty(LoggingEvent.UserNameProperty) == null)
+      {
+        loggingEvent.GetProperties()[LoggingEvent.UserNameProperty] = loggingEvent.UserName;
+      }
 
-			// Write the start element
-			#if NETSTANDARD
-			writer.WriteStartElement("log4j", "event", "log4net");
-			#else
-			writer.WriteStartElement("log4j:event");
-			#endif
-			writer.WriteAttributeString("logger", loggingEvent.LoggerName);
+      // Write the start element
+#if NETSTANDARD
+      writer.WriteStartElement("log4j", "event", "log4net");
+#else
+      writer.WriteStartElement("log4j:event");
+#endif
+      writer.WriteAttributeString("logger", loggingEvent.LoggerName);
 
-			// Calculate the timestamp as the number of milliseconds since january 1970
-			// 
-			// We must convert the TimeStamp to UTC before performing any mathematical
-			// operations. This allows use to take into account discontinuities
-			// caused by daylight savings time transitions.
-			TimeSpan timeSince1970 = loggingEvent.TimeStampUtc - s_date1970;
+      // Calculate the timestamp as the number of milliseconds since january 1970
+      // 
+      // We must convert the TimeStamp to UTC before performing any mathematical
+      // operations. This allows use to take into account discontinuities
+      // caused by daylight savings time transitions.
+      TimeSpan timeSince1970 = loggingEvent.TimeStampUtc - s_date1970;
 
-			writer.WriteAttributeString("timestamp", XmlConvert.ToString((long)timeSince1970.TotalMilliseconds));
-			writer.WriteAttributeString("level", loggingEvent.Level.DisplayName);
-			writer.WriteAttributeString("thread", loggingEvent.ThreadName);
-    
-			// Append the message text
-			#if NETSTANDARD
-			writer.WriteStartElement("log4j", "message", "log4net");
-			#else
-			writer.WriteStartElement("log4j:message");
-			#endif
-			Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage,this.InvalidCharReplacement);
-			writer.WriteEndElement();
+      writer.WriteAttributeString("timestamp", XmlConvert.ToString((long)timeSince1970.TotalMilliseconds));
+      writer.WriteAttributeString("level", loggingEvent.Level.DisplayName);
+      writer.WriteAttributeString("thread", loggingEvent.ThreadName);
 
-			object ndcObj = loggingEvent.LookupProperty("NDC");
-			if (ndcObj != null)
-			{
-				string valueStr = loggingEvent.Repository.RendererMap.FindAndRender(ndcObj);
+      // Append the message text
+#if NETSTANDARD
+      writer.WriteStartElement("log4j", "message", "log4net");
+#else
+      writer.WriteStartElement("log4j:message");
+#endif
+      Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, this.InvalidCharReplacement);
+      writer.WriteEndElement();
 
-				if (valueStr != null && valueStr.Length > 0)
-				{
-					// Append the NDC text
-					#if NETSTANDARD
-					writer.WriteStartElement("log4j", "NDC", "log4net");
-					#else
-					writer.WriteStartElement("log4j:NDC");
-					#endif
-					Transform.WriteEscapedXmlString(writer, valueStr,this.InvalidCharReplacement);
-					writer.WriteEndElement();
-				}
-			}
+      object ndcObj = loggingEvent.LookupProperty("NDC");
+      if (ndcObj != null)
+      {
+        string valueStr = loggingEvent.Repository.RendererMap.FindAndRender(ndcObj);
 
-			// Append the properties text
-			PropertiesDictionary properties = loggingEvent.GetProperties();
-			if (properties.Count > 0)
-			{
-				#if NETSTANDARD
-				writer.WriteStartElement("log4j", "properties", "log4net");
-				#else
-				writer.WriteStartElement("log4j:properties");
-				#endif
-				foreach(System.Collections.DictionaryEntry entry in properties)
-				{
-					#if NETSTANDARD
-					writer.WriteStartElement("log4j", "data", "log4net");
-					#else
-					writer.WriteStartElement("log4j:data");
-					#endif
-					writer.WriteAttributeString("name", (string)entry.Key);
+        if (valueStr != null && valueStr.Length > 0)
+        {
+          // Append the NDC text
+#if NETSTANDARD
+          writer.WriteStartElement("log4j", "NDC", "log4net");
+#else
+          writer.WriteStartElement("log4j:NDC");
+#endif
+          Transform.WriteEscapedXmlString(writer, valueStr, this.InvalidCharReplacement);
+          writer.WriteEndElement();
+        }
+      }
 
-					// Use an ObjectRenderer to convert the object to a string
-					string valueStr = loggingEvent.Repository.RendererMap.FindAndRender(entry.Value);
-					writer.WriteAttributeString("value", valueStr);
+      // Append the properties text
+      PropertiesDictionary properties = loggingEvent.GetProperties();
+      if (properties.Count > 0)
+      {
+#if NETSTANDARD
+        writer.WriteStartElement("log4j", "properties", "log4net");
+#else
+        writer.WriteStartElement("log4j:properties");
+#endif
+        foreach (System.Collections.DictionaryEntry entry in properties)
+        {
+#if NETSTANDARD
+          writer.WriteStartElement("log4j", "data", "log4net");
+#else
+          writer.WriteStartElement("log4j:data");
+#endif
+          writer.WriteAttributeString("name", (string)entry.Key);
 
-					writer.WriteEndElement();
-				}
-				writer.WriteEndElement();
-			}
+          // Use an ObjectRenderer to convert the object to a string
+          string valueStr = loggingEvent.Repository.RendererMap.FindAndRender(entry.Value);
+          writer.WriteAttributeString("value", valueStr);
 
-			string exceptionStr = loggingEvent.GetExceptionString();
-			if (exceptionStr != null && exceptionStr.Length > 0)
-			{
-				// Append the stack trace line
-				#if NETSTANDARD
-				writer.WriteStartElement("log4j", "throwable", "log4net");
-				#else
-				writer.WriteStartElement("log4j:throwable");
-				#endif
-				Transform.WriteEscapedXmlString(writer, exceptionStr,this.InvalidCharReplacement);
-				writer.WriteEndElement();
-			}
+          writer.WriteEndElement();
+        }
+        writer.WriteEndElement();
+      }
 
-			if (LocationInfo)
-			{ 
-				LocationInfo locationInfo = loggingEvent.LocationInformation;
+      string exceptionStr = loggingEvent.GetExceptionString();
+      if (exceptionStr != null && exceptionStr.Length > 0)
+      {
+        // Append the stack trace line
+#if NETSTANDARD
+        writer.WriteStartElement("log4j", "throwable", "log4net");
+#else
+        writer.WriteStartElement("log4j:throwable");
+#endif
+        Transform.WriteEscapedXmlString(writer, exceptionStr, this.InvalidCharReplacement);
+        writer.WriteEndElement();
+      }
 
-				#if NETSTANDARD
-				writer.WriteStartElement("log4j", "locationInfo", "log4net");
-				#else
-				writer.WriteStartElement("log4j:locationInfo");
-				#endif
-				writer.WriteAttributeString("class", locationInfo.ClassName);
-				writer.WriteAttributeString("method", locationInfo.MethodName);
-				writer.WriteAttributeString("file", locationInfo.FileName);
-				writer.WriteAttributeString("line", locationInfo.LineNumber);
-				writer.WriteEndElement();
-			}
+      if (LocationInfo)
+      {
+        LocationInfo locationInfo = loggingEvent.LocationInformation;
 
-			writer.WriteEndElement();
-		}
-	}
+#if NETSTANDARD
+        writer.WriteStartElement("log4j", "locationInfo", "log4net");
+#else
+        writer.WriteStartElement("log4j:locationInfo");
+#endif
+        writer.WriteAttributeString("class", locationInfo.ClassName);
+        writer.WriteAttributeString("method", locationInfo.MethodName);
+        writer.WriteAttributeString("file", locationInfo.FileName);
+        writer.WriteAttributeString("line", locationInfo.LineNumber);
+        writer.WriteEndElement();
+      }
+
+      writer.WriteEndElement();
+    }
+  }
 }
 
diff --git a/src/log4net/LogManager.cs b/src/log4net/LogManager.cs
index b3598e2..0eb25ce 100644
--- a/src/log4net/LogManager.cs
+++ b/src/log4net/LogManager.cs
@@ -25,803 +25,803 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// This class is used by client applications to request logger instances.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class has static methods that are used by a client to request
-	/// a logger instance. The <see cref="M:GetLogger(string)"/> method is 
-	/// used to retrieve a logger.
-	/// </para>
-	/// <para>
-	/// See the <see cref="ILog"/> interface for more details.
-	/// </para>
-	/// </remarks>
-	/// <example>Simple example of logging messages
-	/// <code lang="C#">
-	/// ILog log = LogManager.GetLogger("application-log");
-	/// 
-	/// log.Info("Application Start");
-	/// log.Debug("This is a debug message");
-	/// 
-	/// if (log.IsDebugEnabled)
-	/// {
-	///		log.Debug("This is another debug message");
-	/// }
-	/// </code>
-	/// </example>
-	/// <threadsafety static="true" instance="true" />
-	/// <seealso cref="ILog"/>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class LogManager
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// This class is used by client applications to request logger instances.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class has static methods that are used by a client to request
+  /// a logger instance. The <see cref="M:GetLogger(string)"/> method is 
+  /// used to retrieve a logger.
+  /// </para>
+  /// <para>
+  /// See the <see cref="ILog"/> interface for more details.
+  /// </para>
+  /// </remarks>
+  /// <example>Simple example of logging messages
+  /// <code lang="C#">
+  /// ILog log = LogManager.GetLogger("application-log");
+  /// 
+  /// log.Info("Application Start");
+  /// log.Debug("This is a debug message");
+  /// 
+  /// if (log.IsDebugEnabled)
+  /// {
+  ///    log.Debug("This is another debug message");
+  /// }
+  /// </code>
+  /// </example>
+  /// <threadsafety static="true" instance="true" />
+  /// <seealso cref="ILog"/>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class LogManager
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="LogManager" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </remarks>
-		private LogManager()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="LogManager" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </remarks>
+    private LogManager()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Type Specific Manager Methods
+    #region Type Specific Manager Methods
 
 #if !NETSTANDARD1_3 // Excluded because GetCallingAssembly() is not available in CoreFX (https://github.com/dotnet/corefx/issues/2221).
-		/// <overloads>Returns the named logger if it exists.</overloads>
-		/// <summary>
-		/// Returns the named logger if it exists.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// If the named logger exists (in the default repository) then it
-		/// returns a reference to the logger, otherwise it returns <c>null</c>.
-		/// </para>
-		/// </remarks>
-		/// <param name="name">The fully qualified logger name to look for.</param>
-		/// <returns>The logger found, or <c>null</c> if no logger could be found.</returns>
-		public static ILog Exists(string name) 
-		{
-			return Exists(Assembly.GetCallingAssembly(), name);
-		}
-        
-		/// <overloads>Get the currently defined loggers.</overloads>
-		/// <summary>
-		/// Returns all the currently defined loggers in the default repository.
-		/// </summary>
-		/// <remarks>
-		/// <para>The root logger is <b>not</b> included in the returned array.</para>
-		/// </remarks>
-		/// <returns>All the defined loggers.</returns>
-		public static ILog[] GetCurrentLoggers()
-		{
-			return GetCurrentLoggers(Assembly.GetCallingAssembly());
-		}
-        
-		/// <overloads>Get or create a logger.</overloads>
-		/// <summary>
-		/// Retrieves or creates a named logger.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Retrieves a logger named as the <paramref name="name"/>
-		/// parameter. If the named logger already exists, then the
-		/// existing instance will be returned. Otherwise, a new instance is
-		/// created.
-		/// </para>
-		/// <para>By default, loggers do not have a set level but inherit
-		/// it from the hierarchy. This is one of the central features of
-		/// log4net.
-		/// </para>
-		/// </remarks>
-		/// <param name="name">The name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		public static ILog GetLogger(string name)
-		{
-			return GetLogger(Assembly.GetCallingAssembly(), name);
-		}
+    /// <overloads>Returns the named logger if it exists.</overloads>
+    /// <summary>
+    /// Returns the named logger if it exists.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// If the named logger exists (in the default repository) then it
+    /// returns a reference to the logger, otherwise it returns <c>null</c>.
+    /// </para>
+    /// </remarks>
+    /// <param name="name">The fully qualified logger name to look for.</param>
+    /// <returns>The logger found, or <c>null</c> if no logger could be found.</returns>
+    public static ILog Exists(string name)
+    {
+      return Exists(Assembly.GetCallingAssembly(), name);
+    }
+
+    /// <overloads>Get the currently defined loggers.</overloads>
+    /// <summary>
+    /// Returns all the currently defined loggers in the default repository.
+    /// </summary>
+    /// <remarks>
+    /// <para>The root logger is <b>not</b> included in the returned array.</para>
+    /// </remarks>
+    /// <returns>All the defined loggers.</returns>
+    public static ILog[] GetCurrentLoggers()
+    {
+      return GetCurrentLoggers(Assembly.GetCallingAssembly());
+    }
+
+    /// <overloads>Get or create a logger.</overloads>
+    /// <summary>
+    /// Retrieves or creates a named logger.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Retrieves a logger named as the <paramref name="name"/>
+    /// parameter. If the named logger already exists, then the
+    /// existing instance will be returned. Otherwise, a new instance is
+    /// created.
+    /// </para>
+    /// <para>By default, loggers do not have a set level but inherit
+    /// it from the hierarchy. This is one of the central features of
+    /// log4net.
+    /// </para>
+    /// </remarks>
+    /// <param name="name">The name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    public static ILog GetLogger(string name)
+    {
+      return GetLogger(Assembly.GetCallingAssembly(), name);
+    }
 #endif // !NETSTANDARD1_3
 
-        /// <summary>
-        /// Returns the named logger if it exists.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// If the named logger exists (in the specified repository) then it
-        /// returns a reference to the logger, otherwise it returns
-        /// <c>null</c>.
-        /// </para>
-        /// </remarks>
-        /// <param name="repository">The repository to lookup in.</param>
-        /// <param name="name">The fully qualified logger name to look for.</param>
-        /// <returns>
-        /// The logger found, or <c>null</c> if the logger doesn't exist in the specified 
-        /// repository.
-        /// </returns>
-        public static ILog Exists(string repository, string name) 
-		{
-			return WrapLogger(LoggerManager.Exists(repository, name));
-		}
+    /// <summary>
+    /// Returns the named logger if it exists.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// If the named logger exists (in the specified repository) then it
+    /// returns a reference to the logger, otherwise it returns
+    /// <c>null</c>.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <param name="name">The fully qualified logger name to look for.</param>
+    /// <returns>
+    /// The logger found, or <c>null</c> if the logger doesn't exist in the specified 
+    /// repository.
+    /// </returns>
+    public static ILog Exists(string repository, string name)
+    {
+      return WrapLogger(LoggerManager.Exists(repository, name));
+    }
 
-		/// <summary>
-		/// Returns the named logger if it exists.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// If the named logger exists (in the repository for the specified assembly) then it
-		/// returns a reference to the logger, otherwise it returns
-		/// <c>null</c>.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <param name="name">The fully qualified logger name to look for.</param>
-		/// <returns>
-		/// The logger, or <c>null</c> if the logger doesn't exist in the specified
-		/// assembly's repository.
-		/// </returns>
-		public static ILog Exists(Assembly repositoryAssembly, string name) 
-		{
-			return WrapLogger(LoggerManager.Exists(repositoryAssembly, name));
-		}
+    /// <summary>
+    /// Returns the named logger if it exists.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// If the named logger exists (in the repository for the specified assembly) then it
+    /// returns a reference to the logger, otherwise it returns
+    /// <c>null</c>.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <param name="name">The fully qualified logger name to look for.</param>
+    /// <returns>
+    /// The logger, or <c>null</c> if the logger doesn't exist in the specified
+    /// assembly's repository.
+    /// </returns>
+    public static ILog Exists(Assembly repositoryAssembly, string name)
+    {
+      return WrapLogger(LoggerManager.Exists(repositoryAssembly, name));
+    }
 
-		/// <summary>
-		/// Returns all the currently defined loggers in the specified repository.
-		/// </summary>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <remarks>
-		/// The root logger is <b>not</b> included in the returned array.
-		/// </remarks>
-		/// <returns>All the defined loggers.</returns>
-		public static ILog[] GetCurrentLoggers(string repository)
-		{
-			return WrapLoggers(LoggerManager.GetCurrentLoggers(repository));
-		}
+    /// <summary>
+    /// Returns all the currently defined loggers in the specified repository.
+    /// </summary>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <remarks>
+    /// The root logger is <b>not</b> included in the returned array.
+    /// </remarks>
+    /// <returns>All the defined loggers.</returns>
+    public static ILog[] GetCurrentLoggers(string repository)
+    {
+      return WrapLoggers(LoggerManager.GetCurrentLoggers(repository));
+    }
 
-		/// <summary>
-		/// Returns all the currently defined loggers in the specified assembly's repository.
-		/// </summary>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <remarks>
-		/// The root logger is <b>not</b> included in the returned array.
-		/// </remarks>
-		/// <returns>All the defined loggers.</returns>
-		public static ILog[] GetCurrentLoggers(Assembly repositoryAssembly)
-		{
-			return WrapLoggers(LoggerManager.GetCurrentLoggers(repositoryAssembly));
-		}
+    /// <summary>
+    /// Returns all the currently defined loggers in the specified assembly's repository.
+    /// </summary>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <remarks>
+    /// The root logger is <b>not</b> included in the returned array.
+    /// </remarks>
+    /// <returns>All the defined loggers.</returns>
+    public static ILog[] GetCurrentLoggers(Assembly repositoryAssembly)
+    {
+      return WrapLoggers(LoggerManager.GetCurrentLoggers(repositoryAssembly));
+    }
 
-		/// <summary>
-		/// Retrieves or creates a named logger.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Retrieve a logger named as the <paramref name="name"/>
-		/// parameter. If the named logger already exists, then the
-		/// existing instance will be returned. Otherwise, a new instance is
-		/// created.
-		/// </para>
-		/// <para>
-		/// By default, loggers do not have a set level but inherit
-		/// it from the hierarchy. This is one of the central features of
-		/// log4net.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <param name="name">The name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		public static ILog GetLogger(string repository, string name)
-		{
-			return WrapLogger(LoggerManager.GetLogger(repository, name));
-		}
+    /// <summary>
+    /// Retrieves or creates a named logger.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Retrieve a logger named as the <paramref name="name"/>
+    /// parameter. If the named logger already exists, then the
+    /// existing instance will be returned. Otherwise, a new instance is
+    /// created.
+    /// </para>
+    /// <para>
+    /// By default, loggers do not have a set level but inherit
+    /// it from the hierarchy. This is one of the central features of
+    /// log4net.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <param name="name">The name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    public static ILog GetLogger(string repository, string name)
+    {
+      return WrapLogger(LoggerManager.GetLogger(repository, name));
+    }
 
-		/// <summary>
-		/// Retrieves or creates a named logger.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Retrieve a logger named as the <paramref name="name"/>
-		/// parameter. If the named logger already exists, then the
-		/// existing instance will be returned. Otherwise, a new instance is
-		/// created.
-		/// </para>
-		/// <para>
-		/// By default, loggers do not have a set level but inherit
-		/// it from the hierarchy. This is one of the central features of
-		/// log4net.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <param name="name">The name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		public static ILog GetLogger(Assembly repositoryAssembly, string name)
-		{
-			return WrapLogger(LoggerManager.GetLogger(repositoryAssembly, name));
-		}	
+    /// <summary>
+    /// Retrieves or creates a named logger.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Retrieve a logger named as the <paramref name="name"/>
+    /// parameter. If the named logger already exists, then the
+    /// existing instance will be returned. Otherwise, a new instance is
+    /// created.
+    /// </para>
+    /// <para>
+    /// By default, loggers do not have a set level but inherit
+    /// it from the hierarchy. This is one of the central features of
+    /// log4net.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <param name="name">The name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    public static ILog GetLogger(Assembly repositoryAssembly, string name)
+    {
+      return WrapLogger(LoggerManager.GetLogger(repositoryAssembly, name));
+    }
 
-		/// <summary>
-		/// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
-		/// </summary>
-		/// <remarks>
-		/// Get the logger for the fully qualified name of the type specified.
-		/// </remarks>
-		/// <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		public static ILog GetLogger(Type type) 
-		{
+    /// <summary>
+    /// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
+    /// </summary>
+    /// <remarks>
+    /// Get the logger for the fully qualified name of the type specified.
+    /// </remarks>
+    /// <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    public static ILog GetLogger(Type type)
+    {
 #if NETSTANDARD1_3
-			return GetLogger(type.GetTypeInfo().Assembly, type.FullName);
+      return GetLogger(type.GetTypeInfo().Assembly, type.FullName);
 #else
-			return GetLogger(Assembly.GetCallingAssembly(), type.FullName);
+      return GetLogger(Assembly.GetCallingAssembly(), type.FullName);
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
-		/// </summary>
-		/// <remarks>
-		/// Gets the logger for the fully qualified name of the type specified.
-		/// </remarks>
-		/// <param name="repository">The repository to lookup in.</param>
-		/// <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		public static ILog GetLogger(string repository, Type type) 
-		{
-			return WrapLogger(LoggerManager.GetLogger(repository, type));
-		}
+    /// <summary>
+    /// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
+    /// </summary>
+    /// <remarks>
+    /// Gets the logger for the fully qualified name of the type specified.
+    /// </remarks>
+    /// <param name="repository">The repository to lookup in.</param>
+    /// <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    public static ILog GetLogger(string repository, Type type)
+    {
+      return WrapLogger(LoggerManager.GetLogger(repository, type));
+    }
 
-		/// <summary>
-		/// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
-		/// </summary>
-		/// <remarks>
-		/// Gets the logger for the fully qualified name of the type specified.
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		/// <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
-		/// <returns>The logger with the name specified.</returns>
-		public static ILog GetLogger(Assembly repositoryAssembly, Type type) 
-		{
-			return WrapLogger(LoggerManager.GetLogger(repositoryAssembly, type));
-		}
+    /// <summary>
+    /// Shorthand for <see cref="M:LogManager.GetLogger(string)"/>.
+    /// </summary>
+    /// <remarks>
+    /// Gets the logger for the fully qualified name of the type specified.
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    /// <param name="type">The full name of <paramref name="type"/> will be used as the name of the logger to retrieve.</param>
+    /// <returns>The logger with the name specified.</returns>
+    public static ILog GetLogger(Assembly repositoryAssembly, Type type)
+    {
+      return WrapLogger(LoggerManager.GetLogger(repositoryAssembly, type));
+    }
 
-		#endregion Type Specific Manager Methods
+    #endregion Type Specific Manager Methods
 
-		#region Domain & Repository Manager Methods
+    #region Domain & Repository Manager Methods
 
-		/// <summary>
-		/// Shuts down the log4net system.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in all the
-		/// default repositories.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		public static void Shutdown() 
-		{
-			LoggerManager.Shutdown();
-		}
+    /// <summary>
+    /// Shuts down the log4net system.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in all the
+    /// default repositories.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    public static void Shutdown()
+    {
+      LoggerManager.Shutdown();
+    }
 
 #if !NETSTANDARD1_3
-		/// <overloads>Shutdown a logger repository.</overloads>
-		/// <summary>
-		/// Shuts down the default repository.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in the
-		/// default repository.
-		/// </para>
-		/// <para>Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		public static void ShutdownRepository() 
-		{
-			ShutdownRepository(Assembly.GetCallingAssembly());
-		}
+    /// <overloads>Shutdown a logger repository.</overloads>
+    /// <summary>
+    /// Shuts down the default repository.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in the
+    /// default repository.
+    /// </para>
+    /// <para>Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    public static void ShutdownRepository()
+    {
+      ShutdownRepository(Assembly.GetCallingAssembly());
+    }
 #endif
 
-		/// <summary>
-		/// Shuts down the repository for the repository specified.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in the
-		/// <paramref name="repository"/> specified.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The repository to shutdown.</param>
-		public static void ShutdownRepository(string repository) 
-		{
-			LoggerManager.ShutdownRepository(repository);
-		}
+    /// <summary>
+    /// Shuts down the repository for the repository specified.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in the
+    /// <paramref name="repository"/> specified.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to shutdown.</param>
+    public static void ShutdownRepository(string repository)
+    {
+      LoggerManager.ShutdownRepository(repository);
+    }
 
-		/// <summary>
-		/// Shuts down the repository specified.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Calling this method will <b>safely</b> close and remove all
-		/// appenders in all the loggers including root contained in the
-		/// repository. The repository is looked up using
-		/// the <paramref name="repositoryAssembly"/> specified.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the application exists. 
-		/// Otherwise, pending logging events might be lost.
-		/// </para>
-		/// <para>
-		/// The <c>shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		public static void ShutdownRepository(Assembly repositoryAssembly) 
-		{
-			LoggerManager.ShutdownRepository(repositoryAssembly);
-		}
+    /// <summary>
+    /// Shuts down the repository specified.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Calling this method will <b>safely</b> close and remove all
+    /// appenders in all the loggers including root contained in the
+    /// repository. The repository is looked up using
+    /// the <paramref name="repositoryAssembly"/> specified.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the application exists. 
+    /// Otherwise, pending logging events might be lost.
+    /// </para>
+    /// <para>
+    /// The <c>shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    public static void ShutdownRepository(Assembly repositoryAssembly)
+    {
+      LoggerManager.ShutdownRepository(repositoryAssembly);
+    }
 
 #if !NETSTANDARD1_3
-		/// <overloads>Reset the configuration of a repository</overloads>
-		/// <summary>
-		/// Resets all values contained in this repository instance to their defaults.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Resets all values contained in the repository instance to their
-		/// defaults.  This removes all appenders from all loggers, sets
-		/// the level of all non-root loggers to <c>null</c>,
-		/// sets their additivity flag to <c>true</c> and sets the level
-		/// of the root logger to <see cref="Level.Debug"/>. Moreover,
-		/// message disabling is set to its default "off" value.
-		/// </para>		
-		/// </remarks>
-		public static void ResetConfiguration() 
-		{
-			ResetConfiguration(Assembly.GetCallingAssembly());
-		}
+    /// <overloads>Reset the configuration of a repository</overloads>
+    /// <summary>
+    /// Resets all values contained in this repository instance to their defaults.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Resets all values contained in the repository instance to their
+    /// defaults.  This removes all appenders from all loggers, sets
+    /// the level of all non-root loggers to <c>null</c>,
+    /// sets their additivity flag to <c>true</c> and sets the level
+    /// of the root logger to <see cref="Level.Debug"/>. Moreover,
+    /// message disabling is set to its default "off" value.
+    /// </para>    
+    /// </remarks>
+    public static void ResetConfiguration()
+    {
+      ResetConfiguration(Assembly.GetCallingAssembly());
+    }
 #endif
 
-		/// <summary>
-		/// Resets all values contained in this repository instance to their defaults.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Reset all values contained in the repository instance to their
-		/// defaults.  This removes all appenders from all loggers, sets
-		/// the level of all non-root loggers to <c>null</c>,
-		/// sets their additivity flag to <c>true</c> and sets the level
-		/// of the root logger to <see cref="Level.Debug"/>. Moreover,
-		/// message disabling is set to its default "off" value.
-		/// </para>		
-		/// </remarks>
-		/// <param name="repository">The repository to reset.</param>
-		public static void ResetConfiguration(string repository) 
-		{
-			LoggerManager.ResetConfiguration(repository);
-		}
+    /// <summary>
+    /// Resets all values contained in this repository instance to their defaults.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Reset all values contained in the repository instance to their
+    /// defaults.  This removes all appenders from all loggers, sets
+    /// the level of all non-root loggers to <c>null</c>,
+    /// sets their additivity flag to <c>true</c> and sets the level
+    /// of the root logger to <see cref="Level.Debug"/>. Moreover,
+    /// message disabling is set to its default "off" value.
+    /// </para>    
+    /// </remarks>
+    /// <param name="repository">The repository to reset.</param>
+    public static void ResetConfiguration(string repository)
+    {
+      LoggerManager.ResetConfiguration(repository);
+    }
 
-		/// <summary>
-		/// Resets all values contained in this repository instance to their defaults.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Reset all values contained in the repository instance to their
-		/// defaults.  This removes all appenders from all loggers, sets
-		/// the level of all non-root loggers to <c>null</c>,
-		/// sets their additivity flag to <c>true</c> and sets the level
-		/// of the root logger to <see cref="Level.Debug"/>. Moreover,
-		/// message disabling is set to its default "off" value.
-		/// </para>		
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository to reset.</param>
-		public static void ResetConfiguration(Assembly repositoryAssembly) 
-		{
-			LoggerManager.ResetConfiguration(repositoryAssembly);
-		}
+    /// <summary>
+    /// Resets all values contained in this repository instance to their defaults.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Reset all values contained in the repository instance to their
+    /// defaults.  This removes all appenders from all loggers, sets
+    /// the level of all non-root loggers to <c>null</c>,
+    /// sets their additivity flag to <c>true</c> and sets the level
+    /// of the root logger to <see cref="Level.Debug"/>. Moreover,
+    /// message disabling is set to its default "off" value.
+    /// </para>    
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository to reset.</param>
+    public static void ResetConfiguration(Assembly repositoryAssembly)
+    {
+      LoggerManager.ResetConfiguration(repositoryAssembly);
+    }
 
 #if !NETSTANDARD1_3
-		/// <overloads>Get the logger repository.</overloads>
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the callers assembly (<see cref="M:Assembly.GetCallingAssembly()"/>).
-		/// </para>
-		/// </remarks>
-		/// <returns>The <see cref="ILoggerRepository"/> instance for the default repository.</returns>
-		[Obsolete("Use GetRepository instead of GetLoggerRepository")]
-		public static ILoggerRepository GetLoggerRepository()
-		{
-			return GetRepository(Assembly.GetCallingAssembly());
-		}
+    /// <overloads>Get the logger repository.</overloads>
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the callers assembly (<see cref="M:Assembly.GetCallingAssembly()"/>).
+    /// </para>
+    /// </remarks>
+    /// <returns>The <see cref="ILoggerRepository"/> instance for the default repository.</returns>
+    [Obsolete("Use GetRepository instead of GetLoggerRepository")]
+    public static ILoggerRepository GetLoggerRepository()
+    {
+      return GetRepository(Assembly.GetCallingAssembly());
+    }
 #endif
 
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the <paramref name="repository"/> argument.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The repository to lookup in.</param>
-		[Obsolete("Use GetRepository instead of GetLoggerRepository")]
-		public static ILoggerRepository GetLoggerRepository(string repository)
-		{
-			return GetRepository(repository);
-		}
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the <paramref name="repository"/> argument.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to lookup in.</param>
+    [Obsolete("Use GetRepository instead of GetLoggerRepository")]
+    public static ILoggerRepository GetLoggerRepository(string repository)
+    {
+      return GetRepository(repository);
+    }
 
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the <paramref name="repositoryAssembly"/> argument.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		[Obsolete("Use GetRepository instead of GetLoggerRepository")]
-		public static ILoggerRepository GetLoggerRepository(Assembly repositoryAssembly)
-		{
-			return GetRepository(repositoryAssembly);
-		}
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the <paramref name="repositoryAssembly"/> argument.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    [Obsolete("Use GetRepository instead of GetLoggerRepository")]
+    public static ILoggerRepository GetLoggerRepository(Assembly repositoryAssembly)
+    {
+      return GetRepository(repositoryAssembly);
+    }
 
 #if !NETSTANDARD1_3
-		/// <overloads>Get a logger repository.</overloads>
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the callers assembly (<see cref="M:Assembly.GetCallingAssembly()"/>).
-		/// </para>
-		/// </remarks>
-		/// <returns>The <see cref="ILoggerRepository"/> instance for the default repository.</returns>
-		public static ILoggerRepository GetRepository()
-		{
-			return GetRepository(Assembly.GetCallingAssembly());
-		}
+    /// <overloads>Get a logger repository.</overloads>
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the callers assembly (<see cref="M:Assembly.GetCallingAssembly()"/>).
+    /// </para>
+    /// </remarks>
+    /// <returns>The <see cref="ILoggerRepository"/> instance for the default repository.</returns>
+    public static ILoggerRepository GetRepository()
+    {
+      return GetRepository(Assembly.GetCallingAssembly());
+    }
 #endif
 
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the <paramref name="repository"/> argument.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The repository to lookup in.</param>
-		public static ILoggerRepository GetRepository(string repository)
-		{
-			return LoggerManager.GetRepository(repository);
-		}
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the <paramref name="repository"/> argument.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The repository to lookup in.</param>
+    public static ILoggerRepository GetRepository(string repository)
+    {
+      return LoggerManager.GetRepository(repository);
+    }
 
-		/// <summary>
-		/// Returns the default <see cref="ILoggerRepository"/> instance.
-		/// </summary>
-		/// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> for the repository specified
-		/// by the <paramref name="repositoryAssembly"/> argument.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
-		public static ILoggerRepository GetRepository(Assembly repositoryAssembly)
-		{
-			return LoggerManager.GetRepository(repositoryAssembly);
-		}
+    /// <summary>
+    /// Returns the default <see cref="ILoggerRepository"/> instance.
+    /// </summary>
+    /// <returns>The default <see cref="ILoggerRepository"/> instance.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> for the repository specified
+    /// by the <paramref name="repositoryAssembly"/> argument.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to lookup the repository.</param>
+    public static ILoggerRepository GetRepository(Assembly repositoryAssembly)
+    {
+      return LoggerManager.GetRepository(repositoryAssembly);
+    }
 
 #if !NETSTANDARD1_3
-		/// <overloads>Create a domain</overloads>
-		/// <summary>
-		/// Creates a repository with the specified repository type.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository()"/> will return 
-		/// the same repository instance.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(Type repositoryType)
-		{
-			return CreateRepository(Assembly.GetCallingAssembly(), repositoryType);
-		}
+    /// <overloads>Create a domain</overloads>
+    /// <summary>
+    /// Creates a repository with the specified repository type.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository()"/> will return 
+    /// the same repository instance.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(Type repositoryType)
+    {
+      return CreateRepository(Assembly.GetCallingAssembly(), repositoryType);
+    }
 
-		/// <overloads>Create a logger repository.</overloads>
-		/// <summary>
-		/// Creates a repository with the specified repository type.
-		/// </summary>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository()"/> will return 
-		/// the same repository instance.
-		/// </para>
-		/// </remarks>
-		public static ILoggerRepository CreateRepository(Type repositoryType)
-		{
-			return CreateRepository(Assembly.GetCallingAssembly(), repositoryType);
-		}
+    /// <overloads>Create a logger repository.</overloads>
+    /// <summary>
+    /// Creates a repository with the specified repository type.
+    /// </summary>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository()"/> will return 
+    /// the same repository instance.
+    /// </para>
+    /// </remarks>
+    public static ILoggerRepository CreateRepository(Type repositoryType)
+    {
+      return CreateRepository(Assembly.GetCallingAssembly(), repositoryType);
+    }
 #endif
 
-		/// <summary>
-		/// Creates a repository with the specified name.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// Creates the default type of <see cref="ILoggerRepository"/> which is a
-		/// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
-		/// </para>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An <see cref="Exception"/> will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(string repository)
-		{
-			return LoggerManager.CreateRepository(repository);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// Creates the default type of <see cref="ILoggerRepository"/> which is a
+    /// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
+    /// </para>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An <see cref="Exception"/> will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(string repository)
+    {
+      return LoggerManager.CreateRepository(repository);
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Creates the default type of <see cref="ILoggerRepository"/> which is a
-		/// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
-		/// </para>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An <see cref="Exception"/> will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		public static ILoggerRepository CreateRepository(string repository)
-		{
-			return LoggerManager.CreateRepository(repository);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Creates the default type of <see cref="ILoggerRepository"/> which is a
+    /// <see cref="log4net.Repository.Hierarchy.Hierarchy"/> object.
+    /// </para>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An <see cref="Exception"/> will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The name of the repository, this must be unique amongst repositories.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    public static ILoggerRepository CreateRepository(string repository)
+    {
+      return LoggerManager.CreateRepository(repository);
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name and repository type.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An <see cref="Exception"/> will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The name of the repository, this must be unique to the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(string repository, Type repositoryType)
-		{
-			return LoggerManager.CreateRepository(repository, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name and repository type.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An <see cref="Exception"/> will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The name of the repository, this must be unique to the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(string repository, Type repositoryType)
+    {
+      return LoggerManager.CreateRepository(repository, repositoryType);
+    }
 
-		/// <summary>
-		/// Creates a repository with the specified name and repository type.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
-		/// An <see cref="Exception"/> will be thrown if the repository already exists.
-		/// </para>
-		/// </remarks>
-		/// <param name="repository">The name of the repository, this must be unique to the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		/// <exception cref="LogException">The specified repository already exists.</exception>
-		public static ILoggerRepository CreateRepository(string repository, Type repositoryType)
-		{
-			return LoggerManager.CreateRepository(repository, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository with the specified name and repository type.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <paramref name="repository"/> name must be unique. Repositories cannot be redefined.
+    /// An <see cref="Exception"/> will be thrown if the repository already exists.
+    /// </para>
+    /// </remarks>
+    /// <param name="repository">The name of the repository, this must be unique to the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    /// <exception cref="LogException">The specified repository already exists.</exception>
+    public static ILoggerRepository CreateRepository(string repository, Type repositoryType)
+    {
+      return LoggerManager.CreateRepository(repository, repositoryType);
+    }
 
-		/// <summary>
-		/// Creates a repository for the specified assembly and repository type.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
-		/// </para>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		[Obsolete("Use CreateRepository instead of CreateDomain")]
-		public static ILoggerRepository CreateDomain(Assembly repositoryAssembly, Type repositoryType)
-		{
-			return LoggerManager.CreateRepository(repositoryAssembly, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository for the specified assembly and repository type.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <b>CreateDomain is obsolete. Use CreateRepository instead of CreateDomain.</b>
+    /// </para>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    [Obsolete("Use CreateRepository instead of CreateDomain")]
+    public static ILoggerRepository CreateDomain(Assembly repositoryAssembly, Type repositoryType)
+    {
+      return LoggerManager.CreateRepository(repositoryAssembly, repositoryType);
+    }
 
-		/// <summary>
-		/// Creates a repository for the specified assembly and repository type.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="ILoggerRepository"/> created will be associated with the repository
-		/// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
-		/// same assembly specified will return the same repository instance.
-		/// </para>
-		/// </remarks>
-		/// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
-		/// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
-		/// and has a no arg constructor. An instance of this type will be created to act
-		/// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
-		/// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
-		public static ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType)
-		{
-			return LoggerManager.CreateRepository(repositoryAssembly, repositoryType);
-		}
+    /// <summary>
+    /// Creates a repository for the specified assembly and repository type.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="ILoggerRepository"/> created will be associated with the repository
+    /// specified such that a call to <see cref="M:GetRepository(Assembly)"/> with the
+    /// same assembly specified will return the same repository instance.
+    /// </para>
+    /// </remarks>
+    /// <param name="repositoryAssembly">The assembly to use to get the name of the repository.</param>
+    /// <param name="repositoryType">A <see cref="Type"/> that implements <see cref="ILoggerRepository"/>
+    /// and has a no arg constructor. An instance of this type will be created to act
+    /// as the <see cref="ILoggerRepository"/> for the repository specified.</param>
+    /// <returns>The <see cref="ILoggerRepository"/> created for the repository.</returns>
+    public static ILoggerRepository CreateRepository(Assembly repositoryAssembly, Type repositoryType)
+    {
+      return LoggerManager.CreateRepository(repositoryAssembly, repositoryType);
+    }
 
-		/// <summary>
-		/// Gets the list of currently defined repositories.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Get an array of all the <see cref="ILoggerRepository"/> objects that have been created.
-		/// </para>
-		/// </remarks>
-		/// <returns>An array of all the known <see cref="ILoggerRepository"/> objects.</returns>
-		public static ILoggerRepository[] GetAllRepositories()
-		{
-			return LoggerManager.GetAllRepositories();
-		}
+    /// <summary>
+    /// Gets the list of currently defined repositories.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Get an array of all the <see cref="ILoggerRepository"/> objects that have been created.
+    /// </para>
+    /// </remarks>
+    /// <returns>An array of all the known <see cref="ILoggerRepository"/> objects.</returns>
+    public static ILoggerRepository[] GetAllRepositories()
+    {
+      return LoggerManager.GetAllRepositories();
+    }
 
-            /// <summary>
-            /// Flushes logging events buffered in all configured appenders in the default repository.
-            /// </summary>
-            /// <param name="millisecondsTimeout">The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed.</param>
-            /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-            public static bool Flush(int millisecondsTimeout)
-            {
+    /// <summary>
+    /// Flushes logging events buffered in all configured appenders in the default repository.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public static bool Flush(int millisecondsTimeout)
+    {
 #if !NETSTANDARD1_3 // Excluded because GetCallingAssembly() is not available in CoreFX (https://github.com/dotnet/corefx/issues/2221).
-                Appender.IFlushable flushableRepository = LoggerManager.GetRepository(Assembly.GetCallingAssembly()) as Appender.IFlushable;
-                if (flushableRepository == null)
-                {
-                    return false;
-                }
-                else
-                {
-                    return flushableRepository.Flush(millisecondsTimeout);
-                }
+      Appender.IFlushable flushableRepository = LoggerManager.GetRepository(Assembly.GetCallingAssembly()) as Appender.IFlushable;
+      if (flushableRepository == null)
+      {
+        return false;
+      }
+      else
+      {
+        return flushableRepository.Flush(millisecondsTimeout);
+      }
 #else
                 return false;
 #endif
-            }
+    }
 
-		#endregion Domain & Repository Manager Methods
+    #endregion Domain & Repository Manager Methods
 
-		#region Extension Handlers
+    #region Extension Handlers
 
-		/// <summary>
-		/// Looks up the wrapper object for the logger specified.
-		/// </summary>
-		/// <param name="logger">The logger to get the wrapper for.</param>
-		/// <returns>The wrapper for the logger specified.</returns>
-		private static ILog WrapLogger(ILogger logger)
-		{
-			return (ILog)s_wrapperMap.GetWrapper(logger);
-		}
+    /// <summary>
+    /// Looks up the wrapper object for the logger specified.
+    /// </summary>
+    /// <param name="logger">The logger to get the wrapper for.</param>
+    /// <returns>The wrapper for the logger specified.</returns>
+    private static ILog WrapLogger(ILogger logger)
+    {
+      return (ILog)s_wrapperMap.GetWrapper(logger);
+    }
 
-		/// <summary>
-		/// Looks up the wrapper objects for the loggers specified.
-		/// </summary>
-		/// <param name="loggers">The loggers to get the wrappers for.</param>
-		/// <returns>The wrapper objects for the loggers specified.</returns>
-		private static ILog[] WrapLoggers(ILogger[] loggers)
-		{
-			ILog[] results = new ILog[loggers.Length];
-			for(int i=0; i<loggers.Length; i++)
-			{
-				results[i] = WrapLogger(loggers[i]);
-			}
-			return results;
-		}
+    /// <summary>
+    /// Looks up the wrapper objects for the loggers specified.
+    /// </summary>
+    /// <param name="loggers">The loggers to get the wrappers for.</param>
+    /// <returns>The wrapper objects for the loggers specified.</returns>
+    private static ILog[] WrapLoggers(ILogger[] loggers)
+    {
+      ILog[] results = new ILog[loggers.Length];
+      for (int i = 0; i < loggers.Length; i++)
+      {
+        results[i] = WrapLogger(loggers[i]);
+      }
+      return results;
+    }
 
-		/// <summary>
-		/// Create the <see cref="ILoggerWrapper"/> objects used by
-		/// this manager.
-		/// </summary>
-		/// <param name="logger">The logger to wrap.</param>
-		/// <returns>The wrapper for the logger specified.</returns>
-		private static ILoggerWrapper WrapperCreationHandler(ILogger logger)
-		{
-			return new LogImpl(logger);
-		}
+    /// <summary>
+    /// Create the <see cref="ILoggerWrapper"/> objects used by
+    /// this manager.
+    /// </summary>
+    /// <param name="logger">The logger to wrap.</param>
+    /// <returns>The wrapper for the logger specified.</returns>
+    private static ILoggerWrapper WrapperCreationHandler(ILogger logger)
+    {
+      return new LogImpl(logger);
+    }
 
-		#endregion
+    #endregion
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The wrapper map to use to hold the <see cref="LogImpl"/> objects.
-		/// </summary>
-		private static readonly WrapperMap s_wrapperMap = new WrapperMap(new WrapperCreationHandler(WrapperCreationHandler));
+    /// <summary>
+    /// The wrapper map to use to hold the <see cref="LogImpl"/> objects.
+    /// </summary>
+    private static readonly WrapperMap s_wrapperMap = new WrapperMap(new WrapperCreationHandler(WrapperCreationHandler));
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/LogicalThreadContext.cs b/src/log4net/LogicalThreadContext.cs
index 937f952..79da8fc 100644
--- a/src/log4net/LogicalThreadContext.cs
+++ b/src/log4net/LogicalThreadContext.cs
@@ -24,130 +24,130 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// The log4net Logical Thread Context.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <c>LogicalThreadContext</c> provides a location for <see cref="System.Runtime.Remoting.Messaging.CallContext"/> specific debugging 
-	/// information to be stored.
-	/// The <c>LogicalThreadContext</c> properties override any <see cref="ThreadContext"/> or <see cref="GlobalContext"/>
-	/// properties with the same name.
-	/// </para>
-	/// <para>
-	/// For .NET Standard 1.3 this class uses
-	/// System.Threading.AsyncLocal rather than <see
-	/// cref="System.Runtime.Remoting.Messaging.CallContext"/>.
-	/// </para>
-	/// <para>
-	/// The Logical Thread Context has a properties map and a stack.
-	/// The properties and stack can 
-	/// be included in the output of log messages. The <see cref="log4net.Layout.PatternLayout"/>
-	/// supports selecting and outputting these properties.
-	/// </para>
-	/// <para>
-	/// The Logical Thread Context provides a diagnostic context for the current call context. 
-	/// This is an instrument for distinguishing interleaved log
-	/// output from different sources. Log output is typically interleaved
-	/// when a server handles multiple clients near-simultaneously.
-	/// </para>
-	/// <para>
-	/// The Logical Thread Context is managed on a per <see cref="System.Runtime.Remoting.Messaging.CallContext"/> basis.
-	/// </para>
-	/// <para>
-	/// The <see cref="System.Runtime.Remoting.Messaging.CallContext"/> requires a link time 
-	/// <see cref="System.Security.Permissions.SecurityPermission"/> for the
-	/// <see cref="System.Security.Permissions.SecurityPermissionFlag.Infrastructure"/>.
-	/// If the calling code does not have this permission then this context will be disabled.
-	/// It will not store any property values set on it.
-	/// </para>
-	/// </remarks>
-	/// <example>Example of using the thread context properties to store a username.
-	/// <code lang="C#">
-	/// LogicalThreadContext.Properties["user"] = userName;
-	///	log.Info("This log message has a LogicalThreadContext Property called 'user'");
-	/// </code>
-	/// </example>
-	/// <example>Example of how to push a message into the context stack
-	/// <code lang="C#">
-	///	using(LogicalThreadContext.Stacks["LDC"].Push("my context message"))
-	///	{
-	///		log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'");
-	///	
-	///	} // at the end of the using block the message is automatically popped 
-	/// </code>
-	/// </example>
-	/// <threadsafety static="true" instance="true" />
-	/// <author>Nicko Cadell</author>
-	public sealed class LogicalThreadContext
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// The log4net Logical Thread Context.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <c>LogicalThreadContext</c> provides a location for <see cref="System.Runtime.Remoting.Messaging.CallContext"/> specific debugging 
+  /// information to be stored.
+  /// The <c>LogicalThreadContext</c> properties override any <see cref="ThreadContext"/> or <see cref="GlobalContext"/>
+  /// properties with the same name.
+  /// </para>
+  /// <para>
+  /// For .NET Standard 1.3 this class uses
+  /// System.Threading.AsyncLocal rather than <see
+  /// cref="System.Runtime.Remoting.Messaging.CallContext"/>.
+  /// </para>
+  /// <para>
+  /// The Logical Thread Context has a properties map and a stack.
+  /// The properties and stack can 
+  /// be included in the output of log messages. The <see cref="log4net.Layout.PatternLayout"/>
+  /// supports selecting and outputting these properties.
+  /// </para>
+  /// <para>
+  /// The Logical Thread Context provides a diagnostic context for the current call context. 
+  /// This is an instrument for distinguishing interleaved log
+  /// output from different sources. Log output is typically interleaved
+  /// when a server handles multiple clients near-simultaneously.
+  /// </para>
+  /// <para>
+  /// The Logical Thread Context is managed on a per <see cref="System.Runtime.Remoting.Messaging.CallContext"/> basis.
+  /// </para>
+  /// <para>
+  /// The <see cref="System.Runtime.Remoting.Messaging.CallContext"/> requires a link time 
+  /// <see cref="System.Security.Permissions.SecurityPermission"/> for the
+  /// <see cref="System.Security.Permissions.SecurityPermissionFlag.Infrastructure"/>.
+  /// If the calling code does not have this permission then this context will be disabled.
+  /// It will not store any property values set on it.
+  /// </para>
+  /// </remarks>
+  /// <example>Example of using the thread context properties to store a username.
+  /// <code lang="C#">
+  /// LogicalThreadContext.Properties["user"] = userName;
+  ///  log.Info("This log message has a LogicalThreadContext Property called 'user'");
+  /// </code>
+  /// </example>
+  /// <example>Example of how to push a message into the context stack
+  /// <code lang="C#">
+  ///  using(LogicalThreadContext.Stacks["LDC"].Push("my context message"))
+  ///  {
+  ///    log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'");
+  ///  
+  ///  } // at the end of the using block the message is automatically popped 
+  /// </code>
+  /// </example>
+  /// <threadsafety static="true" instance="true" />
+  /// <author>Nicko Cadell</author>
+  public sealed class LogicalThreadContext
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private Constructor. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </para>
-		/// </remarks>
-		private LogicalThreadContext()
-		{
-		}
+    /// <summary>
+    /// Private Constructor. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </para>
+    /// </remarks>
+    private LogicalThreadContext()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Properties
+    #region Public Static Properties
 
-		/// <summary>
-		/// The thread properties map
-		/// </summary>
-		/// <value>
-		/// The thread properties map
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <c>LogicalThreadContext</c> properties override any <see cref="ThreadContext"/> 
-		/// or <see cref="GlobalContext"/> properties with the same name.
-		/// </para>
-		/// </remarks>
-		public static LogicalThreadContextProperties Properties
-		{
-			get { return s_properties; }
-		}
+    /// <summary>
+    /// The thread properties map
+    /// </summary>
+    /// <value>
+    /// The thread properties map
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <c>LogicalThreadContext</c> properties override any <see cref="ThreadContext"/> 
+    /// or <see cref="GlobalContext"/> properties with the same name.
+    /// </para>
+    /// </remarks>
+    public static LogicalThreadContextProperties Properties
+    {
+      get { return s_properties; }
+    }
 
-		/// <summary>
-		/// The thread stacks
-		/// </summary>
-		/// <value>
-		/// stack map
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The logical thread stacks.
-		/// </para>
-		/// </remarks>
-		public static LogicalThreadContextStacks Stacks
-		{
-			get { return s_stacks; }
-		}
+    /// <summary>
+    /// The thread stacks
+    /// </summary>
+    /// <value>
+    /// stack map
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The logical thread stacks.
+    /// </para>
+    /// </remarks>
+    public static LogicalThreadContextStacks Stacks
+    {
+      get { return s_stacks; }
+    }
 
-		#endregion Public Static Properties
+    #endregion Public Static Properties
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The thread context properties instance
-		/// </summary>
-		private static readonly LogicalThreadContextProperties s_properties = new LogicalThreadContextProperties();
+    /// <summary>
+    /// The thread context properties instance
+    /// </summary>
+    private static readonly LogicalThreadContextProperties s_properties = new LogicalThreadContextProperties();
 
-		/// <summary>
-		/// The thread context stacks instance
-		/// </summary>
-		private static readonly LogicalThreadContextStacks s_stacks = new LogicalThreadContextStacks(s_properties);
+    /// <summary>
+    /// The thread context stacks instance
+    /// </summary>
+    private static readonly LogicalThreadContextStacks s_stacks = new LogicalThreadContextStacks(s_properties);
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
 #endif
\ No newline at end of file
diff --git a/src/log4net/MDC.cs b/src/log4net/MDC.cs
index 06e1b1d..f0d2531 100644
--- a/src/log4net/MDC.cs
+++ b/src/log4net/MDC.cs
@@ -22,148 +22,148 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// Implementation of Mapped Diagnostic Contexts.
-	/// </summary>
-	/// <remarks>
-	/// <note>
-	/// <para>
-	/// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
-	/// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
-	/// </para>
-	/// </note>
-	/// <para>
-	/// The MDC class is similar to the <see cref="NDC"/> class except that it is
-	/// based on a map instead of a stack. It provides <i>mapped
-	/// diagnostic contexts</i>. A <i>Mapped Diagnostic Context</i>, or
-	/// MDC in short, is an instrument for distinguishing interleaved log
-	/// output from different sources. Log output is typically interleaved
-	/// when a server handles multiple clients near-simultaneously.
-	/// </para>
-	/// <para>
-	/// The MDC is managed on a per thread basis.
-	/// </para>
-	/// </remarks>
-	/// <threadsafety static="true" instance="true" />
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
-	public sealed class MDC
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// Implementation of Mapped Diagnostic Contexts.
+  /// </summary>
+  /// <remarks>
+  /// <note>
+  /// <para>
+  /// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
+  /// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+  /// </para>
+  /// </note>
+  /// <para>
+  /// The MDC class is similar to the <see cref="NDC"/> class except that it is
+  /// based on a map instead of a stack. It provides <i>mapped
+  /// diagnostic contexts</i>. A <i>Mapped Diagnostic Context</i>, or
+  /// MDC in short, is an instrument for distinguishing interleaved log
+  /// output from different sources. Log output is typically interleaved
+  /// when a server handles multiple clients near-simultaneously.
+  /// </para>
+  /// <para>
+  /// The MDC is managed on a per thread basis.
+  /// </para>
+  /// </remarks>
+  /// <threadsafety static="true" instance="true" />
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
+  public sealed class MDC
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="MDC" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </remarks>
-		private MDC()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="MDC" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </remarks>
+    private MDC()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Gets the context value identified by the <paramref name="key" /> parameter.
-		/// </summary>
-		/// <param name="key">The key to lookup in the MDC.</param>
-		/// <returns>The string value held for the key, or a <c>null</c> reference if no corresponding value is found.</returns>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
-		/// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// If the <paramref name="key" /> parameter does not look up to a
-		/// previously defined context then <c>null</c> will be returned.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
-		public static string Get(string key)
-		{
-			object obj = ThreadContext.Properties[key];
-			if (obj == null)
-			{
-				return null;
-			}
-			return obj.ToString();
-		}
+    /// <summary>
+    /// Gets the context value identified by the <paramref name="key" /> parameter.
+    /// </summary>
+    /// <param name="key">The key to lookup in the MDC.</param>
+    /// <returns>The string value held for the key, or a <c>null</c> reference if no corresponding value is found.</returns>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
+    /// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// If the <paramref name="key" /> parameter does not look up to a
+    /// previously defined context then <c>null</c> will be returned.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
+    public static string Get(string key)
+    {
+      object obj = ThreadContext.Properties[key];
+      if (obj == null)
+      {
+        return null;
+      }
+      return obj.ToString();
+    }
 
-		/// <summary>
-		/// Add an entry to the MDC
-		/// </summary>
-		/// <param name="key">The key to store the value under.</param>
-		/// <param name="value">The value to store.</param>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
-		/// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Puts a context value (the <paramref name="value" /> parameter) as identified
-		/// with the <paramref name="key" /> parameter into the current thread's
-		/// context map.
-		/// </para>
-		/// <para>
-		/// If a value is already defined for the <paramref name="key" />
-		/// specified then the value will be replaced. If the <paramref name="value" /> 
-		/// is specified as <c>null</c> then the key value mapping will be removed.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
-		public static void Set(string key, string value)
-		{
-			ThreadContext.Properties[key] = value;
-		}
+    /// <summary>
+    /// Add an entry to the MDC
+    /// </summary>
+    /// <param name="key">The key to store the value under.</param>
+    /// <param name="value">The value to store.</param>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
+    /// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Puts a context value (the <paramref name="value" /> parameter) as identified
+    /// with the <paramref name="key" /> parameter into the current thread's
+    /// context map.
+    /// </para>
+    /// <para>
+    /// If a value is already defined for the <paramref name="key" />
+    /// specified then the value will be replaced. If the <paramref name="value" /> 
+    /// is specified as <c>null</c> then the key value mapping will be removed.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
+    public static void Set(string key, string value)
+    {
+      ThreadContext.Properties[key] = value;
+    }
 
-		/// <summary>
-		/// Removes the key value mapping for the key specified.
-		/// </summary>
-		/// <param name="key">The key to remove.</param>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
-		/// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Remove the specified entry from this thread's MDC
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
-		public static void Remove(string key)
-		{
-			ThreadContext.Properties.Remove(key);
-		}
+    /// <summary>
+    /// Removes the key value mapping for the key specified.
+    /// </summary>
+    /// <param name="key">The key to remove.</param>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
+    /// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Remove the specified entry from this thread's MDC
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
+    public static void Remove(string key)
+    {
+      ThreadContext.Properties.Remove(key);
+    }
 
-		/// <summary>
-		/// Clear all entries in the MDC
-		/// </summary>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
-		/// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Remove all the entries from this thread's MDC
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
-		public static void Clear()
-		{
-			ThreadContext.Properties.Clear();
-		}
+    /// <summary>
+    /// Clear all entries in the MDC
+    /// </summary>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The MDC is deprecated and has been replaced by the <see cref="ThreadContext.Properties"/>.
+    /// The current MDC implementation forwards to the <c>ThreadContext.Properties</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Remove all the entries from this thread's MDC
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("MDC has been replaced by ThreadContext.Properties")]*/
+    public static void Clear()
+    {
+      ThreadContext.Properties.Clear();
+    }
 
-		#endregion Public Static Methods
-	}
+    #endregion Public Static Methods
+  }
 }
diff --git a/src/log4net/NDC.cs b/src/log4net/NDC.cs
index 6b79619..c1ded53 100644
--- a/src/log4net/NDC.cs
+++ b/src/log4net/NDC.cs
@@ -26,324 +26,324 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// Implementation of Nested Diagnostic Contexts.
-	/// </summary>
-	/// <remarks>
-	/// <note>
-	/// <para>
-	/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-	/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-	/// </para>
-	/// </note>
-	/// <para>
-	/// A Nested Diagnostic Context, or NDC in short, is an instrument
-	/// to distinguish interleaved log output from different sources. Log
-	/// output is typically interleaved when a server handles multiple
-	/// clients near-simultaneously.
-	/// </para>
-	/// <para>
-	/// Interleaved log output can still be meaningful if each log entry
-	/// from different contexts had a distinctive stamp. This is where NDCs
-	/// come into play.
-	/// </para>
-	/// <para>
-	/// Note that NDCs are managed on a per thread basis. The NDC class
-	/// is made up of static methods that operate on the context of the
-	/// calling thread.
-	/// </para>
-	/// </remarks>
-	/// <example>How to push a message into the context
-	/// <code lang="C#">
-	///	using(NDC.Push("my context message"))
-	///	{
-	///		... all log calls will have 'my context message' included ...
-	///	
-	///	} // at the end of the using block the message is automatically removed 
-	/// </code>
-	/// </example>
-	/// <threadsafety static="true" instance="true" />
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-	public sealed class NDC
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// Implementation of Nested Diagnostic Contexts.
+  /// </summary>
+  /// <remarks>
+  /// <note>
+  /// <para>
+  /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+  /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+  /// </para>
+  /// </note>
+  /// <para>
+  /// A Nested Diagnostic Context, or NDC in short, is an instrument
+  /// to distinguish interleaved log output from different sources. Log
+  /// output is typically interleaved when a server handles multiple
+  /// clients near-simultaneously.
+  /// </para>
+  /// <para>
+  /// Interleaved log output can still be meaningful if each log entry
+  /// from different contexts had a distinctive stamp. This is where NDCs
+  /// come into play.
+  /// </para>
+  /// <para>
+  /// Note that NDCs are managed on a per thread basis. The NDC class
+  /// is made up of static methods that operate on the context of the
+  /// calling thread.
+  /// </para>
+  /// </remarks>
+  /// <example>How to push a message into the context
+  /// <code lang="C#">
+  ///  using(NDC.Push("my context message"))
+  ///  {
+  ///    ... all log calls will have 'my context message' included ...
+  ///  
+  ///  } // at the end of the using block the message is automatically removed 
+  /// </code>
+  /// </example>
+  /// <threadsafety static="true" instance="true" />
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+  public sealed class NDC
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="NDC" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </remarks>
-		private NDC()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="NDC" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </remarks>
+    private NDC()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Properties
+    #region Public Static Properties
 
-		/// <summary>
-		/// Gets the current context depth.
-		/// </summary>
-		/// <value>The current context depth.</value>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// The number of context values pushed onto the context stack.
-		/// </para>
-		/// <para>
-		/// Used to record the current depth of the context. This can then 
-		/// be restored using the <see cref="SetMaxDepth"/> method.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="SetMaxDepth"/>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static int Depth
-		{
-			get { return ThreadContext.Stacks["NDC"].Count; }
-		}
+    /// <summary>
+    /// Gets the current context depth.
+    /// </summary>
+    /// <value>The current context depth.</value>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// The number of context values pushed onto the context stack.
+    /// </para>
+    /// <para>
+    /// Used to record the current depth of the context. This can then 
+    /// be restored using the <see cref="SetMaxDepth"/> method.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="SetMaxDepth"/>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static int Depth
+    {
+      get { return ThreadContext.Stacks["NDC"].Count; }
+    }
 
-		#endregion Public Static Properties
+    #endregion Public Static Properties
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Clears all the contextual information held on the current thread.
-		/// </summary>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Clears the stack of NDC data held on the current thread.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static void Clear() 
-		{
-			ThreadContext.Stacks["NDC"].Clear();
-		}
+    /// <summary>
+    /// Clears all the contextual information held on the current thread.
+    /// </summary>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Clears the stack of NDC data held on the current thread.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static void Clear()
+    {
+      ThreadContext.Stacks["NDC"].Clear();
+    }
 
-		/// <summary>
-		/// Creates a clone of the stack of context information.
-		/// </summary>
-		/// <returns>A clone of the context info for this thread.</returns>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// The results of this method can be passed to the <see cref="Inherit"/> 
-		/// method to allow child threads to inherit the context of their 
-		/// parent thread.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static Stack CloneStack() 
-		{
-			return ThreadContext.Stacks["NDC"].InternalStack;
-		}
+    /// <summary>
+    /// Creates a clone of the stack of context information.
+    /// </summary>
+    /// <returns>A clone of the context info for this thread.</returns>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// The results of this method can be passed to the <see cref="Inherit"/> 
+    /// method to allow child threads to inherit the context of their 
+    /// parent thread.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static Stack CloneStack()
+    {
+      return ThreadContext.Stacks["NDC"].InternalStack;
+    }
 
-		/// <summary>
-		/// Inherits the contextual information from another thread.
-		/// </summary>
-		/// <param name="stack">The context stack to inherit.</param>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// This thread will use the context information from the stack
-		/// supplied. This can be used to initialize child threads with
-		/// the same contextual information as their parent threads. These
-		/// contexts will <b>NOT</b> be shared. Any further contexts that
-		/// are pushed onto the stack will not be visible to the other.
-		/// Call <see cref="CloneStack"/> to obtain a stack to pass to
-		/// this method.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks", true)]*/
-		public static void Inherit(Stack stack) 
-		{
-			ThreadContext.Stacks["NDC"].InternalStack = stack;
-		}
+    /// <summary>
+    /// Inherits the contextual information from another thread.
+    /// </summary>
+    /// <param name="stack">The context stack to inherit.</param>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// This thread will use the context information from the stack
+    /// supplied. This can be used to initialize child threads with
+    /// the same contextual information as their parent threads. These
+    /// contexts will <b>NOT</b> be shared. Any further contexts that
+    /// are pushed onto the stack will not be visible to the other.
+    /// Call <see cref="CloneStack"/> to obtain a stack to pass to
+    /// this method.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks", true)]*/
+    public static void Inherit(Stack stack)
+    {
+      ThreadContext.Stacks["NDC"].InternalStack = stack;
+    }
 
-		/// <summary>
-		/// Removes the top context from the stack.
-		/// </summary>
-		/// <returns>
-		/// The message in the context that was removed from the top 
-		/// of the stack.
-		/// </returns>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Remove the top context from the stack, and return
-		/// it to the caller. If the stack is empty then an
-		/// empty string (not <c>null</c>) is returned.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static string Pop() 
-		{
-			return ThreadContext.Stacks["NDC"].Pop();
-		}
+    /// <summary>
+    /// Removes the top context from the stack.
+    /// </summary>
+    /// <returns>
+    /// The message in the context that was removed from the top 
+    /// of the stack.
+    /// </returns>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Remove the top context from the stack, and return
+    /// it to the caller. If the stack is empty then an
+    /// empty string (not <c>null</c>) is returned.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static string Pop()
+    {
+      return ThreadContext.Stacks["NDC"].Pop();
+    }
 
-		/// <summary>
-		/// Pushes a new context message.
-		/// </summary>
-		/// <param name="message">The new context message.</param>
-		/// <returns>
-		/// An <see cref="IDisposable"/> that can be used to clean up 
-		/// the context stack.
-		/// </returns>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Pushes a new context onto the context stack. An <see cref="IDisposable"/>
-		/// is returned that can be used to clean up the context stack. This
-		/// can be easily combined with the <c>using</c> keyword to scope the
-		/// context.
-		/// </para>
-		/// </remarks>
-		/// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
-		/// <code lang="C#">
-		/// using(log4net.NDC.Push("NDC_Message"))
-		/// {
-		///		log.Warn("This should have an NDC message");
-		///	}
-		/// </code>
-		/// </example>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static IDisposable Push(string message) 
-		{
-			return ThreadContext.Stacks["NDC"].Push(message);
-		}
+    /// <summary>
+    /// Pushes a new context message.
+    /// </summary>
+    /// <param name="message">The new context message.</param>
+    /// <returns>
+    /// An <see cref="IDisposable"/> that can be used to clean up 
+    /// the context stack.
+    /// </returns>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Pushes a new context onto the context stack. An <see cref="IDisposable"/>
+    /// is returned that can be used to clean up the context stack. This
+    /// can be easily combined with the <c>using</c> keyword to scope the
+    /// context.
+    /// </para>
+    /// </remarks>
+    /// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
+    /// <code lang="C#">
+    /// using(log4net.NDC.Push("NDC_Message"))
+    /// {
+    ///    log.Warn("This should have an NDC message");
+    ///  }
+    /// </code>
+    /// </example>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static IDisposable Push(string message)
+    {
+      return ThreadContext.Stacks["NDC"].Push(message);
+    }
 
-		/// <summary>
-		/// Pushes a new context message.
-		/// </summary>
-		/// <param name="messageFormat">The new context message string format.</param>
-		/// <param name="args">Arguments to be passed into messageFormat.</param>
-		/// <returns>
-		/// An <see cref="IDisposable"/> that can be used to clean up 
-		/// the context stack.
-		/// </returns>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Pushes a new context onto the context stack. An <see cref="IDisposable"/>
-		/// is returned that can be used to clean up the context stack. This
-		/// can be easily combined with the <c>using</c> keyword to scope the
-		/// context.
-		/// </para>
-		/// </remarks>
-		/// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
-		/// <code lang="C#">
-		/// var someValue = "ExampleContext"
-		/// using(log4net.NDC.PushFormat("NDC_Message {0}", someValue))
-		/// {
-		///		log.Warn("This should have an NDC message");
-		///	}
-		/// </code>
-		/// </example>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static IDisposable PushFormat(string messageFormat, params object[] args)
-		{
-			return Push(string.Format(messageFormat, args));
-		}
+    /// <summary>
+    /// Pushes a new context message.
+    /// </summary>
+    /// <param name="messageFormat">The new context message string format.</param>
+    /// <param name="args">Arguments to be passed into messageFormat.</param>
+    /// <returns>
+    /// An <see cref="IDisposable"/> that can be used to clean up 
+    /// the context stack.
+    /// </returns>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Pushes a new context onto the context stack. An <see cref="IDisposable"/>
+    /// is returned that can be used to clean up the context stack. This
+    /// can be easily combined with the <c>using</c> keyword to scope the
+    /// context.
+    /// </para>
+    /// </remarks>
+    /// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
+    /// <code lang="C#">
+    /// var someValue = "ExampleContext"
+    /// using(log4net.NDC.PushFormat("NDC_Message {0}", someValue))
+    /// {
+    ///    log.Warn("This should have an NDC message");
+    ///  }
+    /// </code>
+    /// </example>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static IDisposable PushFormat(string messageFormat, params object[] args)
+    {
+      return Push(string.Format(messageFormat, args));
+    }
 
-		/// <summary>
-		/// Removes the context information for this thread. It is
-		/// not required to call this method.
-		/// </summary>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// This method is not implemented.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static void Remove() 
-		{
-		}
+    /// <summary>
+    /// Removes the context information for this thread. It is
+    /// not required to call this method.
+    /// </summary>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// This method is not implemented.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static void Remove()
+    {
+    }
 
-		/// <summary>
-		/// Forces the stack depth to be at most <paramref name="maxDepth"/>.
-		/// </summary>
-		/// <param name="maxDepth">The maximum depth of the stack</param>
-		/// <remarks>
-		/// <note>
-		/// <para>
-		/// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
-		/// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
-		/// </para>
-		/// </note>
-		/// <para>
-		/// Forces the stack depth to be at most <paramref name="maxDepth"/>.
-		/// This may truncate the head of the stack. This only affects the 
-		/// stack in the current thread. Also it does not prevent it from
-		/// growing, it only sets the maximum depth at the time of the
-		/// call. This can be used to return to a known context depth.
-		/// </para>
-		/// </remarks>
-		/*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
-		public static void SetMaxDepth(int maxDepth) 
-		{
-			if (maxDepth >= 0)
-			{
-				log4net.Util.ThreadContextStack stack = ThreadContext.Stacks["NDC"];
+    /// <summary>
+    /// Forces the stack depth to be at most <paramref name="maxDepth"/>.
+    /// </summary>
+    /// <param name="maxDepth">The maximum depth of the stack</param>
+    /// <remarks>
+    /// <note>
+    /// <para>
+    /// The NDC is deprecated and has been replaced by the <see cref="ThreadContext.Stacks"/>.
+    /// The current NDC implementation forwards to the <c>ThreadContext.Stacks["NDC"]</c>.
+    /// </para>
+    /// </note>
+    /// <para>
+    /// Forces the stack depth to be at most <paramref name="maxDepth"/>.
+    /// This may truncate the head of the stack. This only affects the 
+    /// stack in the current thread. Also it does not prevent it from
+    /// growing, it only sets the maximum depth at the time of the
+    /// call. This can be used to return to a known context depth.
+    /// </para>
+    /// </remarks>
+    /*[Obsolete("NDC has been replaced by ThreadContext.Stacks")]*/
+    public static void SetMaxDepth(int maxDepth)
+    {
+      if (maxDepth >= 0)
+      {
+        log4net.Util.ThreadContextStack stack = ThreadContext.Stacks["NDC"];
 
-				if (maxDepth == 0)
-				{
-					stack.Clear();
-				}
-				else
-				{
-					while(stack.Count > maxDepth)
-					{
-						stack.Pop();
-					}
-				}
-			}
-		}
+        if (maxDepth == 0)
+        {
+          stack.Clear();
+        }
+        else
+        {
+          while (stack.Count > maxDepth)
+          {
+            stack.Pop();
+          }
+        }
+      }
+    }
 
-		#endregion Public Static Methods
-	}
+    #endregion Public Static Methods
+  }
 }
diff --git a/src/log4net/ObjectRenderer/DefaultRenderer.cs b/src/log4net/ObjectRenderer/DefaultRenderer.cs
index 8dc603d..ff23b19 100644
--- a/src/log4net/ObjectRenderer/DefaultRenderer.cs
+++ b/src/log4net/ObjectRenderer/DefaultRenderer.cs
@@ -26,285 +26,285 @@
 
 namespace log4net.ObjectRenderer
 {
-	/// <summary>
-	/// The default object Renderer.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The default renderer supports rendering objects and collections to strings.
-	/// </para>
-	/// <para>
-	/// See the <see cref="RenderObject"/> method for details of the output.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class DefaultRenderer : IObjectRenderer
-	{
-		#region Constructors
+  /// <summary>
+  /// The default object Renderer.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The default renderer supports rendering objects and collections to strings.
+  /// </para>
+  /// <para>
+  /// See the <see cref="RenderObject"/> method for details of the output.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class DefaultRenderer : IObjectRenderer
+  {
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public DefaultRenderer()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public DefaultRenderer()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IObjectRenderer
+    #region Implementation of IObjectRenderer
 
-		/// <summary>
-		/// Render the object <paramref name="obj"/> to a string
-		/// </summary>
-		/// <param name="rendererMap">The map used to lookup renderers</param>
-		/// <param name="obj">The object to render</param>
-		/// <param name="writer">The writer to render to</param>
-		/// <remarks>
-		/// <para>
-		/// Render the object <paramref name="obj"/> to a string.
-		/// </para>
-		/// <para>
-		/// The <paramref name="rendererMap"/> parameter is
-		/// provided to lookup and render other objects. This is
-		/// very useful where <paramref name="obj"/> contains
-		/// nested objects of unknown type. The <see cref="M:RendererMap.FindAndRender(object)"/>
-		/// method can be used to render these objects.
-		/// </para>
-		/// <para>
-		/// The default renderer supports rendering objects to strings as follows:
-		/// </para>
-		/// <list type="table">
-		///		<listheader>
-		///			<term>Value</term>
-		///			<description>Rendered String</description>
-		///		</listheader>
-		///		<item>
-		///			<term><c>null</c></term>
-		///			<description>
-		///			<para>"(null)"</para>
-		///			</description>
-		///		</item>
-		///		<item>
-		///			<term><see cref="Array"/></term>
-		///			<description>
-		///			<para>
-		///			For a one dimensional array this is the
-		///			array type name, an open brace, followed by a comma
-		///			separated list of the elements (using the appropriate
-		///			renderer), followed by a close brace. 
-		///			</para>
-		///			<para>
-		///			For example: <c>int[] {1, 2, 3}</c>.
-		///			</para>
-		///			<para>
-		///			If the array is not one dimensional the 
-		///			<c>Array.ToString()</c> is returned.
-		///			</para>
-		///			</description>
-		///		</item>
-		///		<item>
-		///			<term><see cref="IEnumerable"/>, <see cref="ICollection"/> &amp; <see cref="IEnumerator"/></term>
-		///			<description>
-		///			<para>
-		///			Rendered as an open brace, followed by a comma
-		///			separated list of the elements (using the appropriate
-		///			renderer), followed by a close brace.
-		///			</para>
-		///			<para>
-		///			For example: <c>{a, b, c}</c>.
-		///			</para>
-		///			<para>
-		///			All collection classes that implement <see cref="ICollection"/> its subclasses, 
-		///			or generic equivalents all implement the <see cref="IEnumerable"/> interface.
-		///			</para>
-		///			</description>
-		///		</item>		
-		///		<item>
-		///			<term><see cref="DictionaryEntry"/></term>
-		///			<description>
-		///			<para>
-		///			Rendered as the key, an equals sign ('='), and the value (using the appropriate
-		///			renderer). 
-		///			</para>
-		///			<para>
-		///			For example: <c>key=value</c>.
-		///			</para>
-		///			</description>
-		///		</item>		
-		///		<item>
-		///			<term>other</term>
-		///			<description>
-		///			<para><c>Object.ToString()</c></para>
-		///			</description>
-		///		</item>
-		/// </list>
-		/// </remarks>
-		public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
-		{
-			if (rendererMap == null)
-			{
-				throw new ArgumentNullException("rendererMap");
-			}
+    /// <summary>
+    /// Render the object <paramref name="obj"/> to a string
+    /// </summary>
+    /// <param name="rendererMap">The map used to lookup renderers</param>
+    /// <param name="obj">The object to render</param>
+    /// <param name="writer">The writer to render to</param>
+    /// <remarks>
+    /// <para>
+    /// Render the object <paramref name="obj"/> to a string.
+    /// </para>
+    /// <para>
+    /// The <paramref name="rendererMap"/> parameter is
+    /// provided to lookup and render other objects. This is
+    /// very useful where <paramref name="obj"/> contains
+    /// nested objects of unknown type. The <see cref="M:RendererMap.FindAndRender(object)"/>
+    /// method can be used to render these objects.
+    /// </para>
+    /// <para>
+    /// The default renderer supports rendering objects to strings as follows:
+    /// </para>
+    /// <list type="table">
+    ///    <listheader>
+    ///      <term>Value</term>
+    ///      <description>Rendered String</description>
+    ///    </listheader>
+    ///    <item>
+    ///      <term><c>null</c></term>
+    ///      <description>
+    ///      <para>"(null)"</para>
+    ///      </description>
+    ///    </item>
+    ///    <item>
+    ///      <term><see cref="Array"/></term>
+    ///      <description>
+    ///      <para>
+    ///      For a one dimensional array this is the
+    ///      array type name, an open brace, followed by a comma
+    ///      separated list of the elements (using the appropriate
+    ///      renderer), followed by a close brace. 
+    ///      </para>
+    ///      <para>
+    ///      For example: <c>int[] {1, 2, 3}</c>.
+    ///      </para>
+    ///      <para>
+    ///      If the array is not one dimensional the 
+    ///      <c>Array.ToString()</c> is returned.
+    ///      </para>
+    ///      </description>
+    ///    </item>
+    ///    <item>
+    ///      <term><see cref="IEnumerable"/>, <see cref="ICollection"/> &amp; <see cref="IEnumerator"/></term>
+    ///      <description>
+    ///      <para>
+    ///      Rendered as an open brace, followed by a comma
+    ///      separated list of the elements (using the appropriate
+    ///      renderer), followed by a close brace.
+    ///      </para>
+    ///      <para>
+    ///      For example: <c>{a, b, c}</c>.
+    ///      </para>
+    ///      <para>
+    ///      All collection classes that implement <see cref="ICollection"/> its subclasses, 
+    ///      or generic equivalents all implement the <see cref="IEnumerable"/> interface.
+    ///      </para>
+    ///      </description>
+    ///    </item>    
+    ///    <item>
+    ///      <term><see cref="DictionaryEntry"/></term>
+    ///      <description>
+    ///      <para>
+    ///      Rendered as the key, an equals sign ('='), and the value (using the appropriate
+    ///      renderer). 
+    ///      </para>
+    ///      <para>
+    ///      For example: <c>key=value</c>.
+    ///      </para>
+    ///      </description>
+    ///    </item>    
+    ///    <item>
+    ///      <term>other</term>
+    ///      <description>
+    ///      <para><c>Object.ToString()</c></para>
+    ///      </description>
+    ///    </item>
+    /// </list>
+    /// </remarks>
+    public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
+    {
+      if (rendererMap == null)
+      {
+        throw new ArgumentNullException("rendererMap");
+      }
 
-			if (obj == null)
-			{
-				writer.Write(SystemInfo.NullText);
-				return;
-			}
-			
-			Array objArray = obj as Array;
-			if (objArray != null)
-			{
-				RenderArray(rendererMap, objArray, writer);
-				return;
-			}
+      if (obj == null)
+      {
+        writer.Write(SystemInfo.NullText);
+        return;
+      }
 
-			// Test if we are dealing with some form of collection object
-			IEnumerable objEnumerable = obj as IEnumerable;
-			if (objEnumerable != null)
-			{
-				// Get a collection interface if we can as its .Count property may be more
-				// performant than getting the IEnumerator object and trying to advance it.
-				ICollection objCollection = obj as ICollection;
-				if (objCollection != null && objCollection.Count == 0)
-				{
-					writer.Write("{}");
-					return;
-				}
-				
-				// This is a special check to allow us to get the enumerator from the IDictionary
-				// interface as this guarantees us DictionaryEntry objects. Note that in .NET 2.0
-				// the generic IDictionary<> interface enumerates KeyValuePair objects rather than
-				// DictionaryEntry ones. However the implementation of the plain IDictionary 
-				// interface on the generic Dictionary<> still returns DictionaryEntry objects.
-				IDictionary objDictionary = obj as IDictionary;
-				if (objDictionary != null)
-				{
-					RenderEnumerator(rendererMap, objDictionary.GetEnumerator(), writer);
-					return;
-				}
+      Array objArray = obj as Array;
+      if (objArray != null)
+      {
+        RenderArray(rendererMap, objArray, writer);
+        return;
+      }
 
-				RenderEnumerator(rendererMap, objEnumerable.GetEnumerator(), writer);
-				return;
-			}
+      // Test if we are dealing with some form of collection object
+      IEnumerable objEnumerable = obj as IEnumerable;
+      if (objEnumerable != null)
+      {
+        // Get a collection interface if we can as its .Count property may be more
+        // performant than getting the IEnumerator object and trying to advance it.
+        ICollection objCollection = obj as ICollection;
+        if (objCollection != null && objCollection.Count == 0)
+        {
+          writer.Write("{}");
+          return;
+        }
 
-			IEnumerator objEnumerator = obj as IEnumerator;
-			if (objEnumerator != null)
-			{
-				RenderEnumerator(rendererMap, objEnumerator, writer);
-				return;
-			}
-			
-			if (obj is DictionaryEntry)
-			{
-				RenderDictionaryEntry(rendererMap, (DictionaryEntry)obj, writer);
-				return;
-			}
+        // This is a special check to allow us to get the enumerator from the IDictionary
+        // interface as this guarantees us DictionaryEntry objects. Note that in .NET 2.0
+        // the generic IDictionary<> interface enumerates KeyValuePair objects rather than
+        // DictionaryEntry ones. However the implementation of the plain IDictionary 
+        // interface on the generic Dictionary<> still returns DictionaryEntry objects.
+        IDictionary objDictionary = obj as IDictionary;
+        if (objDictionary != null)
+        {
+          RenderEnumerator(rendererMap, objDictionary.GetEnumerator(), writer);
+          return;
+        }
 
-			string str = obj.ToString();
-			writer.Write( (str==null) ? SystemInfo.NullText : str );
-		}
+        RenderEnumerator(rendererMap, objEnumerable.GetEnumerator(), writer);
+        return;
+      }
 
-		#endregion
+      IEnumerator objEnumerator = obj as IEnumerator;
+      if (objEnumerator != null)
+      {
+        RenderEnumerator(rendererMap, objEnumerator, writer);
+        return;
+      }
 
-		/// <summary>
-		/// Render the array argument into a string
-		/// </summary>
-		/// <param name="rendererMap">The map used to lookup renderers</param>
-		/// <param name="array">the array to render</param>
-		/// <param name="writer">The writer to render to</param>
-		/// <remarks>
-		/// <para>
-		/// For a one dimensional array this is the
-		///	array type name, an open brace, followed by a comma
-		///	separated list of the elements (using the appropriate
-		///	renderer), followed by a close brace. For example:
-		///	<c>int[] {1, 2, 3}</c>.
-		///	</para>
-		///	<para>
-		///	If the array is not one dimensional the 
-		///	<c>Array.ToString()</c> is returned.
-		///	</para>
-		/// </remarks>
-		private void RenderArray(RendererMap rendererMap, Array array, TextWriter writer)
-		{
-			if (array.Rank != 1)
-			{
-				writer.Write(array.ToString());
-			}
-			else
-			{
-				writer.Write(array.GetType().Name + " {");
-				int len = array.Length;
+      if (obj is DictionaryEntry)
+      {
+        RenderDictionaryEntry(rendererMap, (DictionaryEntry)obj, writer);
+        return;
+      }
 
-				if (len > 0)
-				{
-					rendererMap.FindAndRender(array.GetValue(0), writer);
-					for(int i=1; i<len; i++)
-					{
-						writer.Write(", ");
-						rendererMap.FindAndRender(array.GetValue(i), writer);
-					}
-				}
-				writer.Write("}");
-			}
-		}
+      string str = obj.ToString();
+      writer.Write((str == null) ? SystemInfo.NullText : str);
+    }
 
-		/// <summary>
-		/// Render the enumerator argument into a string
-		/// </summary>
-		/// <param name="rendererMap">The map used to lookup renderers</param>
-		/// <param name="enumerator">the enumerator to render</param>
-		/// <param name="writer">The writer to render to</param>
-		/// <remarks>
-		/// <para>
-		/// Rendered as an open brace, followed by a comma
-		///	separated list of the elements (using the appropriate
-		///	renderer), followed by a close brace. For example:
-		///	<c>{a, b, c}</c>.
-		///	</para>
-		/// </remarks>
-		private void RenderEnumerator(RendererMap rendererMap, IEnumerator enumerator, TextWriter writer)
-		{
-			writer.Write("{");
+    #endregion
 
-			if (enumerator != null && enumerator.MoveNext())
-			{
-				rendererMap.FindAndRender(enumerator.Current, writer);
+    /// <summary>
+    /// Render the array argument into a string
+    /// </summary>
+    /// <param name="rendererMap">The map used to lookup renderers</param>
+    /// <param name="array">the array to render</param>
+    /// <param name="writer">The writer to render to</param>
+    /// <remarks>
+    /// <para>
+    /// For a one dimensional array this is the
+    ///  array type name, an open brace, followed by a comma
+    ///  separated list of the elements (using the appropriate
+    ///  renderer), followed by a close brace. For example:
+    ///  <c>int[] {1, 2, 3}</c>.
+    ///  </para>
+    ///  <para>
+    ///  If the array is not one dimensional the 
+    ///  <c>Array.ToString()</c> is returned.
+    ///  </para>
+    /// </remarks>
+    private void RenderArray(RendererMap rendererMap, Array array, TextWriter writer)
+    {
+      if (array.Rank != 1)
+      {
+        writer.Write(array.ToString());
+      }
+      else
+      {
+        writer.Write(array.GetType().Name + " {");
+        int len = array.Length;
 
-				while (enumerator.MoveNext())
-				{
-					writer.Write(", ");
-					rendererMap.FindAndRender(enumerator.Current, writer);
-				}
-			}
+        if (len > 0)
+        {
+          rendererMap.FindAndRender(array.GetValue(0), writer);
+          for (int i = 1; i < len; i++)
+          {
+            writer.Write(", ");
+            rendererMap.FindAndRender(array.GetValue(i), writer);
+          }
+        }
+        writer.Write("}");
+      }
+    }
 
-			writer.Write("}");
-		}
+    /// <summary>
+    /// Render the enumerator argument into a string
+    /// </summary>
+    /// <param name="rendererMap">The map used to lookup renderers</param>
+    /// <param name="enumerator">the enumerator to render</param>
+    /// <param name="writer">The writer to render to</param>
+    /// <remarks>
+    /// <para>
+    /// Rendered as an open brace, followed by a comma
+    ///  separated list of the elements (using the appropriate
+    ///  renderer), followed by a close brace. For example:
+    ///  <c>{a, b, c}</c>.
+    ///  </para>
+    /// </remarks>
+    private void RenderEnumerator(RendererMap rendererMap, IEnumerator enumerator, TextWriter writer)
+    {
+      writer.Write("{");
 
-		/// <summary>
-		/// Render the DictionaryEntry argument into a string
-		/// </summary>
-		/// <param name="rendererMap">The map used to lookup renderers</param>
-		/// <param name="entry">the DictionaryEntry to render</param>
-		/// <param name="writer">The writer to render to</param>
-		/// <remarks>
-		/// <para>
-		/// Render the key, an equals sign ('='), and the value (using the appropriate
-		///	renderer). For example: <c>key=value</c>.
-		///	</para>
-		/// </remarks>
-		private void RenderDictionaryEntry(RendererMap rendererMap, DictionaryEntry entry, TextWriter writer)
-		{
-			rendererMap.FindAndRender(entry.Key, writer);
-			writer.Write("=");
-			rendererMap.FindAndRender(entry.Value, writer);
-		}	
-	}
+      if (enumerator != null && enumerator.MoveNext())
+      {
+        rendererMap.FindAndRender(enumerator.Current, writer);
+
+        while (enumerator.MoveNext())
+        {
+          writer.Write(", ");
+          rendererMap.FindAndRender(enumerator.Current, writer);
+        }
+      }
+
+      writer.Write("}");
+    }
+
+    /// <summary>
+    /// Render the DictionaryEntry argument into a string
+    /// </summary>
+    /// <param name="rendererMap">The map used to lookup renderers</param>
+    /// <param name="entry">the DictionaryEntry to render</param>
+    /// <param name="writer">The writer to render to</param>
+    /// <remarks>
+    /// <para>
+    /// Render the key, an equals sign ('='), and the value (using the appropriate
+    ///  renderer). For example: <c>key=value</c>.
+    ///  </para>
+    /// </remarks>
+    private void RenderDictionaryEntry(RendererMap rendererMap, DictionaryEntry entry, TextWriter writer)
+    {
+      rendererMap.FindAndRender(entry.Key, writer);
+      writer.Write("=");
+      rendererMap.FindAndRender(entry.Value, writer);
+    }
+  }
 }
diff --git a/src/log4net/ObjectRenderer/IObjectRenderer.cs b/src/log4net/ObjectRenderer/IObjectRenderer.cs
index 3a79d1e..b9d673b 100644
--- a/src/log4net/ObjectRenderer/IObjectRenderer.cs
+++ b/src/log4net/ObjectRenderer/IObjectRenderer.cs
@@ -22,40 +22,40 @@
 
 namespace log4net.ObjectRenderer
 {
-	/// <summary>
-	/// Implement this interface in order to render objects as strings
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Certain types require special case conversion to
-	/// string form. This conversion is done by an object renderer.
-	/// Object renderers implement the <see cref="IObjectRenderer"/>
-	/// interface.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IObjectRenderer
-	{
-		/// <summary>
-		/// Render the object <paramref name="obj"/> to a string
-		/// </summary>
-		/// <param name="rendererMap">The map used to lookup renderers</param>
-		/// <param name="obj">The object to render</param>
-		/// <param name="writer">The writer to render to</param>
-		/// <remarks>
-		/// <para>
-		/// Render the object <paramref name="obj"/> to a 
-		/// string.
-		/// </para>
-		/// <para>
-		/// The <paramref name="rendererMap"/> parameter is
-		/// provided to lookup and render other objects. This is
-		/// very useful where <paramref name="obj"/> contains
-		/// nested objects of unknown type. The <see cref="M:RendererMap.FindAndRender(object, TextWriter)"/>
-		/// method can be used to render these objects.
-		/// </para>
-		/// </remarks>
-		void RenderObject(RendererMap rendererMap, object obj, TextWriter writer);
-	}
+  /// <summary>
+  /// Implement this interface in order to render objects as strings
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Certain types require special case conversion to
+  /// string form. This conversion is done by an object renderer.
+  /// Object renderers implement the <see cref="IObjectRenderer"/>
+  /// interface.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IObjectRenderer
+  {
+    /// <summary>
+    /// Render the object <paramref name="obj"/> to a string
+    /// </summary>
+    /// <param name="rendererMap">The map used to lookup renderers</param>
+    /// <param name="obj">The object to render</param>
+    /// <param name="writer">The writer to render to</param>
+    /// <remarks>
+    /// <para>
+    /// Render the object <paramref name="obj"/> to a 
+    /// string.
+    /// </para>
+    /// <para>
+    /// The <paramref name="rendererMap"/> parameter is
+    /// provided to lookup and render other objects. This is
+    /// very useful where <paramref name="obj"/> contains
+    /// nested objects of unknown type. The <see cref="M:RendererMap.FindAndRender(object, TextWriter)"/>
+    /// method can be used to render these objects.
+    /// </para>
+    /// </remarks>
+    void RenderObject(RendererMap rendererMap, object obj, TextWriter writer);
+  }
 }
diff --git a/src/log4net/ObjectRenderer/RendererMap.cs b/src/log4net/ObjectRenderer/RendererMap.cs
index a20ae19..0e4284d 100644
--- a/src/log4net/ObjectRenderer/RendererMap.cs
+++ b/src/log4net/ObjectRenderer/RendererMap.cs
@@ -27,307 +27,307 @@
 
 namespace log4net.ObjectRenderer
 {
-	/// <summary>
-	/// Map class objects to an <see cref="IObjectRenderer"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Maintains a mapping between types that require special
-	/// rendering and the <see cref="IObjectRenderer"/> that
-	/// is used to render them.
-	/// </para>
-	/// <para>
-	/// The <see cref="M:FindAndRender(object)"/> method is used to render an
-	/// <c>object</c> using the appropriate renderers defined in this map.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class RendererMap
-	{
-		private static readonly Type declaringType = typeof(RendererMap);
+  /// <summary>
+  /// Map class objects to an <see cref="IObjectRenderer"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Maintains a mapping between types that require special
+  /// rendering and the <see cref="IObjectRenderer"/> that
+  /// is used to render them.
+  /// </para>
+  /// <para>
+  /// The <see cref="M:FindAndRender(object)"/> method is used to render an
+  /// <c>object</c> using the appropriate renderers defined in this map.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class RendererMap
+  {
+    private static readonly Type declaringType = typeof(RendererMap);
 
-		#region Member Variables
+    #region Member Variables
 
-		private readonly Hashtable m_map = new();
-		private readonly Hashtable m_cache = new();
+    private readonly Hashtable m_map = new();
+    private readonly Hashtable m_cache = new();
 
-		private static IObjectRenderer s_defaultRenderer = new DefaultRenderer();
+    private static IObjectRenderer s_defaultRenderer = new DefaultRenderer();
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Render <paramref name="obj"/> using the appropriate renderer.
-		/// </summary>
-		/// <param name="obj">the object to render to a string</param>
-		/// <returns>the object rendered as a string</returns>
-		/// <remarks>
-		/// <para>
-		/// This is a convenience method used to render an object to a string.
-		/// The alternative method <see cref="M:FindAndRender(object,TextWriter)"/>
-		/// should be used when streaming output to a <see cref="TextWriter"/>.
-		/// </para>
-		/// </remarks>
-		public string FindAndRender(object obj)
-		{
-			// Optimisation for strings
-			string strData = obj as String;
-			if (strData != null)
-			{
-				return strData;
-			}
+    /// <summary>
+    /// Render <paramref name="obj"/> using the appropriate renderer.
+    /// </summary>
+    /// <param name="obj">the object to render to a string</param>
+    /// <returns>the object rendered as a string</returns>
+    /// <remarks>
+    /// <para>
+    /// This is a convenience method used to render an object to a string.
+    /// The alternative method <see cref="M:FindAndRender(object,TextWriter)"/>
+    /// should be used when streaming output to a <see cref="TextWriter"/>.
+    /// </para>
+    /// </remarks>
+    public string FindAndRender(object obj)
+    {
+      // Optimisation for strings
+      string strData = obj as String;
+      if (strData != null)
+      {
+        return strData;
+      }
 
-			using StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
-			FindAndRender(obj, stringWriter);
-			return stringWriter.ToString();
-		}
+      using StringWriter stringWriter = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
+      FindAndRender(obj, stringWriter);
+      return stringWriter.ToString();
+    }
 
-		/// <summary>
-		/// Render <paramref name="obj"/> using the appropriate renderer.
-		/// </summary>
-		/// <param name="obj">the object to render to a string</param>
-		/// <param name="writer">The writer to render to</param>
-		/// <remarks>
-		/// <para>
-		/// Find the appropriate renderer for the type of the
-		/// <paramref name="obj"/> parameter. This is accomplished by calling the
-		/// <see cref="M:Get(Type)"/> method. Once a renderer is found, it is
-		/// applied on the object <paramref name="obj"/> and the result is returned
-		/// as a <see cref="string"/>.
-		/// </para>
-		/// </remarks>
-		public void FindAndRender(object obj, TextWriter writer) 
-		{
-			if (obj == null)
-			{
-				writer.Write(SystemInfo.NullText);
-			}
-			else 
-			{
-				// Optimisation for strings
-				string str = obj as string;
-				if (str != null)
-				{
-					writer.Write(str);
-				}
-				else
-				{
-					// Lookup the renderer for the specific type
-					try
-					{
-						Get(obj.GetType()).RenderObject(this, obj, writer);
-					}
-					catch(Exception ex)
-					{
-						// Exception rendering the object
-						LogLog.Error(declaringType, "Exception while rendering object of type ["+obj.GetType().FullName+"]", ex);
+    /// <summary>
+    /// Render <paramref name="obj"/> using the appropriate renderer.
+    /// </summary>
+    /// <param name="obj">the object to render to a string</param>
+    /// <param name="writer">The writer to render to</param>
+    /// <remarks>
+    /// <para>
+    /// Find the appropriate renderer for the type of the
+    /// <paramref name="obj"/> parameter. This is accomplished by calling the
+    /// <see cref="M:Get(Type)"/> method. Once a renderer is found, it is
+    /// applied on the object <paramref name="obj"/> and the result is returned
+    /// as a <see cref="string"/>.
+    /// </para>
+    /// </remarks>
+    public void FindAndRender(object obj, TextWriter writer)
+    {
+      if (obj == null)
+      {
+        writer.Write(SystemInfo.NullText);
+      }
+      else
+      {
+        // Optimisation for strings
+        string str = obj as string;
+        if (str != null)
+        {
+          writer.Write(str);
+        }
+        else
+        {
+          // Lookup the renderer for the specific type
+          try
+          {
+            Get(obj.GetType()).RenderObject(this, obj, writer);
+          }
+          catch (Exception ex)
+          {
+            // Exception rendering the object
+            LogLog.Error(declaringType, "Exception while rendering object of type [" + obj.GetType().FullName + "]", ex);
 
-						// return default message
-						string objectTypeName = "";
-						if (obj != null && obj.GetType() != null)
-						{
-							objectTypeName = obj.GetType().FullName;
-						}
+            // return default message
+            string objectTypeName = "";
+            if (obj != null && obj.GetType() != null)
+            {
+              objectTypeName = obj.GetType().FullName;
+            }
 
-						writer.Write("<log4net.Error>Exception rendering object type ["+objectTypeName+"]");
-						if (ex != null)
-						{
-							string exceptionText = null;
+            writer.Write("<log4net.Error>Exception rendering object type [" + objectTypeName + "]");
+            if (ex != null)
+            {
+              string exceptionText = null;
 
-							try
-							{
-								exceptionText = ex.ToString();
-							}
-							catch
-							{
-								// Ignore exception
-							}
+              try
+              {
+                exceptionText = ex.ToString();
+              }
+              catch
+              {
+                // Ignore exception
+              }
 
-							writer.Write("<stackTrace>" + exceptionText + "</stackTrace>");
-						}
-						writer.Write("</log4net.Error>");
-					}
-				}
-			}
-		}
+              writer.Write("<stackTrace>" + exceptionText + "</stackTrace>");
+            }
+            writer.Write("</log4net.Error>");
+          }
+        }
+      }
+    }
 
-		/// <summary>
-		/// Gets the renderer for the specified object type
-		/// </summary>
-		/// <param name="obj">the object to lookup the renderer for</param>
-		/// <returns>the renderer for <paramref name="obj"/></returns>
-		/// <remarks>
-		/// <param>
-		/// Gets the renderer for the specified object type.
-		/// </param>
-		/// <param>
-		/// Syntactic sugar method that calls <see cref="M:Get(Type)"/> 
-		/// with the type of the object parameter.
-		/// </param>
-		/// </remarks>
-		public IObjectRenderer Get(Object obj) 
-		{
-			if (obj == null) 
-			{
-				return null;
-			}
-			else
-			{
-				return Get(obj.GetType());
-			}
-		}
-  
-		/// <summary>
-		/// Gets the renderer for the specified type
-		/// </summary>
-		/// <param name="type">the type to lookup the renderer for</param>
-		/// <returns>the renderer for the specified type</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the renderer for the specified type.
-		/// If no specific renderer has been defined the
-		/// <see cref="DefaultRenderer"/> will be returned.
-		/// </para>
-		/// </remarks>
-		public IObjectRenderer Get(Type type) 
-		{
-			if (type == null)
-			{
-				throw new ArgumentNullException("type");
-			}
+    /// <summary>
+    /// Gets the renderer for the specified object type
+    /// </summary>
+    /// <param name="obj">the object to lookup the renderer for</param>
+    /// <returns>the renderer for <paramref name="obj"/></returns>
+    /// <remarks>
+    /// <param>
+    /// Gets the renderer for the specified object type.
+    /// </param>
+    /// <param>
+    /// Syntactic sugar method that calls <see cref="M:Get(Type)"/> 
+    /// with the type of the object parameter.
+    /// </param>
+    /// </remarks>
+    public IObjectRenderer Get(Object obj)
+    {
+      if (obj == null)
+      {
+        return null;
+      }
+      else
+      {
+        return Get(obj.GetType());
+      }
+    }
 
-			IObjectRenderer result = null;
+    /// <summary>
+    /// Gets the renderer for the specified type
+    /// </summary>
+    /// <param name="type">the type to lookup the renderer for</param>
+    /// <returns>the renderer for the specified type</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the renderer for the specified type.
+    /// If no specific renderer has been defined the
+    /// <see cref="DefaultRenderer"/> will be returned.
+    /// </para>
+    /// </remarks>
+    public IObjectRenderer Get(Type type)
+    {
+      if (type == null)
+      {
+        throw new ArgumentNullException("type");
+      }
 
-			// Check cache
-			result = (IObjectRenderer)m_cache[type];
+      IObjectRenderer result = null;
 
-			if (result == null)
-			{
+      // Check cache
+      result = (IObjectRenderer)m_cache[type];
+
+      if (result == null)
+      {
 #if NETSTANDARD1_3
-				for (Type cur = type; cur != null; cur = cur.GetTypeInfo().BaseType)
+        for (Type cur = type; cur != null; cur = cur.GetTypeInfo().BaseType)
 #else
-				for(Type cur = type; cur != null; cur = cur.BaseType)
+        for (Type cur = type; cur != null; cur = cur.BaseType)
 #endif
-				{
-					// Search the type's interfaces
-					result = SearchTypeAndInterfaces(cur);
-					if (result != null)
-					{
-						break;
-					}
-				}
+        {
+          // Search the type's interfaces
+          result = SearchTypeAndInterfaces(cur);
+          if (result != null)
+          {
+            break;
+          }
+        }
 
-				// if not set then use the default renderer
-				if (result == null)
-				{
-					result = s_defaultRenderer;
-				}
+        // if not set then use the default renderer
+        if (result == null)
+        {
+          result = s_defaultRenderer;
+        }
 
-				// Add to cache
-				lock (m_cache)
-				{
-					m_cache[type] = result;
-				}
-			}
+        // Add to cache
+        lock (m_cache)
+        {
+          m_cache[type] = result;
+        }
+      }
 
-			return result;
-		}  
+      return result;
+    }
 
-		/// <summary>
-		/// Internal function to recursively search interfaces
-		/// </summary>
-		/// <param name="type">the type to lookup the renderer for</param>
-		/// <returns>the renderer for the specified type</returns>
-		private IObjectRenderer SearchTypeAndInterfaces(Type type) 
-		{
-			IObjectRenderer r = (IObjectRenderer)m_map[type];
-			if (r != null) 
-			{
-				return r;
-			} 
-			else 
-			{
-				foreach(Type t in type.GetInterfaces())
-				{
-					r = SearchTypeAndInterfaces(t);
-					if (r != null)
-					{
-						return r; 
-					}
-				}
-			}
-			return null;
-		}
+    /// <summary>
+    /// Internal function to recursively search interfaces
+    /// </summary>
+    /// <param name="type">the type to lookup the renderer for</param>
+    /// <returns>the renderer for the specified type</returns>
+    private IObjectRenderer SearchTypeAndInterfaces(Type type)
+    {
+      IObjectRenderer r = (IObjectRenderer)m_map[type];
+      if (r != null)
+      {
+        return r;
+      }
+      else
+      {
+        foreach (Type t in type.GetInterfaces())
+        {
+          r = SearchTypeAndInterfaces(t);
+          if (r != null)
+          {
+            return r;
+          }
+        }
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Get the default renderer instance
-		/// </summary>
-		/// <value>the default renderer</value>
-		/// <remarks>
-		/// <para>
-		/// Get the default renderer
-		/// </para>
-		/// </remarks>
-		public IObjectRenderer DefaultRenderer
-		{
-			get { return s_defaultRenderer; }
-		}
+    /// <summary>
+    /// Get the default renderer instance
+    /// </summary>
+    /// <value>the default renderer</value>
+    /// <remarks>
+    /// <para>
+    /// Get the default renderer
+    /// </para>
+    /// </remarks>
+    public IObjectRenderer DefaultRenderer
+    {
+      get { return s_defaultRenderer; }
+    }
 
-		/// <summary>
-		/// Clear the map of renderers
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clear the custom renderers defined by using
-		/// <see cref="Put"/>. The <see cref="DefaultRenderer"/>
-		/// cannot be removed.
-		/// </para>
-		/// </remarks>
-		public void Clear() 
-		{
-			lock (m_map)
-			{
-				m_map.Clear();
-			}
+    /// <summary>
+    /// Clear the map of renderers
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clear the custom renderers defined by using
+    /// <see cref="Put"/>. The <see cref="DefaultRenderer"/>
+    /// cannot be removed.
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      lock (m_map)
+      {
+        m_map.Clear();
+      }
 
-			lock (m_cache)
-			{
-				m_cache.Clear();
-			}
-		}
+      lock (m_cache)
+      {
+        m_cache.Clear();
+      }
+    }
 
-		/// <summary>
-		/// Register an <see cref="IObjectRenderer"/> for <paramref name="typeToRender"/>. 
-		/// </summary>
-		/// <param name="typeToRender">the type that will be rendered by <paramref name="renderer"/></param>
-		/// <param name="renderer">the renderer for <paramref name="typeToRender"/></param>
-		/// <remarks>
-		/// <para>
-		/// Register an object renderer for a specific source type.
-		/// This renderer will be returned from a call to <see cref="M:Get(Type)"/>
-		/// specifying the same <paramref name="typeToRender"/> as an argument.
-		/// </para>
-		/// </remarks>
-		public void Put(Type typeToRender, IObjectRenderer renderer) 
-		{
-			lock (m_cache)
-			{
-				m_cache.Clear();
-			}
+    /// <summary>
+    /// Register an <see cref="IObjectRenderer"/> for <paramref name="typeToRender"/>. 
+    /// </summary>
+    /// <param name="typeToRender">the type that will be rendered by <paramref name="renderer"/></param>
+    /// <param name="renderer">the renderer for <paramref name="typeToRender"/></param>
+    /// <remarks>
+    /// <para>
+    /// Register an object renderer for a specific source type.
+    /// This renderer will be returned from a call to <see cref="M:Get(Type)"/>
+    /// specifying the same <paramref name="typeToRender"/> as an argument.
+    /// </para>
+    /// </remarks>
+    public void Put(Type typeToRender, IObjectRenderer renderer)
+    {
+      lock (m_cache)
+      {
+        m_cache.Clear();
+      }
 
-			if (typeToRender == null)
-			{
-				throw new ArgumentNullException("typeToRender");
-			}
-			if (renderer == null)
-			{
-				throw new ArgumentNullException("renderer");
-			}
+      if (typeToRender == null)
+      {
+        throw new ArgumentNullException("typeToRender");
+      }
+      if (renderer == null)
+      {
+        throw new ArgumentNullException("renderer");
+      }
 
-			lock (m_map)
-			{
-				m_map[typeToRender] = renderer;
-			}
-		}	
-	}
+      lock (m_map)
+      {
+        m_map[typeToRender] = renderer;
+      }
+    }
+  }
 }
diff --git a/src/log4net/Plugin/IPlugin.cs b/src/log4net/Plugin/IPlugin.cs
index 065898e..da66a9c 100644
--- a/src/log4net/Plugin/IPlugin.cs
+++ b/src/log4net/Plugin/IPlugin.cs
@@ -21,65 +21,65 @@
 
 namespace log4net.Plugin
 {
-	/// <summary>
-	/// Interface implemented by logger repository plugins.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Plugins define additional behavior that can be associated
-	/// with a <see cref="log4net.Repository.ILoggerRepository"/>.
-	/// The <see cref="PluginMap"/> held by the <see cref="log4net.Repository.ILoggerRepository.PluginMap"/>
-	/// property is used to store the plugins for a repository.
-	/// </para>
-	/// <para>
-	/// The <c>log4net.Config.PluginAttribute</c> can be used to
-	/// attach plugins to repositories created using configuration
-	/// attributes.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IPlugin
-	{
-		/// <summary>
-		/// Gets the name of the plugin.
-		/// </summary>
-		/// <value>
-		/// The name of the plugin.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Plugins are stored in the <see cref="PluginMap"/>
-		/// keyed by name. Each plugin instance attached to a
-		/// repository must be a unique name.
-		/// </para>
-		/// </remarks>
-		string Name { get; }
+  /// <summary>
+  /// Interface implemented by logger repository plugins.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Plugins define additional behavior that can be associated
+  /// with a <see cref="log4net.Repository.ILoggerRepository"/>.
+  /// The <see cref="PluginMap"/> held by the <see cref="log4net.Repository.ILoggerRepository.PluginMap"/>
+  /// property is used to store the plugins for a repository.
+  /// </para>
+  /// <para>
+  /// The <c>log4net.Config.PluginAttribute</c> can be used to
+  /// attach plugins to repositories created using configuration
+  /// attributes.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IPlugin
+  {
+    /// <summary>
+    /// Gets the name of the plugin.
+    /// </summary>
+    /// <value>
+    /// The name of the plugin.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Plugins are stored in the <see cref="PluginMap"/>
+    /// keyed by name. Each plugin instance attached to a
+    /// repository must be a unique name.
+    /// </para>
+    /// </remarks>
+    string Name { get; }
 
-		/// <summary>
-		/// Attaches the plugin to the specified <see cref="ILoggerRepository"/>.
-		/// </summary>
-		/// <param name="repository">The <see cref="ILoggerRepository"/> that this plugin should be attached to.</param>
-		/// <remarks>
-		/// <para>
-		/// A plugin may only be attached to a single repository.
-		/// </para>
-		/// <para>
-		/// This method is called when the plugin is attached to the repository.
-		/// </para>
-		/// </remarks>
-		void Attach(ILoggerRepository repository);
+    /// <summary>
+    /// Attaches the plugin to the specified <see cref="ILoggerRepository"/>.
+    /// </summary>
+    /// <param name="repository">The <see cref="ILoggerRepository"/> that this plugin should be attached to.</param>
+    /// <remarks>
+    /// <para>
+    /// A plugin may only be attached to a single repository.
+    /// </para>
+    /// <para>
+    /// This method is called when the plugin is attached to the repository.
+    /// </para>
+    /// </remarks>
+    void Attach(ILoggerRepository repository);
 
-		/// <summary>
-		/// Is called when the plugin is to shutdown.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method is called to notify the plugin that 
-		/// it should stop operating and should detach from
-		/// the repository.
-		/// </para>
-		/// </remarks>
-		void Shutdown();
-	}
+    /// <summary>
+    /// Is called when the plugin is to shutdown.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method is called to notify the plugin that 
+    /// it should stop operating and should detach from
+    /// the repository.
+    /// </para>
+    /// </remarks>
+    void Shutdown();
+  }
 }
diff --git a/src/log4net/Plugin/IPluginFactory.cs b/src/log4net/Plugin/IPluginFactory.cs
index 460a4d4..ce168a9 100644
--- a/src/log4net/Plugin/IPluginFactory.cs
+++ b/src/log4net/Plugin/IPluginFactory.cs
@@ -19,27 +19,27 @@
 
 namespace log4net.Plugin
 {
-	/// <summary>
-	/// Interface used to create plugins.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface used to create  a plugin.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IPluginFactory
-	{
-		/// <summary>
-		/// Creates the plugin object.
-		/// </summary>
-		/// <returns>the new plugin instance</returns>
-		/// <remarks>
-		/// <para>
-		/// Create and return a new plugin instance.
-		/// </para>
-		/// </remarks>
-		IPlugin CreatePlugin();
-	}
+  /// <summary>
+  /// Interface used to create plugins.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface used to create  a plugin.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IPluginFactory
+  {
+    /// <summary>
+    /// Creates the plugin object.
+    /// </summary>
+    /// <returns>the new plugin instance</returns>
+    /// <remarks>
+    /// <para>
+    /// Create and return a new plugin instance.
+    /// </para>
+    /// </remarks>
+    IPlugin CreatePlugin();
+  }
 }
diff --git a/src/log4net/Plugin/PluginCollection.cs b/src/log4net/Plugin/PluginCollection.cs
index 7e7d4e2..4019d67 100644
--- a/src/log4net/Plugin/PluginCollection.cs
+++ b/src/log4net/Plugin/PluginCollection.cs
@@ -22,855 +22,855 @@
 
 namespace log4net.Plugin
 {
-	/// <summary>
-	///	A strongly-typed collection of <see cref="IPlugin"/> objects.
-	/// </summary>
-	/// <author>Nicko Cadell</author>
-	public class PluginCollection : ICollection, IList, IEnumerable
+  /// <summary>
+  ///  A strongly-typed collection of <see cref="IPlugin"/> objects.
+  /// </summary>
+  /// <author>Nicko Cadell</author>
+  public class PluginCollection : ICollection, IList, IEnumerable
 #if !NETSTANDARD1_3
-		, ICloneable
+    , ICloneable
 #endif
-	{
-		#region Interfaces
+  {
+    #region Interfaces
 
-		/// <summary>
-		/// Supports type-safe iteration over a <see cref="PluginCollection"/>.
-		/// </summary>
-		/// <exclude/>
-		public interface IPluginCollectionEnumerator
-		{
-			/// <summary>
-			///	Gets the current element in the collection.
-			/// </summary>
-			IPlugin Current { get; }
+    /// <summary>
+    /// Supports type-safe iteration over a <see cref="PluginCollection"/>.
+    /// </summary>
+    /// <exclude/>
+    public interface IPluginCollectionEnumerator
+    {
+      /// <summary>
+      ///  Gets the current element in the collection.
+      /// </summary>
+      IPlugin Current { get; }
 
-			/// <summary>
-			///	Advances the enumerator to the next element in the collection.
-			/// </summary>
-			/// <returns>
-			///	<c>true</c> if the enumerator was successfully advanced to the next element; 
-			///	<c>false</c> if the enumerator has passed the end of the collection.
-			/// </returns>
-			/// <exception cref="InvalidOperationException">
-			///	The collection was modified after the enumerator was created.
-			/// </exception>
-			bool MoveNext();
+      /// <summary>
+      ///  Advances the enumerator to the next element in the collection.
+      /// </summary>
+      /// <returns>
+      ///  <c>true</c> if the enumerator was successfully advanced to the next element; 
+      ///  <c>false</c> if the enumerator has passed the end of the collection.
+      /// </returns>
+      /// <exception cref="InvalidOperationException">
+      ///  The collection was modified after the enumerator was created.
+      /// </exception>
+      bool MoveNext();
 
-			/// <summary>
-			///	Sets the enumerator to its initial position, before the first element in the collection.
-			/// </summary>
-			void Reset();
-		}
+      /// <summary>
+      ///  Sets the enumerator to its initial position, before the first element in the collection.
+      /// </summary>
+      void Reset();
+    }
 
-		#endregion Interfaces
+    #endregion Interfaces
 
-		private const int DEFAULT_CAPACITY = 16;
+    private const int DEFAULT_CAPACITY = 16;
 
-		#region Implementation (data)
+    #region Implementation (data)
 
-		private IPlugin[] m_array;
-		private int m_count = 0;
-		private int m_version = 0;
+    private IPlugin[] m_array;
+    private int m_count = 0;
+    private int m_version = 0;
 
-		#endregion Implementation (data)
-	
-		#region Static Wrappers
+    #endregion Implementation (data)
 
-		/// <summary>
-		///	Creates a read-only wrapper for a <c>PluginCollection</c> instance.
-		/// </summary>
-		/// <param name="list">list to create a readonly wrapper arround</param>
-		/// <returns>
-		/// A <c>PluginCollection</c> wrapper that is read-only.
-		/// </returns>
-		public static PluginCollection ReadOnly(PluginCollection list)
-		{
-			if(list == null) throw new ArgumentNullException("list");
+    #region Static Wrappers
 
-			return new ReadOnlyPluginCollection(list);
-		}
+    /// <summary>
+    ///  Creates a read-only wrapper for a <c>PluginCollection</c> instance.
+    /// </summary>
+    /// <param name="list">list to create a readonly wrapper arround</param>
+    /// <returns>
+    /// A <c>PluginCollection</c> wrapper that is read-only.
+    /// </returns>
+    public static PluginCollection ReadOnly(PluginCollection list)
+    {
+      if (list == null) throw new ArgumentNullException("list");
 
-		#endregion
+      return new ReadOnlyPluginCollection(list);
+    }
 
-		#region Constructors
+    #endregion
 
-		/// <summary>
-		///	Initializes a new instance of the <c>PluginCollection</c> class
-		///	that is empty and has the default initial capacity.
-		/// </summary>
-		public PluginCollection()
-		{
-			m_array = new IPlugin[DEFAULT_CAPACITY];
-		}
-		
-		/// <summary>
-		/// Initializes a new instance of the <c>PluginCollection</c> class
-		/// that has the specified initial capacity.
-		/// </summary>
-		/// <param name="capacity">
-		/// The number of elements that the new <c>PluginCollection</c> is initially capable of storing.
-		/// </param>
-		public PluginCollection(int capacity)
-		{
-			m_array = new IPlugin[capacity];
-		}
+    #region Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <c>PluginCollection</c> class
-		/// that contains elements copied from the specified <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="c">The <c>PluginCollection</c> whose elements are copied to the new collection.</param>
-		public PluginCollection(PluginCollection c)
-		{
-			m_array = new IPlugin[c.Count];
-			AddRange(c);
-		}
+    /// <summary>
+    ///  Initializes a new instance of the <c>PluginCollection</c> class
+    ///  that is empty and has the default initial capacity.
+    /// </summary>
+    public PluginCollection()
+    {
+      m_array = new IPlugin[DEFAULT_CAPACITY];
+    }
 
-		/// <summary>
-		/// Initializes a new instance of the <c>PluginCollection</c> class
-		/// that contains elements copied from the specified <see cref="IPlugin"/> array.
-		/// </summary>
-		/// <param name="a">The <see cref="IPlugin"/> array whose elements are copied to the new list.</param>
-		public PluginCollection(IPlugin[] a)
-		{
-			m_array = new IPlugin[a.Length];
-			AddRange(a);
-		}
-		
-		/// <summary>
-		/// Initializes a new instance of the <c>PluginCollection</c> class
-		/// that contains elements copied from the specified <see cref="IPlugin"/> collection.
-		/// </summary>
-		/// <param name="col">The <see cref="IPlugin"/> collection whose elements are copied to the new list.</param>
-		public PluginCollection(ICollection col)
-		{
-			m_array = new IPlugin[col.Count];
-			AddRange(col);
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>PluginCollection</c> class
+    /// that has the specified initial capacity.
+    /// </summary>
+    /// <param name="capacity">
+    /// The number of elements that the new <c>PluginCollection</c> is initially capable of storing.
+    /// </param>
+    public PluginCollection(int capacity)
+    {
+      m_array = new IPlugin[capacity];
+    }
 
-		/// <summary>
-		/// Type visible only to our subclasses
-		/// Used to access protected constructor
-		/// </summary>
-		/// <exclude/>
-		protected internal enum Tag 
-		{
-			/// <summary>
-			/// A value
-			/// </summary>
-			Default
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>PluginCollection</c> class
+    /// that contains elements copied from the specified <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="c">The <c>PluginCollection</c> whose elements are copied to the new collection.</param>
+    public PluginCollection(PluginCollection c)
+    {
+      m_array = new IPlugin[c.Count];
+      AddRange(c);
+    }
 
-		/// <summary>
-		/// Allow subclasses to avoid our default constructors
-		/// </summary>
-		/// <param name="tag"></param>
-		/// <exclude/>
-		protected internal PluginCollection(Tag tag)
-		{
-			m_array = null;
-		}
+    /// <summary>
+    /// Initializes a new instance of the <c>PluginCollection</c> class
+    /// that contains elements copied from the specified <see cref="IPlugin"/> array.
+    /// </summary>
+    /// <param name="a">The <see cref="IPlugin"/> array whose elements are copied to the new list.</param>
+    public PluginCollection(IPlugin[] a)
+    {
+      m_array = new IPlugin[a.Length];
+      AddRange(a);
+    }
 
-		#endregion
-		
-		#region Operations (type-safe ICollection)
+    /// <summary>
+    /// Initializes a new instance of the <c>PluginCollection</c> class
+    /// that contains elements copied from the specified <see cref="IPlugin"/> collection.
+    /// </summary>
+    /// <param name="col">The <see cref="IPlugin"/> collection whose elements are copied to the new list.</param>
+    public PluginCollection(ICollection col)
+    {
+      m_array = new IPlugin[col.Count];
+      AddRange(col);
+    }
 
-		/// <summary>
-		/// Gets the number of elements actually contained in the <c>PluginCollection</c>.
-		/// </summary>
-		public virtual int Count
-		{
-			get { return m_count; }
-		}
+    /// <summary>
+    /// Type visible only to our subclasses
+    /// Used to access protected constructor
+    /// </summary>
+    /// <exclude/>
+    protected internal enum Tag
+    {
+      /// <summary>
+      /// A value
+      /// </summary>
+      Default
+    }
 
-		/// <summary>
-		/// Copies the entire <c>PluginCollection</c> to a one-dimensional
-		/// <see cref="IPlugin"/> array.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="IPlugin"/> array to copy to.</param>
-		public virtual void CopyTo(IPlugin[] array)
-		{
-			this.CopyTo(array, 0);
-		}
+    /// <summary>
+    /// Allow subclasses to avoid our default constructors
+    /// </summary>
+    /// <param name="tag"></param>
+    /// <exclude/>
+    protected internal PluginCollection(Tag tag)
+    {
+      m_array = null;
+    }
 
-		/// <summary>
-		/// Copies the entire <c>PluginCollection</c> to a one-dimensional
-		/// <see cref="IPlugin"/> array, starting at the specified index of the target array.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="IPlugin"/> array to copy to.</param>
-		/// <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
-		public virtual void CopyTo(IPlugin[] array, int start)
-		{
-			if (m_count > array.GetUpperBound(0) + 1 - start)
-			{
-				throw new System.ArgumentException("Destination array was not long enough.");
-			}
-			
-			Array.Copy(m_array, 0, array, start, m_count); 
-		}
+    #endregion
 
-		/// <summary>
-		/// Gets a value indicating whether access to the collection is synchronized (thread-safe).
-		/// </summary>
-		/// <returns>false, because the backing type is an array, which is never thread-safe.</returns>
-		public virtual bool IsSynchronized
-		{
-			get { return false; }
-		}
+    #region Operations (type-safe ICollection)
 
-		/// <summary>
-		/// Gets an object that can be used to synchronize access to the collection.
-		/// </summary>
-		/// <value>
-		/// An object that can be used to synchronize access to the collection.
-		/// </value>
-		public virtual object SyncRoot
-		{
-			get { return m_array; }
-		}
+    /// <summary>
+    /// Gets the number of elements actually contained in the <c>PluginCollection</c>.
+    /// </summary>
+    public virtual int Count
+    {
+      get { return m_count; }
+    }
 
-		#endregion
-		
-		#region Operations (type-safe IList)
+    /// <summary>
+    /// Copies the entire <c>PluginCollection</c> to a one-dimensional
+    /// <see cref="IPlugin"/> array.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="IPlugin"/> array to copy to.</param>
+    public virtual void CopyTo(IPlugin[] array)
+    {
+      this.CopyTo(array, 0);
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="IPlugin"/> at the specified index.
-		/// </summary>
-		/// <value>
-		/// The <see cref="IPlugin"/> at the specified index.
-		/// </value>
-		/// <param name="index">The zero-based index of the element to get or set.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero.</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
-		/// </exception>
-		public virtual IPlugin this[int index]
-		{
-			get
-			{
-				ValidateIndex(index); // throws
-				return m_array[index]; 
-			}
-			set
-			{
-				ValidateIndex(index); // throws
-				++m_version; 
-				m_array[index] = value; 
-			}
-		}
+    /// <summary>
+    /// Copies the entire <c>PluginCollection</c> to a one-dimensional
+    /// <see cref="IPlugin"/> array, starting at the specified index of the target array.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="IPlugin"/> array to copy to.</param>
+    /// <param name="start">The zero-based index in <paramref name="array"/> at which copying begins.</param>
+    public virtual void CopyTo(IPlugin[] array, int start)
+    {
+      if (m_count > array.GetUpperBound(0) + 1 - start)
+      {
+        throw new System.ArgumentException("Destination array was not long enough.");
+      }
 
-		/// <summary>
-		/// Adds a <see cref="IPlugin"/> to the end of the <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IPlugin"/> to be added to the end of the <c>PluginCollection</c>.</param>
-		/// <returns>The index at which the value has been added.</returns>
-		public virtual int Add(IPlugin item)
-		{
-			if (m_count == m_array.Length)
-			{
-				EnsureCapacity(m_count + 1);
-			}
+      Array.Copy(m_array, 0, array, start, m_count);
+    }
 
-			m_array[m_count] = item;
-			m_version++;
+    /// <summary>
+    /// Gets a value indicating whether access to the collection is synchronized (thread-safe).
+    /// </summary>
+    /// <returns>false, because the backing type is an array, which is never thread-safe.</returns>
+    public virtual bool IsSynchronized
+    {
+      get { return false; }
+    }
 
-			return m_count++;
-		}
-		
-		/// <summary>
-		/// Removes all elements from the <c>PluginCollection</c>.
-		/// </summary>
-		public virtual void Clear()
-		{
-			++m_version;
-			m_array = new IPlugin[DEFAULT_CAPACITY];
-			m_count = 0;
-		}
-		
-		/// <summary>
-		/// Creates a shallow copy of the <see cref="PluginCollection"/>.
-		/// </summary>
-		/// <returns>A new <see cref="PluginCollection"/> with a shallow copy of the collection data.</returns>
-		public virtual object Clone()
-		{
-			PluginCollection newCol = new PluginCollection(m_count);
-			Array.Copy(m_array, 0, newCol.m_array, 0, m_count);
-			newCol.m_count = m_count;
-			newCol.m_version = m_version;
+    /// <summary>
+    /// Gets an object that can be used to synchronize access to the collection.
+    /// </summary>
+    /// <value>
+    /// An object that can be used to synchronize access to the collection.
+    /// </value>
+    public virtual object SyncRoot
+    {
+      get { return m_array; }
+    }
 
-			return newCol;
-		}
+    #endregion
 
-		/// <summary>
-		/// Determines whether a given <see cref="IPlugin"/> is in the <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IPlugin"/> to check for.</param>
-		/// <returns><c>true</c> if <paramref name="item"/> is found in the <c>PluginCollection</c>; otherwise, <c>false</c>.</returns>
-		public virtual bool Contains(IPlugin item)
-		{
-			for (int i=0; i != m_count; ++i)
-			{
-				if (m_array[i].Equals(item))
-				{
-					return true;
-				}
-			}
-			return false;
-		}
+    #region Operations (type-safe IList)
 
-		/// <summary>
-		/// Returns the zero-based index of the first occurrence of a <see cref="IPlugin"/>
-		/// in the <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IPlugin"/> to locate in the <c>PluginCollection</c>.</param>
-		/// <returns>
-		/// The zero-based index of the first occurrence of <paramref name="item"/> 
-		/// in the entire <c>PluginCollection</c>, if found; otherwise, -1.
-		/// </returns>
-		public virtual int IndexOf(IPlugin item)
-		{
-			for (int i=0; i != m_count; ++i)
-			{
-				if (m_array[i].Equals(item))
-				{
-					return i;
-				}
-			}
-			return -1;
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="IPlugin"/> at the specified index.
+    /// </summary>
+    /// <value>
+    /// The <see cref="IPlugin"/> at the specified index.
+    /// </value>
+    /// <param name="index">The zero-based index of the element to get or set.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero.</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
+    /// </exception>
+    public virtual IPlugin this[int index]
+    {
+      get
+      {
+        ValidateIndex(index); // throws
+        return m_array[index];
+      }
+      set
+      {
+        ValidateIndex(index); // throws
+        ++m_version;
+        m_array[index] = value;
+      }
+    }
 
-		/// <summary>
-		/// Inserts an element into the <c>PluginCollection</c> at the specified index.
-		/// </summary>
-		/// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
-		/// <param name="item">The <see cref="IPlugin"/> to insert.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
-		/// </exception>
-		public virtual void Insert(int index, IPlugin item)
-		{
-			ValidateIndex(index, true); // throws
-			
-			if (m_count == m_array.Length)
-			{
-				EnsureCapacity(m_count + 1);
-			}
+    /// <summary>
+    /// Adds a <see cref="IPlugin"/> to the end of the <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IPlugin"/> to be added to the end of the <c>PluginCollection</c>.</param>
+    /// <returns>The index at which the value has been added.</returns>
+    public virtual int Add(IPlugin item)
+    {
+      if (m_count == m_array.Length)
+      {
+        EnsureCapacity(m_count + 1);
+      }
+
+      m_array[m_count] = item;
+      m_version++;
+
+      return m_count++;
+    }
+
+    /// <summary>
+    /// Removes all elements from the <c>PluginCollection</c>.
+    /// </summary>
+    public virtual void Clear()
+    {
+      ++m_version;
+      m_array = new IPlugin[DEFAULT_CAPACITY];
+      m_count = 0;
+    }
+
+    /// <summary>
+    /// Creates a shallow copy of the <see cref="PluginCollection"/>.
+    /// </summary>
+    /// <returns>A new <see cref="PluginCollection"/> with a shallow copy of the collection data.</returns>
+    public virtual object Clone()
+    {
+      PluginCollection newCol = new PluginCollection(m_count);
+      Array.Copy(m_array, 0, newCol.m_array, 0, m_count);
+      newCol.m_count = m_count;
+      newCol.m_version = m_version;
+
+      return newCol;
+    }
+
+    /// <summary>
+    /// Determines whether a given <see cref="IPlugin"/> is in the <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IPlugin"/> to check for.</param>
+    /// <returns><c>true</c> if <paramref name="item"/> is found in the <c>PluginCollection</c>; otherwise, <c>false</c>.</returns>
+    public virtual bool Contains(IPlugin item)
+    {
+      for (int i = 0; i != m_count; ++i)
+      {
+        if (m_array[i].Equals(item))
+        {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    /// <summary>
+    /// Returns the zero-based index of the first occurrence of a <see cref="IPlugin"/>
+    /// in the <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IPlugin"/> to locate in the <c>PluginCollection</c>.</param>
+    /// <returns>
+    /// The zero-based index of the first occurrence of <paramref name="item"/> 
+    /// in the entire <c>PluginCollection</c>, if found; otherwise, -1.
+    /// </returns>
+    public virtual int IndexOf(IPlugin item)
+    {
+      for (int i = 0; i != m_count; ++i)
+      {
+        if (m_array[i].Equals(item))
+        {
+          return i;
+        }
+      }
+      return -1;
+    }
+
+    /// <summary>
+    /// Inserts an element into the <c>PluginCollection</c> at the specified index.
+    /// </summary>
+    /// <param name="index">The zero-based index at which <paramref name="item"/> should be inserted.</param>
+    /// <param name="item">The <see cref="IPlugin"/> to insert.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
+    /// </exception>
+    public virtual void Insert(int index, IPlugin item)
+    {
+      ValidateIndex(index, true); // throws
+
+      if (m_count == m_array.Length)
+      {
+        EnsureCapacity(m_count + 1);
+      }
+
+      if (index < m_count)
+      {
+        Array.Copy(m_array, index, m_array, index + 1, m_count - index);
+      }
+
+      m_array[index] = item;
+      m_count++;
+      m_version++;
+    }
+
+    /// <summary>
+    /// Removes the first occurrence of a specific <see cref="IPlugin"/> from the <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="item">The <see cref="IPlugin"/> to remove from the <c>PluginCollection</c>.</param>
+    /// <exception cref="ArgumentException">
+    /// The specified <see cref="IPlugin"/> was not found in the <c>PluginCollection</c>.
+    /// </exception>
+    public virtual void Remove(IPlugin item)
+    {
+      int i = IndexOf(item);
+      if (i < 0)
+      {
+        throw new System.ArgumentException("Cannot remove the specified item because it was not found in the specified Collection.");
+      }
+      ++m_version;
+      RemoveAt(i);
+    }
+
+    /// <summary>
+    /// Removes the element at the specified index of the <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="index">The zero-based index of the element to remove.</param>
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="index"/> is less than zero.</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="index"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
+    /// </exception>
+    public virtual void RemoveAt(int index)
+    {
+      ValidateIndex(index); // throws
+
+      m_count--;
+
+      if (index < m_count)
+      {
+        Array.Copy(m_array, index + 1, m_array, index, m_count - index);
+      }
+
+      // We can't set the deleted entry equal to null, because it might be a value type.
+      // Instead, we'll create an empty single-element array of the right type and copy it 
+      // over the entry we want to erase.
+      IPlugin[] temp = new IPlugin[1];
+      Array.Copy(temp, 0, m_array, m_count, 1);
+      m_version++;
+    }
+
+    /// <summary>
+    /// Gets a value indicating whether the collection has a fixed size.
+    /// </summary>
+    /// <value><c>true</c> if the collection has a fixed size; otherwise, <c>false</c>. The default is <c>false</c>.</value>
+    public virtual bool IsFixedSize
+    {
+      get { return false; }
+    }
+
+    /// <summary>
+    /// Gets a value indicating whether the IList is read-only.
+    /// </summary>
+    /// <value><c>true</c> if the collection is read-only; otherwise, <c>false</c>. The default is <c>false</c>.</value>
+    public virtual bool IsReadOnly
+    {
+      get { return false; }
+    }
+
+    #endregion
+
+    #region Operations (type-safe IEnumerable)
+
+    /// <summary>
+    /// Returns an enumerator that can iterate through the <c>PluginCollection</c>.
+    /// </summary>
+    /// <returns>An <see cref="Enumerator"/> for the entire <c>PluginCollection</c>.</returns>
+    public virtual IPluginCollectionEnumerator GetEnumerator()
+    {
+      return new Enumerator(this);
+    }
+
+    #endregion
+
+    #region Public helpers (just to mimic some nice features of ArrayList)
+
+    /// <summary>
+    /// Gets or sets the number of elements the <c>PluginCollection</c> can contain.
+    /// </summary>
+    /// <value>
+    /// The number of elements the <c>PluginCollection</c> can contain.
+    /// </value>
+    public virtual int Capacity
+    {
+      get
+      {
+        return m_array.Length;
+      }
+      set
+      {
+        if (value < m_count)
+        {
+          value = m_count;
+        }
+
+        if (value != m_array.Length)
+        {
+          if (value > 0)
+          {
+            IPlugin[] temp = new IPlugin[value];
+            Array.Copy(m_array, 0, temp, 0, m_count);
+            m_array = temp;
+          }
+          else
+          {
+            m_array = new IPlugin[DEFAULT_CAPACITY];
+          }
+        }
+      }
+    }
+
+    /// <summary>
+    /// Adds the elements of another <c>PluginCollection</c> to the current <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="x">The <c>PluginCollection</c> whose elements should be added to the end of the current <c>PluginCollection</c>.</param>
+    /// <returns>The new <see cref="PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
+    public virtual int AddRange(PluginCollection x)
+    {
+      if (m_count + x.Count >= m_array.Length)
+      {
+        EnsureCapacity(m_count + x.Count);
+      }
+
+      Array.Copy(x.m_array, 0, m_array, m_count, x.Count);
+      m_count += x.Count;
+      m_version++;
 
-			if (index < m_count)
-			{
-				Array.Copy(m_array, index, m_array, index + 1, m_count - index);
-			}
+      return m_count;
+    }
 
-			m_array[index] = item;
-			m_count++;
-			m_version++;
-		}
+    /// <summary>
+    /// Adds the elements of a <see cref="IPlugin"/> array to the current <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="x">The <see cref="IPlugin"/> array whose elements should be added to the end of the <c>PluginCollection</c>.</param>
+    /// <returns>The new <see cref="PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
+    public virtual int AddRange(IPlugin[] x)
+    {
+      if (m_count + x.Length >= m_array.Length)
+      {
+        EnsureCapacity(m_count + x.Length);
+      }
 
-		/// <summary>
-		/// Removes the first occurrence of a specific <see cref="IPlugin"/> from the <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="item">The <see cref="IPlugin"/> to remove from the <c>PluginCollection</c>.</param>
-		/// <exception cref="ArgumentException">
-		/// The specified <see cref="IPlugin"/> was not found in the <c>PluginCollection</c>.
-		/// </exception>
-		public virtual void Remove(IPlugin item)
-		{		   
-			int i = IndexOf(item);
-			if (i < 0)
-			{
-				throw new System.ArgumentException("Cannot remove the specified item because it was not found in the specified Collection.");
-			}
-			++m_version;
-			RemoveAt(i);
-		}
+      Array.Copy(x, 0, m_array, m_count, x.Length);
+      m_count += x.Length;
+      m_version++;
 
-		/// <summary>
-		/// Removes the element at the specified index of the <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="index">The zero-based index of the element to remove.</param>
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="index"/> is less than zero.</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="index"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
-		/// </exception>
-		public virtual void RemoveAt(int index)
-		{
-			ValidateIndex(index); // throws
-			
-			m_count--;
+      return m_count;
+    }
 
-			if (index < m_count)
-			{
-				Array.Copy(m_array, index + 1, m_array, index, m_count - index);
-			}
-			
-			// We can't set the deleted entry equal to null, because it might be a value type.
-			// Instead, we'll create an empty single-element array of the right type and copy it 
-			// over the entry we want to erase.
-			IPlugin[] temp = new IPlugin[1];
-			Array.Copy(temp, 0, m_array, m_count, 1);
-			m_version++;
-		}
+    /// <summary>
+    /// Adds the elements of a <see cref="IPlugin"/> collection to the current <c>PluginCollection</c>.
+    /// </summary>
+    /// <param name="col">The <see cref="IPlugin"/> collection whose elements should be added to the end of the <c>PluginCollection</c>.</param>
+    /// <returns>The new <see cref="PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
+    public virtual int AddRange(ICollection col)
+    {
+      if (m_count + col.Count >= m_array.Length)
+      {
+        EnsureCapacity(m_count + col.Count);
+      }
 
-		/// <summary>
-		/// Gets a value indicating whether the collection has a fixed size.
-		/// </summary>
-		/// <value><c>true</c> if the collection has a fixed size; otherwise, <c>false</c>. The default is <c>false</c>.</value>
-		public virtual bool IsFixedSize
-		{
-			get { return false; }
-		}
+      foreach (object item in col)
+      {
+        Add((IPlugin)item);
+      }
 
-		/// <summary>
-		/// Gets a value indicating whether the IList is read-only.
-		/// </summary>
-		/// <value><c>true</c> if the collection is read-only; otherwise, <c>false</c>. The default is <c>false</c>.</value>
-		public virtual bool IsReadOnly
-		{
-			get { return false; }
-		}
+      return m_count;
+    }
 
-		#endregion
+    /// <summary>
+    /// Sets the capacity to the actual number of elements.
+    /// </summary>
+    public virtual void TrimToSize()
+    {
+      this.Capacity = m_count;
+    }
 
-		#region Operations (type-safe IEnumerable)
-		
-		/// <summary>
-		/// Returns an enumerator that can iterate through the <c>PluginCollection</c>.
-		/// </summary>
-		/// <returns>An <see cref="Enumerator"/> for the entire <c>PluginCollection</c>.</returns>
-		public virtual IPluginCollectionEnumerator GetEnumerator()
-		{
-			return new Enumerator(this);
-		}
+    #endregion
 
-		#endregion
+    #region Implementation (helpers)
 
-		#region Public helpers (just to mimic some nice features of ArrayList)
-		
-		/// <summary>
-		/// Gets or sets the number of elements the <c>PluginCollection</c> can contain.
-		/// </summary>
-		/// <value>
-		/// The number of elements the <c>PluginCollection</c> can contain.
-		/// </value>
-		public virtual int Capacity
-		{
-			get 
-			{ 
-				return m_array.Length; 
-			}
-			set
-			{
-				if (value < m_count)
-				{
-					value = m_count;
-				}
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="i"/> is less than zero.</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="i"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
+    /// </exception>
+    private void ValidateIndex(int i)
+    {
+      ValidateIndex(i, false);
+    }
 
-				if (value != m_array.Length)
-				{
-					if (value > 0)
-					{
-						IPlugin[] temp = new IPlugin[value];
-						Array.Copy(m_array, 0, temp, 0, m_count);
-						m_array = temp;
-					}
-					else
-					{
-						m_array = new IPlugin[DEFAULT_CAPACITY];
-					}
-				}
-			}
-		}
+    /// <exception cref="ArgumentOutOfRangeException">
+    /// <para><paramref name="i"/> is less than zero.</para>
+    /// <para>-or-</para>
+    /// <para><paramref name="i"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
+    /// </exception>
+    private void ValidateIndex(int i, bool allowEqualEnd)
+    {
+      int max = (allowEqualEnd) ? (m_count) : (m_count - 1);
+      if (i < 0 || i > max)
+      {
+        throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("i", (object)i, "Index was out of range. Must be non-negative and less than the size of the collection. [" + (object)i + "] Specified argument was out of the range of valid values.");
+      }
+    }
 
-		/// <summary>
-		/// Adds the elements of another <c>PluginCollection</c> to the current <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="x">The <c>PluginCollection</c> whose elements should be added to the end of the current <c>PluginCollection</c>.</param>
-		/// <returns>The new <see cref="PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
-		public virtual int AddRange(PluginCollection x)
-		{
-			if (m_count + x.Count >= m_array.Length)
-			{
-				EnsureCapacity(m_count + x.Count);
-			}
-			
-			Array.Copy(x.m_array, 0, m_array, m_count, x.Count);
-			m_count += x.Count;
-			m_version++;
+    private void EnsureCapacity(int min)
+    {
+      int newCapacity = ((m_array.Length == 0) ? DEFAULT_CAPACITY : m_array.Length * 2);
+      if (newCapacity < min)
+      {
+        newCapacity = min;
+      }
 
-			return m_count;
-		}
+      this.Capacity = newCapacity;
+    }
 
-		/// <summary>
-		/// Adds the elements of a <see cref="IPlugin"/> array to the current <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="x">The <see cref="IPlugin"/> array whose elements should be added to the end of the <c>PluginCollection</c>.</param>
-		/// <returns>The new <see cref="PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
-		public virtual int AddRange(IPlugin[] x)
-		{
-			if (m_count + x.Length >= m_array.Length)
-			{
-				EnsureCapacity(m_count + x.Length);
-			}
+    #endregion
 
-			Array.Copy(x, 0, m_array, m_count, x.Length);
-			m_count += x.Length;
-			m_version++;
+    #region Implementation (ICollection)
 
-			return m_count;
-		}
+    void ICollection.CopyTo(Array array, int start)
+    {
+      Array.Copy(m_array, 0, array, start, m_count);
+    }
 
-		/// <summary>
-		/// Adds the elements of a <see cref="IPlugin"/> collection to the current <c>PluginCollection</c>.
-		/// </summary>
-		/// <param name="col">The <see cref="IPlugin"/> collection whose elements should be added to the end of the <c>PluginCollection</c>.</param>
-		/// <returns>The new <see cref="PluginCollection.Count"/> of the <c>PluginCollection</c>.</returns>
-		public virtual int AddRange(ICollection col)
-		{
-			if (m_count + col.Count >= m_array.Length)
-			{
-				EnsureCapacity(m_count + col.Count);
-			}
+    #endregion
 
-			foreach(object item in col)
-			{
-				Add((IPlugin)item);
-			}
+    #region Implementation (IList)
 
-			return m_count;
-		}
-		
-		/// <summary>
-		/// Sets the capacity to the actual number of elements.
-		/// </summary>
-		public virtual void TrimToSize()
-		{
-			this.Capacity = m_count;
-		}
+    object IList.this[int i]
+    {
+      get { return (object)this[i]; }
+      set { this[i] = (IPlugin)value; }
+    }
 
-		#endregion
+    int IList.Add(object x)
+    {
+      return this.Add((IPlugin)x);
+    }
 
-		#region Implementation (helpers)
+    bool IList.Contains(object x)
+    {
+      return this.Contains((IPlugin)x);
+    }
 
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="i"/> is less than zero.</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="i"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
-		/// </exception>
-		private void ValidateIndex(int i)
-		{
-			ValidateIndex(i, false);
-		}
+    int IList.IndexOf(object x)
+    {
+      return this.IndexOf((IPlugin)x);
+    }
 
-		/// <exception cref="ArgumentOutOfRangeException">
-		/// <para><paramref name="i"/> is less than zero.</para>
-		/// <para>-or-</para>
-		/// <para><paramref name="i"/> is equal to or greater than <see cref="PluginCollection.Count"/>.</para>
-		/// </exception>
-		private void ValidateIndex(int i, bool allowEqualEnd)
-		{
-			int max = (allowEqualEnd) ? (m_count) : (m_count-1);
-			if (i < 0 || i > max)
-			{
-				throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("i", (object)i, "Index was out of range. Must be non-negative and less than the size of the collection. [" + (object)i + "] Specified argument was out of the range of valid values.");
-			}
-		}
+    void IList.Insert(int pos, object x)
+    {
+      this.Insert(pos, (IPlugin)x);
+    }
 
-		private void EnsureCapacity(int min)
-		{
-			int newCapacity = ((m_array.Length == 0) ? DEFAULT_CAPACITY : m_array.Length * 2);
-			if (newCapacity < min)
-			{
-				newCapacity = min;
-			}
+    void IList.Remove(object x)
+    {
+      this.Remove((IPlugin)x);
+    }
 
-			this.Capacity = newCapacity;
-		}
+    void IList.RemoveAt(int pos)
+    {
+      this.RemoveAt(pos);
+    }
 
-		#endregion
-		
-		#region Implementation (ICollection)
+    #endregion
 
-		void ICollection.CopyTo(Array array, int start)
-		{
-			Array.Copy(m_array, 0, array, start, m_count);
-		}
+    #region Implementation (IEnumerable)
 
-		#endregion
+    IEnumerator IEnumerable.GetEnumerator()
+    {
+      return (IEnumerator)(this.GetEnumerator());
+    }
 
-		#region Implementation (IList)
+    #endregion Implementation (IEnumerable)
 
-		object IList.this[int i]
-		{
-			get { return (object)this[i]; }
-			set { this[i] = (IPlugin)value; }
-		}
+    #region Nested enumerator class
 
-		int IList.Add(object x)
-		{
-			return this.Add((IPlugin)x);
-		}
+    /// <summary>
+    /// Supports simple iteration over a <see cref="PluginCollection"/>.
+    /// </summary>
+    /// <exclude/>
+    private sealed class Enumerator : IEnumerator, IPluginCollectionEnumerator
+    {
+      #region Implementation (data)
 
-		bool IList.Contains(object x)
-		{
-			return this.Contains((IPlugin)x);
-		}
+      private readonly PluginCollection m_collection;
+      private int m_index;
+      private int m_version;
 
-		int IList.IndexOf(object x)
-		{
-			return this.IndexOf((IPlugin)x);
-		}
+      #endregion Implementation (data)
 
-		void IList.Insert(int pos, object x)
-		{
-			this.Insert(pos, (IPlugin)x);
-		}
+      #region Construction
 
-		void IList.Remove(object x)
-		{
-			this.Remove((IPlugin)x);
-		}
+      /// <summary>
+      /// Initializes a new instance of the <c>Enumerator</c> class.
+      /// </summary>
+      /// <param name="tc"></param>
+      internal Enumerator(PluginCollection tc)
+      {
+        m_collection = tc;
+        m_index = -1;
+        m_version = tc.m_version;
+      }
 
-		void IList.RemoveAt(int pos)
-		{
-			this.RemoveAt(pos);
-		}
+      #endregion
 
-		#endregion
+      #region Operations (type-safe IEnumerator)
 
-		#region Implementation (IEnumerable)
+      /// <summary>
+      /// Gets the current element in the collection.
+      /// </summary>
+      /// <value>
+      /// The current element in the collection.
+      /// </value>
+      public IPlugin Current
+      {
+        get { return m_collection[m_index]; }
+      }
 
-		IEnumerator IEnumerable.GetEnumerator()
-		{
-			return (IEnumerator)(this.GetEnumerator());
-		}
+      /// <summary>
+      /// Advances the enumerator to the next element in the collection.
+      /// </summary>
+      /// <returns>
+      /// <c>true</c> if the enumerator was successfully advanced to the next element; 
+      /// <c>false</c> if the enumerator has passed the end of the collection.
+      /// </returns>
+      /// <exception cref="InvalidOperationException">
+      /// The collection was modified after the enumerator was created.
+      /// </exception>
+      public bool MoveNext()
+      {
+        if (m_version != m_collection.m_version)
+        {
+          throw new System.InvalidOperationException("Collection was modified; enumeration operation may not execute.");
+        }
 
-		#endregion Implementation (IEnumerable)
+        ++m_index;
+        return (m_index < m_collection.Count);
+      }
 
-		#region Nested enumerator class
+      /// <summary>
+      /// Sets the enumerator to its initial position, before the first element in the collection.
+      /// </summary>
+      public void Reset()
+      {
+        m_index = -1;
+      }
 
-		/// <summary>
-		/// Supports simple iteration over a <see cref="PluginCollection"/>.
-		/// </summary>
-		/// <exclude/>
-		private sealed class Enumerator : IEnumerator, IPluginCollectionEnumerator
-		{
-			#region Implementation (data)
-			
-			private readonly PluginCollection m_collection;
-			private int m_index;
-			private int m_version;
-			
-			#endregion Implementation (data)
-		
-			#region Construction
-			
-			/// <summary>
-			/// Initializes a new instance of the <c>Enumerator</c> class.
-			/// </summary>
-			/// <param name="tc"></param>
-			internal Enumerator(PluginCollection tc)
-			{
-				m_collection = tc;
-				m_index = -1;
-				m_version = tc.m_version;
-			}
-			
-			#endregion
-	
-			#region Operations (type-safe IEnumerator)
-			
-			/// <summary>
-			/// Gets the current element in the collection.
-			/// </summary>
-			/// <value>
-			/// The current element in the collection.
-			/// </value>
-			public IPlugin Current
-			{
-				get { return m_collection[m_index]; }
-			}
+      #endregion
 
-			/// <summary>
-			/// Advances the enumerator to the next element in the collection.
-			/// </summary>
-			/// <returns>
-			/// <c>true</c> if the enumerator was successfully advanced to the next element; 
-			/// <c>false</c> if the enumerator has passed the end of the collection.
-			/// </returns>
-			/// <exception cref="InvalidOperationException">
-			/// The collection was modified after the enumerator was created.
-			/// </exception>
-			public bool MoveNext()
-			{
-				if (m_version != m_collection.m_version)
-				{
-					throw new System.InvalidOperationException("Collection was modified; enumeration operation may not execute.");
-				}
+      #region Implementation (IEnumerator)
 
-				++m_index;
-				return (m_index < m_collection.Count);
-			}
+      object IEnumerator.Current
+      {
+        get { return this.Current; }
+      }
 
-			/// <summary>
-			/// Sets the enumerator to its initial position, before the first element in the collection.
-			/// </summary>
-			public void Reset()
-			{
-				m_index = -1;
-			}
+      #endregion
+    }
 
-			#endregion
-	
-			#region Implementation (IEnumerator)
-			
-			object IEnumerator.Current
-			{
-				get { return this.Current; }
-			}
-			
-			#endregion
-		}
+    #endregion
 
-		#endregion
+    #region Nested Read Only Wrapper class
 
-		#region Nested Read Only Wrapper class
+    /// <exclude/>
+    private sealed class ReadOnlyPluginCollection : PluginCollection
+    {
+      #region Implementation (data)
 
-		/// <exclude/>
-		private sealed class ReadOnlyPluginCollection : PluginCollection
-		{
-			#region Implementation (data)
+      private readonly PluginCollection m_collection;
 
-			private readonly PluginCollection m_collection;
+      #endregion
 
-			#endregion
+      #region Construction
 
-			#region Construction
+      internal ReadOnlyPluginCollection(PluginCollection list) : base(Tag.Default)
+      {
+        m_collection = list;
+      }
 
-			internal ReadOnlyPluginCollection(PluginCollection list) : base(Tag.Default)
-			{
-				m_collection = list;
-			}
+      #endregion
 
-			#endregion
+      #region Type-safe ICollection
 
-			#region Type-safe ICollection
+      public override void CopyTo(IPlugin[] array)
+      {
+        m_collection.CopyTo(array);
+      }
 
-			public override void CopyTo(IPlugin[] array)
-			{
-				m_collection.CopyTo(array);
-			}
+      public override void CopyTo(IPlugin[] array, int start)
+      {
+        m_collection.CopyTo(array, start);
+      }
+      public override int Count
+      {
+        get { return m_collection.Count; }
+      }
 
-			public override void CopyTo(IPlugin[] array, int start)
-			{
-				m_collection.CopyTo(array,start);
-			}
-			public override int Count
-			{
-				get { return m_collection.Count; }
-			}
+      public override bool IsSynchronized
+      {
+        get { return m_collection.IsSynchronized; }
+      }
 
-			public override bool IsSynchronized
-			{
-				get { return m_collection.IsSynchronized; }
-			}
+      public override object SyncRoot
+      {
+        get { return this.m_collection.SyncRoot; }
+      }
 
-			public override object SyncRoot
-			{
-				get { return this.m_collection.SyncRoot; }
-			}
+      #endregion
 
-			#endregion
+      #region Type-safe IList
 
-			#region Type-safe IList
+      public override IPlugin this[int i]
+      {
+        get { return m_collection[i]; }
+        set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
+      }
 
-			public override IPlugin this[int i]
-			{
-				get { return m_collection[i]; }
-				set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
-			}
+      public override int Add(IPlugin x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override int Add(IPlugin x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
-            
-			public override void Clear()
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Clear()
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override bool Contains(IPlugin x)
-			{
-				return m_collection.Contains(x);
-			}
+      public override bool Contains(IPlugin x)
+      {
+        return m_collection.Contains(x);
+      }
 
-			public override int IndexOf(IPlugin x)
-			{
-				return m_collection.IndexOf(x);
-			}
+      public override int IndexOf(IPlugin x)
+      {
+        return m_collection.IndexOf(x);
+      }
 
-			public override void Insert(int pos, IPlugin x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Insert(int pos, IPlugin x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void Remove(IPlugin x)
-			{           
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void Remove(IPlugin x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override void RemoveAt(int pos)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override void RemoveAt(int pos)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override bool IsFixedSize
-			{
-				get { return true; }
-			}
+      public override bool IsFixedSize
+      {
+        get { return true; }
+      }
 
-			public override bool IsReadOnly
-			{
-				get { return true; }
-			}
+      public override bool IsReadOnly
+      {
+        get { return true; }
+      }
 
-			#endregion
+      #endregion
 
-			#region Type-safe IEnumerable
+      #region Type-safe IEnumerable
 
-			public override IPluginCollectionEnumerator GetEnumerator()
-			{
-				return m_collection.GetEnumerator();
-			}
+      public override IPluginCollectionEnumerator GetEnumerator()
+      {
+        return m_collection.GetEnumerator();
+      }
 
-			#endregion
+      #endregion
 
-			#region Public Helpers
+      #region Public Helpers
 
-			// (just to mimic some nice features of ArrayList)
-			public override int Capacity
-			{
-				get { return m_collection.Capacity; }
-				set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
-			}
+      // (just to mimic some nice features of ArrayList)
+      public override int Capacity
+      {
+        get { return m_collection.Capacity; }
+        set { throw new NotSupportedException("This is a Read Only Collection and can not be modified"); }
+      }
 
-			public override int AddRange(PluginCollection x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int AddRange(PluginCollection x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			public override int AddRange(IPlugin[] x)
-			{
-				throw new NotSupportedException("This is a Read Only Collection and can not be modified");
-			}
+      public override int AddRange(IPlugin[] x)
+      {
+        throw new NotSupportedException("This is a Read Only Collection and can not be modified");
+      }
 
-			#endregion
-		}
+      #endregion
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Plugin/PluginMap.cs b/src/log4net/Plugin/PluginMap.cs
index d05223f..9908f36 100644
--- a/src/log4net/Plugin/PluginMap.cs
+++ b/src/log4net/Plugin/PluginMap.cs
@@ -25,165 +25,165 @@
 
 namespace log4net.Plugin
 {
-	/// <summary>
-	/// Map of repository plugins.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class is a name keyed map of the plugins that are
-	/// attached to a repository.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class PluginMap
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Map of repository plugins.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class is a name keyed map of the plugins that are
+  /// attached to a repository.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class PluginMap
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="repository">The repository that the plugins should be attached to.</param>
-		/// <remarks>
-		/// <para>
-		/// Initialize a new instance of the <see cref="PluginMap" /> class with a 
-		/// repository that the plugins should be attached to.
-		/// </para>
-		/// </remarks>
-		public PluginMap(ILoggerRepository repository)
-		{
-			m_repository = repository;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="repository">The repository that the plugins should be attached to.</param>
+    /// <remarks>
+    /// <para>
+    /// Initialize a new instance of the <see cref="PluginMap" /> class with a 
+    /// repository that the plugins should be attached to.
+    /// </para>
+    /// </remarks>
+    public PluginMap(ILoggerRepository repository)
+    {
+      m_repository = repository;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets a <see cref="IPlugin" /> by name.
-		/// </summary>
-		/// <param name="name">The name of the <see cref="IPlugin" /> to lookup.</param>
-		/// <returns>
-		/// The <see cref="IPlugin" /> from the map with the name specified, or 
-		/// <c>null</c> if no plugin is found.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Lookup a plugin by name. If the plugin is not found <c>null</c>
-		/// will be returned.
-		/// </para>
-		/// </remarks>
-		public IPlugin this[string name]
-		{
-			get
-			{
-				if (name == null)
-				{
-					throw new ArgumentNullException("name");
-				}
+    /// <summary>
+    /// Gets a <see cref="IPlugin" /> by name.
+    /// </summary>
+    /// <param name="name">The name of the <see cref="IPlugin" /> to lookup.</param>
+    /// <returns>
+    /// The <see cref="IPlugin" /> from the map with the name specified, or 
+    /// <c>null</c> if no plugin is found.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Lookup a plugin by name. If the plugin is not found <c>null</c>
+    /// will be returned.
+    /// </para>
+    /// </remarks>
+    public IPlugin this[string name]
+    {
+      get
+      {
+        if (name == null)
+        {
+          throw new ArgumentNullException("name");
+        }
 
-				lock(this)
-				{
-					return (IPlugin)m_mapName2Plugin[name];
-				}
-			}
-		}
+        lock (this)
+        {
+          return (IPlugin)m_mapName2Plugin[name];
+        }
+      }
+    }
 
-		/// <summary>
-		/// Gets all possible plugins as a list of <see cref="IPlugin" /> objects.
-		/// </summary>
-		/// <value>All possible plugins as a list of <see cref="IPlugin" /> objects.</value>
-		/// <remarks>
-		/// <para>
-		/// Get a collection of all the plugins defined in this map.
-		/// </para>
-		/// </remarks>
-		public PluginCollection AllPlugins
-		{
-			get
-			{
-				lock(this)
-				{
-					return new PluginCollection(m_mapName2Plugin.Values);
-				}
-			}
-		}
-		
-		#endregion Public Instance Properties
+    /// <summary>
+    /// Gets all possible plugins as a list of <see cref="IPlugin" /> objects.
+    /// </summary>
+    /// <value>All possible plugins as a list of <see cref="IPlugin" /> objects.</value>
+    /// <remarks>
+    /// <para>
+    /// Get a collection of all the plugins defined in this map.
+    /// </para>
+    /// </remarks>
+    public PluginCollection AllPlugins
+    {
+      get
+      {
+        lock (this)
+        {
+          return new PluginCollection(m_mapName2Plugin.Values);
+        }
+      }
+    }
 
-		#region Public Instance Methods
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// Adds a <see cref="IPlugin" /> to the map.
-		/// </summary>
-		/// <param name="plugin">The <see cref="IPlugin" /> to add to the map.</param>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="IPlugin" /> will be attached to the repository when added.
-		/// </para>
-		/// <para>
-		/// If there already exists a plugin with the same name 
-		/// attached to the repository then the old plugin will
-		/// be <see cref="IPlugin.Shutdown"/> and replaced with
-		/// the new plugin.
-		/// </para>
-		/// </remarks>
-		public void Add(IPlugin plugin)
-		{
-			if (plugin == null)
-			{
-				throw new ArgumentNullException("plugin");
-			}
+    #region Public Instance Methods
 
-			IPlugin curPlugin = null;
+    /// <summary>
+    /// Adds a <see cref="IPlugin" /> to the map.
+    /// </summary>
+    /// <param name="plugin">The <see cref="IPlugin" /> to add to the map.</param>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="IPlugin" /> will be attached to the repository when added.
+    /// </para>
+    /// <para>
+    /// If there already exists a plugin with the same name 
+    /// attached to the repository then the old plugin will
+    /// be <see cref="IPlugin.Shutdown"/> and replaced with
+    /// the new plugin.
+    /// </para>
+    /// </remarks>
+    public void Add(IPlugin plugin)
+    {
+      if (plugin == null)
+      {
+        throw new ArgumentNullException("plugin");
+      }
 
-			lock(this)
-			{
-				// Get the current plugin if it exists
-				curPlugin = m_mapName2Plugin[plugin.Name] as IPlugin;
+      IPlugin curPlugin = null;
 
-				// Store new plugin
-				m_mapName2Plugin[plugin.Name] = plugin;
-			}
+      lock (this)
+      {
+        // Get the current plugin if it exists
+        curPlugin = m_mapName2Plugin[plugin.Name] as IPlugin;
 
-			// Shutdown existing plugin with same name
-			if (curPlugin != null)
-			{
-				curPlugin.Shutdown();
-			}
+        // Store new plugin
+        m_mapName2Plugin[plugin.Name] = plugin;
+      }
 
-			// Attach new plugin to repository
-			plugin.Attach(m_repository);
-		}
+      // Shutdown existing plugin with same name
+      if (curPlugin != null)
+      {
+        curPlugin.Shutdown();
+      }
 
-		/// <summary>
-		/// Removes a <see cref="IPlugin" /> from the map.
-		/// </summary>
-		/// <param name="plugin">The <see cref="IPlugin" /> to remove from the map.</param>
-		/// <remarks>
-		/// <para>
-		/// Remove a specific plugin from this map.
-		/// </para>
-		/// </remarks>
-		public void Remove(IPlugin plugin)
-		{
-			if (plugin == null)
-			{
-				throw new ArgumentNullException("plugin");
-			}
-			lock(this)
-			{
-				m_mapName2Plugin.Remove(plugin.Name);
-			}
-		}
+      // Attach new plugin to repository
+      plugin.Attach(m_repository);
+    }
 
-		#endregion Public Instance Methods
+    /// <summary>
+    /// Removes a <see cref="IPlugin" /> from the map.
+    /// </summary>
+    /// <param name="plugin">The <see cref="IPlugin" /> to remove from the map.</param>
+    /// <remarks>
+    /// <para>
+    /// Remove a specific plugin from this map.
+    /// </para>
+    /// </remarks>
+    public void Remove(IPlugin plugin)
+    {
+      if (plugin == null)
+      {
+        throw new ArgumentNullException("plugin");
+      }
+      lock (this)
+      {
+        m_mapName2Plugin.Remove(plugin.Name);
+      }
+    }
 
-		#region Private Instance Fields
+    #endregion Public Instance Methods
 
-		private readonly Hashtable m_mapName2Plugin = new Hashtable();
-		private readonly ILoggerRepository m_repository;
+    #region Private Instance Fields
 
-		#endregion Private Instance Fields
-	}
+    private readonly Hashtable m_mapName2Plugin = new Hashtable();
+    private readonly ILoggerRepository m_repository;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Plugin/PluginSkeleton.cs b/src/log4net/Plugin/PluginSkeleton.cs
index 56ce5c3..df263e1 100644
--- a/src/log4net/Plugin/PluginSkeleton.cs
+++ b/src/log4net/Plugin/PluginSkeleton.cs
@@ -21,128 +21,128 @@
 
 namespace log4net.Plugin
 {
-	/// <summary>
-	/// Base implementation of <see cref="IPlugin"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Default abstract implementation of the <see cref="IPlugin"/>
-	/// interface. This base class can be used by implementors
-	/// of the <see cref="IPlugin"/> interface.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class PluginSkeleton : IPlugin
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Base implementation of <see cref="IPlugin"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Default abstract implementation of the <see cref="IPlugin"/>
+  /// interface. This base class can be used by implementors
+  /// of the <see cref="IPlugin"/> interface.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class PluginSkeleton : IPlugin
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="name">the name of the plugin</param>
-		/// <remarks>
-		/// Initializes a new Plugin with the specified name.
-		/// </remarks>
-		protected PluginSkeleton(string name)
-		{
-			m_name = name;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="name">the name of the plugin</param>
+    /// <remarks>
+    /// Initializes a new Plugin with the specified name.
+    /// </remarks>
+    protected PluginSkeleton(string name)
+    {
+      m_name = name;
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Implementation of IPlugin
+    #region Implementation of IPlugin
 
-		/// <summary>
-		/// Gets or sets the name of the plugin.
-		/// </summary>
-		/// <value>
-		/// The name of the plugin.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Plugins are stored in the <see cref="PluginMap"/>
-		/// keyed by name. Each plugin instance attached to a
-		/// repository must be a unique name.
-		/// </para>
-		/// <para>
-		/// The name of the plugin must not change one the 
-		/// plugin has been attached to a repository.
-		/// </para>
-		/// </remarks>
-		public virtual string Name 
-		{ 
-			get { return m_name; }
-			set { m_name = value; }
-		}
+    /// <summary>
+    /// Gets or sets the name of the plugin.
+    /// </summary>
+    /// <value>
+    /// The name of the plugin.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Plugins are stored in the <see cref="PluginMap"/>
+    /// keyed by name. Each plugin instance attached to a
+    /// repository must be a unique name.
+    /// </para>
+    /// <para>
+    /// The name of the plugin must not change one the 
+    /// plugin has been attached to a repository.
+    /// </para>
+    /// </remarks>
+    public virtual string Name
+    {
+      get { return m_name; }
+      set { m_name = value; }
+    }
 
-		/// <summary>
-		/// Attaches this plugin to a <see cref="ILoggerRepository"/>.
-		/// </summary>
-		/// <param name="repository">The <see cref="ILoggerRepository"/> that this plugin should be attached to.</param>
-		/// <remarks>
-		/// <para>
-		/// A plugin may only be attached to a single repository.
-		/// </para>
-		/// <para>
-		/// This method is called when the plugin is attached to the repository.
-		/// </para>
-		/// </remarks>
-		public virtual void Attach(ILoggerRepository repository)
-		{
-			m_repository = repository;
-		}
+    /// <summary>
+    /// Attaches this plugin to a <see cref="ILoggerRepository"/>.
+    /// </summary>
+    /// <param name="repository">The <see cref="ILoggerRepository"/> that this plugin should be attached to.</param>
+    /// <remarks>
+    /// <para>
+    /// A plugin may only be attached to a single repository.
+    /// </para>
+    /// <para>
+    /// This method is called when the plugin is attached to the repository.
+    /// </para>
+    /// </remarks>
+    public virtual void Attach(ILoggerRepository repository)
+    {
+      m_repository = repository;
+    }
 
-		/// <summary>
-		/// Is called when the plugin is to shutdown.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method is called to notify the plugin that 
-		/// it should stop operating and should detach from
-		/// the repository.
-		/// </para>
-		/// </remarks>
-		public virtual void Shutdown()
-		{
-		}
+    /// <summary>
+    /// Is called when the plugin is to shutdown.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method is called to notify the plugin that 
+    /// it should stop operating and should detach from
+    /// the repository.
+    /// </para>
+    /// </remarks>
+    public virtual void Shutdown()
+    {
+    }
 
-		#endregion Implementation of IPlugin
+    #endregion Implementation of IPlugin
 
-		#region Protected Instance Properties
+    #region Protected Instance Properties
 
-		/// <summary>
-		/// The repository for this plugin
-		/// </summary>
-		/// <value>
-		/// The <see cref="ILoggerRepository" /> that this plugin is attached to.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the <see cref="ILoggerRepository" /> that this plugin is 
-		/// attached to.
-		/// </para>
-		/// </remarks>
-		protected virtual ILoggerRepository LoggerRepository 
-		{
-			get { return this.m_repository;	}
-			set { this.m_repository = value; }
-		}
+    /// <summary>
+    /// The repository for this plugin
+    /// </summary>
+    /// <value>
+    /// The <see cref="ILoggerRepository" /> that this plugin is attached to.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the <see cref="ILoggerRepository" /> that this plugin is 
+    /// attached to.
+    /// </para>
+    /// </remarks>
+    protected virtual ILoggerRepository LoggerRepository
+    {
+      get { return this.m_repository; }
+      set { this.m_repository = value; }
+    }
 
-		#endregion Protected Instance Properties
+    #endregion Protected Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The name of this plugin.
-		/// </summary>
-		private string m_name;
+    /// <summary>
+    /// The name of this plugin.
+    /// </summary>
+    private string m_name;
 
-		/// <summary>
-		/// The repository this plugin is attached to.
-		/// </summary>
-		private ILoggerRepository m_repository;
+    /// <summary>
+    /// The repository this plugin is attached to.
+    /// </summary>
+    private ILoggerRepository m_repository;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Plugin/RemoteLoggingServerPlugin.cs b/src/log4net/Plugin/RemoteLoggingServerPlugin.cs
index ff5824b..bee95b4 100644
--- a/src/log4net/Plugin/RemoteLoggingServerPlugin.cs
+++ b/src/log4net/Plugin/RemoteLoggingServerPlugin.cs
@@ -31,250 +31,250 @@
 
 namespace log4net.Plugin
 {
-	/// <summary>
-	/// Plugin that listens for events from the <see cref="log4net.Appender.RemotingAppender"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This plugin publishes an instance of <see cref="IRemoteLoggingSink"/> 
-	/// on a specified <see cref="SinkUri"/>. This listens for logging events delivered from
-	/// a remote <see cref="log4net.Appender.RemotingAppender"/>.
-	/// </para>
-	/// <para>
-	/// When an event is received it is relogged within the attached repository
-	/// as if it had been raised locally.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class RemoteLoggingServerPlugin : PluginSkeleton
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Plugin that listens for events from the <see cref="log4net.Appender.RemotingAppender"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This plugin publishes an instance of <see cref="IRemoteLoggingSink"/> 
+  /// on a specified <see cref="SinkUri"/>. This listens for logging events delivered from
+  /// a remote <see cref="log4net.Appender.RemotingAppender"/>.
+  /// </para>
+  /// <para>
+  /// When an event is received it is relogged within the attached repository
+  /// as if it had been raised locally.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class RemoteLoggingServerPlugin : PluginSkeleton
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="RemoteLoggingServerPlugin" /> class.
-		/// </para>
-		/// <para>
-		/// The <see cref="SinkUri"/> property must be set.
-		/// </para>
-		/// </remarks>
-		public RemoteLoggingServerPlugin() : base("RemoteLoggingServerPlugin:Unset URI")
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="RemoteLoggingServerPlugin" /> class.
+    /// </para>
+    /// <para>
+    /// The <see cref="SinkUri"/> property must be set.
+    /// </para>
+    /// </remarks>
+    public RemoteLoggingServerPlugin() : base("RemoteLoggingServerPlugin:Unset URI")
+    {
+    }
 
-		/// <summary>
-		/// Construct with sink Uri.
-		/// </summary>
-		/// <param name="sinkUri">The name to publish the sink under in the remoting infrastructure. 
-		/// See <see cref="SinkUri"/> for more details.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="RemoteLoggingServerPlugin" /> class
-		/// with specified name.
-		/// </para>
-		/// </remarks>
-		public RemoteLoggingServerPlugin(string sinkUri) : base("RemoteLoggingServerPlugin:"+sinkUri)
-		{
-			m_sinkUri = sinkUri;
-		}
+    /// <summary>
+    /// Construct with sink Uri.
+    /// </summary>
+    /// <param name="sinkUri">The name to publish the sink under in the remoting infrastructure. 
+    /// See <see cref="SinkUri"/> for more details.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="RemoteLoggingServerPlugin" /> class
+    /// with specified name.
+    /// </para>
+    /// </remarks>
+    public RemoteLoggingServerPlugin(string sinkUri) : base("RemoteLoggingServerPlugin:" + sinkUri)
+    {
+      m_sinkUri = sinkUri;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the URI of this sink.
-		/// </summary>
-		/// <value>
-		/// The URI of this sink.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This is the name under which the object is marshaled.
-		/// <see cref="M:RemotingServices.Marshal(MarshalByRefObject,String,Type)"/>
-		/// </para>
-		/// </remarks>
-		public virtual string SinkUri 
-		{ 
-			get { return m_sinkUri; }
-			set { m_sinkUri = value; }
-		}
+    /// <summary>
+    /// Gets or sets the URI of this sink.
+    /// </summary>
+    /// <value>
+    /// The URI of this sink.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This is the name under which the object is marshaled.
+    /// <see cref="M:RemotingServices.Marshal(MarshalByRefObject,String,Type)"/>
+    /// </para>
+    /// </remarks>
+    public virtual string SinkUri
+    {
+      get { return m_sinkUri; }
+      set { m_sinkUri = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override implementation of PluginSkeleton
+    #region Override implementation of PluginSkeleton
 
-		/// <summary>
-		/// Attaches this plugin to a <see cref="ILoggerRepository"/>.
-		/// </summary>
-		/// <param name="repository">The <see cref="ILoggerRepository"/> that this plugin should be attached to.</param>
-		/// <remarks>
-		/// <para>
-		/// A plugin may only be attached to a single repository.
-		/// </para>
-		/// <para>
-		/// This method is called when the plugin is attached to the repository.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Attaches this plugin to a <see cref="ILoggerRepository"/>.
+    /// </summary>
+    /// <param name="repository">The <see cref="ILoggerRepository"/> that this plugin should be attached to.</param>
+    /// <remarks>
+    /// <para>
+    /// A plugin may only be attached to a single repository.
+    /// </para>
+    /// <para>
+    /// This method is called when the plugin is attached to the repository.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0
-		[System.Security.SecuritySafeCritical]
+    [System.Security.SecuritySafeCritical]
 #endif
-		public override void Attach(ILoggerRepository repository)
-		{
-			base.Attach(repository);
+    public override void Attach(ILoggerRepository repository)
+    {
+      base.Attach(repository);
 
-			// Create the sink and marshal it
-			m_sink = new RemoteLoggingSinkImpl(repository); 
+      // Create the sink and marshal it
+      m_sink = new RemoteLoggingSinkImpl(repository);
 
-			try
-			{
-				RemotingServices.Marshal(m_sink, m_sinkUri, typeof(IRemoteLoggingSink));		
-			}
-			catch(Exception ex)
-			{
-				LogLog.Error(declaringType, "Failed to Marshal remoting sink", ex);
-			}
-		}
+      try
+      {
+        RemotingServices.Marshal(m_sink, m_sinkUri, typeof(IRemoteLoggingSink));
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Failed to Marshal remoting sink", ex);
+      }
+    }
 
-		/// <summary>
-		/// Is called when the plugin is to shutdown.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// When the plugin is shutdown the remote logging
-		/// sink is disconnected.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Is called when the plugin is to shutdown.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// When the plugin is shutdown the remote logging
+    /// sink is disconnected.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0
         [System.Security.SecuritySafeCritical]
 #endif
-        public override void Shutdown()
-		{
-			// Stops the sink from receiving messages
-			RemotingServices.Disconnect(m_sink);
-			m_sink = null;
+    public override void Shutdown()
+    {
+      // Stops the sink from receiving messages
+      RemotingServices.Disconnect(m_sink);
+      m_sink = null;
 
-			base.Shutdown();
-		}
+      base.Shutdown();
+    }
 
-		#endregion Override implementation of PluginSkeleton
+    #endregion Override implementation of PluginSkeleton
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private RemoteLoggingSinkImpl m_sink;
-		private string m_sinkUri;
+    private RemoteLoggingSinkImpl m_sink;
+    private string m_sinkUri;
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the RemoteLoggingServerPlugin class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(RemoteLoggingServerPlugin);
+    /// <summary>
+    /// The fully qualified type of the RemoteLoggingServerPlugin class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(RemoteLoggingServerPlugin);
 
-	    #endregion Private Static Fields
+    #endregion Private Static Fields
 
-		/// <summary>
-		/// Delivers <see cref="LoggingEvent"/> objects to a remote sink.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Internal class used to listen for logging events
-		/// and deliver them to the local repository.
-		/// </para>
-		/// </remarks>
-		private class RemoteLoggingSinkImpl : MarshalByRefObject, IRemoteLoggingSink
-		{
-			#region Public Instance Constructors
+    /// <summary>
+    /// Delivers <see cref="LoggingEvent"/> objects to a remote sink.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Internal class used to listen for logging events
+    /// and deliver them to the local repository.
+    /// </para>
+    /// </remarks>
+    private class RemoteLoggingSinkImpl : MarshalByRefObject, IRemoteLoggingSink
+    {
+      #region Public Instance Constructors
 
-			/// <summary>
-			/// Constructor
-			/// </summary>
-			/// <param name="repository">The repository to log to.</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="RemoteLoggingSinkImpl"/> for the
-			/// specified <see cref="ILoggerRepository"/>.
-			/// </para>
-			/// </remarks>
-			public RemoteLoggingSinkImpl(ILoggerRepository repository)
-			{
-				m_repository = repository;
-			}
+      /// <summary>
+      /// Constructor
+      /// </summary>
+      /// <param name="repository">The repository to log to.</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="RemoteLoggingSinkImpl"/> for the
+      /// specified <see cref="ILoggerRepository"/>.
+      /// </para>
+      /// </remarks>
+      public RemoteLoggingSinkImpl(ILoggerRepository repository)
+      {
+        m_repository = repository;
+      }
 
-			#endregion Public Instance Constructors
+      #endregion Public Instance Constructors
 
-			#region Implementation of IRemoteLoggingSink
+      #region Implementation of IRemoteLoggingSink
 
-			/// <summary>
-			/// Logs the events to the repository.
-			/// </summary>
-			/// <param name="events">The events to log.</param>
-			/// <remarks>
-			/// <para>
-			/// The events passed are logged to the <see cref="ILoggerRepository"/>
-			/// </para>
-			/// </remarks>
-			public void LogEvents(LoggingEvent[] events)
-			{
-				if (events != null)
-				{
-					foreach(LoggingEvent logEvent in events)
-					{
-						if (logEvent != null)
-						{
-							m_repository.Log(logEvent);
-						}
-					}
-				}
-			}
+      /// <summary>
+      /// Logs the events to the repository.
+      /// </summary>
+      /// <param name="events">The events to log.</param>
+      /// <remarks>
+      /// <para>
+      /// The events passed are logged to the <see cref="ILoggerRepository"/>
+      /// </para>
+      /// </remarks>
+      public void LogEvents(LoggingEvent[] events)
+      {
+        if (events != null)
+        {
+          foreach (LoggingEvent logEvent in events)
+          {
+            if (logEvent != null)
+            {
+              m_repository.Log(logEvent);
+            }
+          }
+        }
+      }
 
-			#endregion Implementation of IRemoteLoggingSink
+      #endregion Implementation of IRemoteLoggingSink
 
-			#region Override implementation of MarshalByRefObject
+      #region Override implementation of MarshalByRefObject
 
-			/// <summary>
-			/// Obtains a lifetime service object to control the lifetime 
-			/// policy for this instance.
-			/// </summary>
-			/// <returns><c>null</c> to indicate that this instance should live forever.</returns>
-			/// <remarks>
-			/// <para>
-			/// Obtains a lifetime service object to control the lifetime 
-			/// policy for this instance. This object should live forever
-			/// therefore this implementation returns <c>null</c>.
-			/// </para>
-			/// </remarks>
+      /// <summary>
+      /// Obtains a lifetime service object to control the lifetime 
+      /// policy for this instance.
+      /// </summary>
+      /// <returns><c>null</c> to indicate that this instance should live forever.</returns>
+      /// <remarks>
+      /// <para>
+      /// Obtains a lifetime service object to control the lifetime 
+      /// policy for this instance. This object should live forever
+      /// therefore this implementation returns <c>null</c>.
+      /// </para>
+      /// </remarks>
 #if NET_4_0 || MONO_4_0
             [System.Security.SecurityCritical]
 #endif
-            public override object InitializeLifetimeService()
-			{
-				return null;
-			}
+      public override object InitializeLifetimeService()
+      {
+        return null;
+      }
 
-			#endregion Override implementation of MarshalByRefObject
+      #endregion Override implementation of MarshalByRefObject
 
-			#region Private Instance Fields
+      #region Private Instance Fields
 
-			/// <summary>
-			/// The underlying <see cref="ILoggerRepository" /> that events should
-			/// be logged to.
-			/// </summary>
-			private readonly ILoggerRepository m_repository;
+      /// <summary>
+      /// The underlying <see cref="ILoggerRepository" /> that events should
+      /// be logged to.
+      /// </summary>
+      private readonly ILoggerRepository m_repository;
 
-			#endregion Private Instance Fields
-		}
-	}
+      #endregion Private Instance Fields
+    }
+  }
 }
 
 #endif // NET_2_0
\ No newline at end of file
diff --git a/src/log4net/Repository/ConfigurationChangedEventArgs.cs b/src/log4net/Repository/ConfigurationChangedEventArgs.cs
index 77df7d4..f20f1c0 100644
--- a/src/log4net/Repository/ConfigurationChangedEventArgs.cs
+++ b/src/log4net/Repository/ConfigurationChangedEventArgs.cs
@@ -24,28 +24,28 @@
 
 namespace log4net.Repository
 {
+  /// <summary>
+  /// 
+  /// </summary>
+  public class ConfigurationChangedEventArgs : EventArgs
+  {
+    private readonly ICollection configurationMessages;
+
     /// <summary>
     /// 
     /// </summary>
-    public class ConfigurationChangedEventArgs : EventArgs
+    /// <param name="configurationMessages"></param>
+    public ConfigurationChangedEventArgs(ICollection configurationMessages)
     {
-        private readonly ICollection configurationMessages;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="configurationMessages"></param>
-        public ConfigurationChangedEventArgs(ICollection configurationMessages)
-        {
-            this.configurationMessages = configurationMessages;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public ICollection ConfigurationMessages
-        {
-            get { return configurationMessages; }
-        }
+      this.configurationMessages = configurationMessages;
     }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public ICollection ConfigurationMessages
+    {
+      get { return configurationMessages; }
+    }
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/DefaultLoggerFactory.cs b/src/log4net/Repository/Hierarchy/DefaultLoggerFactory.cs
index 78239c5..2f55243 100644
--- a/src/log4net/Repository/Hierarchy/DefaultLoggerFactory.cs
+++ b/src/log4net/Repository/Hierarchy/DefaultLoggerFactory.cs
@@ -21,94 +21,94 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// Default implementation of <see cref="ILoggerFactory"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This default implementation of the <see cref="ILoggerFactory"/>
-	/// interface is used to create the default subclass
-	/// of the <see cref="Logger"/> object.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	internal class DefaultLoggerFactory : ILoggerFactory
-	{
-		#region Internal Instance Constructors
+  /// <summary>
+  /// Default implementation of <see cref="ILoggerFactory"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This default implementation of the <see cref="ILoggerFactory"/>
+  /// interface is used to create the default subclass
+  /// of the <see cref="Logger"/> object.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  internal class DefaultLoggerFactory : ILoggerFactory
+  {
+    #region Internal Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="DefaultLoggerFactory" /> class. 
-		/// </para>
-		/// </remarks>
-		internal DefaultLoggerFactory()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="DefaultLoggerFactory" /> class. 
+    /// </para>
+    /// </remarks>
+    internal DefaultLoggerFactory()
+    {
+    }
 
-		#endregion Internal Instance Constructors
+    #endregion Internal Instance Constructors
 
-		#region Implementation of ILoggerFactory
+    #region Implementation of ILoggerFactory
 
-		/// <summary>
-		/// Create a new <see cref="Logger" /> instance
-		/// </summary>
-		/// <param name="repository">The <see cref="ILoggerRepository" /> that will own the <see cref="Logger" />.</param>
-		/// <param name="name">The name of the <see cref="Logger" />.</param>
-		/// <returns>The <see cref="Logger" /> instance for the specified name.</returns>
-		/// <remarks>
-		/// <para>
-		/// Create a new <see cref="Logger" /> instance with the 
-		/// specified name.
-		/// </para>
-		/// <para>
-		/// Called by the <see cref="Hierarchy"/> to create
-		/// new named <see cref="Logger"/> instances.
-		/// </para>
-		/// <para>
-		/// If the <paramref name="name"/> is <c>null</c> then the root logger
-		/// must be returned.
-		/// </para>
-		/// </remarks>
-		public Logger CreateLogger(ILoggerRepository repository, string name) 
-		{
-			if (name == null)
-			{
-				return new RootLogger(repository.LevelMap.LookupWithDefault(Level.Debug));
-			}
-			return new LoggerImpl(name);
-		}
+    /// <summary>
+    /// Create a new <see cref="Logger" /> instance
+    /// </summary>
+    /// <param name="repository">The <see cref="ILoggerRepository" /> that will own the <see cref="Logger" />.</param>
+    /// <param name="name">The name of the <see cref="Logger" />.</param>
+    /// <returns>The <see cref="Logger" /> instance for the specified name.</returns>
+    /// <remarks>
+    /// <para>
+    /// Create a new <see cref="Logger" /> instance with the 
+    /// specified name.
+    /// </para>
+    /// <para>
+    /// Called by the <see cref="Hierarchy"/> to create
+    /// new named <see cref="Logger"/> instances.
+    /// </para>
+    /// <para>
+    /// If the <paramref name="name"/> is <c>null</c> then the root logger
+    /// must be returned.
+    /// </para>
+    /// </remarks>
+    public Logger CreateLogger(ILoggerRepository repository, string name)
+    {
+      if (name == null)
+      {
+        return new RootLogger(repository.LevelMap.LookupWithDefault(Level.Debug));
+      }
+      return new LoggerImpl(name);
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Default internal subclass of <see cref="Logger"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This subclass has no additional behavior over the
-		/// <see cref="Logger"/> class but does allow instances
-		/// to be created.
-		/// </para>
-		/// </remarks>
-		internal sealed class LoggerImpl : Logger
-		{
-			/// <summary>
-			/// Construct a new Logger
-			/// </summary>
-			/// <param name="name">the name of the logger</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="LoggerImpl" /> class
-			/// with the specified name. 
-			/// </para>
-			/// </remarks>
-			internal LoggerImpl(string name) : base(name)
-			{
-			}
-		}
-	}
+    /// <summary>
+    /// Default internal subclass of <see cref="Logger"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This subclass has no additional behavior over the
+    /// <see cref="Logger"/> class but does allow instances
+    /// to be created.
+    /// </para>
+    /// </remarks>
+    internal sealed class LoggerImpl : Logger
+    {
+      /// <summary>
+      /// Construct a new Logger
+      /// </summary>
+      /// <param name="name">the name of the logger</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="LoggerImpl" /> class
+      /// with the specified name. 
+      /// </para>
+      /// </remarks>
+      internal LoggerImpl(string name) : base(name)
+      {
+      }
+    }
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/Hierarchy.cs b/src/log4net/Repository/Hierarchy/Hierarchy.cs
index c21d09a..144b5c4 100644
--- a/src/log4net/Repository/Hierarchy/Hierarchy.cs
+++ b/src/log4net/Repository/Hierarchy/Hierarchy.cs
@@ -26,1061 +26,1062 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	#region LoggerCreationEvent
+  #region LoggerCreationEvent
 
-	/// <summary>
-	/// Delegate used to handle logger creation event notifications.
-	/// </summary>
-	/// <param name="sender">The <see cref="Hierarchy"/> in which the <see cref="Logger"/> has been created.</param>
-	/// <param name="e">The <see cref="LoggerCreationEventArgs"/> event args that hold the <see cref="Logger"/> instance that has been created.</param>
-	/// <remarks>
-	/// <para>
-	/// Delegate used to handle logger creation event notifications.
-	/// </para>
-	/// </remarks>
-	public delegate void LoggerCreationEventHandler(object sender, LoggerCreationEventArgs e);
+  /// <summary>
+  /// Delegate used to handle logger creation event notifications.
+  /// </summary>
+  /// <param name="sender">The <see cref="Hierarchy"/> in which the <see cref="Logger"/> has been created.</param>
+  /// <param name="e">The <see cref="LoggerCreationEventArgs"/> event args that hold the <see cref="Logger"/> instance that has been created.</param>
+  /// <remarks>
+  /// <para>
+  /// Delegate used to handle logger creation event notifications.
+  /// </para>
+  /// </remarks>
+  public delegate void LoggerCreationEventHandler(object sender, LoggerCreationEventArgs e);
 
-	/// <summary>
-	/// Provides data for the <see cref="Hierarchy.LoggerCreatedEvent"/> event.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A <see cref="Hierarchy.LoggerCreatedEvent"/> event is raised every time a
-	/// <see cref="Logger"/> is created.
-	/// </para>
-	/// </remarks>
-	public class LoggerCreationEventArgs : EventArgs
-	{
-		/// <summary>
-		/// The <see cref="Logger"/> created
-		/// </summary>
-		private Logger m_log;
+  /// <summary>
+  /// Provides data for the <see cref="Hierarchy.LoggerCreatedEvent"/> event.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A <see cref="Hierarchy.LoggerCreatedEvent"/> event is raised every time a
+  /// <see cref="Logger"/> is created.
+  /// </para>
+  /// </remarks>
+  public class LoggerCreationEventArgs : EventArgs
+  {
+    /// <summary>
+    /// The <see cref="Logger"/> created
+    /// </summary>
+    private Logger m_log;
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="log">The <see cref="Logger"/> that has been created.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LoggerCreationEventArgs" /> event argument 
-		/// class,with the specified <see cref="Logger"/>.
-		/// </para>
-		/// </remarks>
-		public LoggerCreationEventArgs(Logger log)
-		{
-			m_log = log;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="log">The <see cref="Logger"/> that has been created.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LoggerCreationEventArgs" /> event argument 
+    /// class,with the specified <see cref="Logger"/>.
+    /// </para>
+    /// </remarks>
+    public LoggerCreationEventArgs(Logger log)
+    {
+      m_log = log;
+    }
 
-		/// <summary>
-		/// Gets the <see cref="Logger"/> that has been created.
-		/// </summary>
-		/// <value>
-		/// The <see cref="Logger"/> that has been created.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="Logger"/> that has been created.
-		/// </para>
-		/// </remarks>
-		public Logger Logger
-		{
-			get { return m_log; }
-		}
-	}
+    /// <summary>
+    /// Gets the <see cref="Logger"/> that has been created.
+    /// </summary>
+    /// <value>
+    /// The <see cref="Logger"/> that has been created.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="Logger"/> that has been created.
+    /// </para>
+    /// </remarks>
+    public Logger Logger
+    {
+      get { return m_log; }
+    }
+  }
 
-	#endregion LoggerCreationEvent
+  #endregion LoggerCreationEvent
 
-	/// <summary>
-	/// Hierarchical organization of loggers
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <i>The casual user should not have to deal with this class
-	/// directly.</i>
-	/// </para>
-	/// <para>
-	/// This class is specialized in retrieving loggers by name and
-	/// also maintaining the logger hierarchy. Implements the 
-	/// <see cref="ILoggerRepository"/> interface.
-	/// </para>
-	/// <para>
-	/// The structure of the logger hierarchy is maintained by the
-	/// <see cref="M:GetLogger(string)"/> method. The hierarchy is such that children
-	/// link to their parent but parents do not have any references to their
-	/// children. Moreover, loggers can be instantiated in any order, in
-	/// particular descendant before ancestor.
-	/// </para>
-	/// <para>
-	/// In case a descendant is created before a particular ancestor,
-	/// then it creates a provision node for the ancestor and adds itself
-	/// to the provision node. Other descendants of the same ancestor add
-	/// themselves to the previously created provision node.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class Hierarchy : LoggerRepositorySkeleton, IBasicRepositoryConfigurator, IXmlRepositoryConfigurator
-	{
-		#region Public Events
+  /// <summary>
+  /// Hierarchical organization of loggers
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <i>The casual user should not have to deal with this class
+  /// directly.</i>
+  /// </para>
+  /// <para>
+  /// This class is specialized in retrieving loggers by name and
+  /// also maintaining the logger hierarchy. Implements the 
+  /// <see cref="ILoggerRepository"/> interface.
+  /// </para>
+  /// <para>
+  /// The structure of the logger hierarchy is maintained by the
+  /// <see cref="M:GetLogger(string)"/> method. The hierarchy is such that children
+  /// link to their parent but parents do not have any references to their
+  /// children. Moreover, loggers can be instantiated in any order, in
+  /// particular descendant before ancestor.
+  /// </para>
+  /// <para>
+  /// In case a descendant is created before a particular ancestor,
+  /// then it creates a provision node for the ancestor and adds itself
+  /// to the provision node. Other descendants of the same ancestor add
+  /// themselves to the previously created provision node.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class Hierarchy : LoggerRepositorySkeleton, IBasicRepositoryConfigurator, IXmlRepositoryConfigurator
+  {
+    #region Public Events
 
-		/// <summary>
-		/// Event used to notify that a logger has been created.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Event raised when a logger is created.
-		/// </para>
-		/// </remarks>
-		public event LoggerCreationEventHandler LoggerCreatedEvent
-		{
-			add { m_loggerCreatedEvent += value; }
-			remove { m_loggerCreatedEvent -= value; }
-		}
+    /// <summary>
+    /// Event used to notify that a logger has been created.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Event raised when a logger is created.
+    /// </para>
+    /// </remarks>
+    public event LoggerCreationEventHandler LoggerCreatedEvent
+    {
+      add { m_loggerCreatedEvent += value; }
+      remove { m_loggerCreatedEvent -= value; }
+    }
 
-		#endregion Public Events
+    #endregion Public Events
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Hierarchy" /> class.
-		/// </para>
-		/// </remarks>
-		public Hierarchy() : this(new DefaultLoggerFactory())
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Hierarchy" /> class.
+    /// </para>
+    /// </remarks>
+    public Hierarchy() : this(new DefaultLoggerFactory())
+    {
+    }
 
-		/// <summary>
-		/// Construct with properties
-		/// </summary>
-		/// <param name="properties">The properties to pass to this repository.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Hierarchy" /> class.
-		/// </para>
-		/// </remarks>
-		public Hierarchy(PropertiesDictionary properties) : this(properties, new DefaultLoggerFactory())
-		{
-		}
+    /// <summary>
+    /// Construct with properties
+    /// </summary>
+    /// <param name="properties">The properties to pass to this repository.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Hierarchy" /> class.
+    /// </para>
+    /// </remarks>
+    public Hierarchy(PropertiesDictionary properties) : this(properties, new DefaultLoggerFactory())
+    {
+    }
 
-		/// <summary>
-		/// Construct with a logger factory
-		/// </summary>
-		/// <param name="loggerFactory">The factory to use to create new logger instances.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Hierarchy" /> class with 
-		/// the specified <see cref="ILoggerFactory" />.
-		/// </para>
-		/// </remarks>
-		public Hierarchy(ILoggerFactory loggerFactory) : this(new PropertiesDictionary(), loggerFactory)
-		{
-		}
+    /// <summary>
+    /// Construct with a logger factory
+    /// </summary>
+    /// <param name="loggerFactory">The factory to use to create new logger instances.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Hierarchy" /> class with 
+    /// the specified <see cref="ILoggerFactory" />.
+    /// </para>
+    /// </remarks>
+    public Hierarchy(ILoggerFactory loggerFactory) : this(new PropertiesDictionary(), loggerFactory)
+    {
+    }
 
-		/// <summary>
-		/// Construct with properties and a logger factory
-		/// </summary>
-		/// <param name="properties">The properties to pass to this repository.</param>
-		/// <param name="loggerFactory">The factory to use to create new logger instances.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="Hierarchy" /> class with 
-		/// the specified <see cref="ILoggerFactory" />.
-		/// </para>
-		/// </remarks>
-		public Hierarchy(PropertiesDictionary properties, ILoggerFactory loggerFactory) : base(properties)
-		{
-			if (loggerFactory == null)
-			{
-				throw new ArgumentNullException("loggerFactory");
-			}
+    /// <summary>
+    /// Construct with properties and a logger factory
+    /// </summary>
+    /// <param name="properties">The properties to pass to this repository.</param>
+    /// <param name="loggerFactory">The factory to use to create new logger instances.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="Hierarchy" /> class with 
+    /// the specified <see cref="ILoggerFactory" />.
+    /// </para>
+    /// </remarks>
+    public Hierarchy(PropertiesDictionary properties, ILoggerFactory loggerFactory) : base(properties)
+    {
+      if (loggerFactory == null)
+      {
+        throw new ArgumentNullException("loggerFactory");
+      }
 
-			m_defaultFactory = loggerFactory;
+      m_defaultFactory = loggerFactory;
 
-			m_ht = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
-		}
+      m_ht = System.Collections.Hashtable.Synchronized(new System.Collections.Hashtable());
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Has no appender warning been emitted
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Flag to indicate if we have already issued a warning
-		/// about not having an appender warning.
-		/// </para>
-		/// </remarks>
-		public bool EmittedNoAppenderWarning
-		{
-			get { return m_emittedNoAppenderWarning; }
-			set { m_emittedNoAppenderWarning = value; }
-		}
+    /// <summary>
+    /// Has no appender warning been emitted
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Flag to indicate if we have already issued a warning
+    /// about not having an appender warning.
+    /// </para>
+    /// </remarks>
+    public bool EmittedNoAppenderWarning
+    {
+      get { return m_emittedNoAppenderWarning; }
+      set { m_emittedNoAppenderWarning = value; }
+    }
 
-		/// <summary>
-		/// Get the root of this hierarchy
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Get the root of this hierarchy.
-		/// </para>
-		/// </remarks>
-		public Logger Root
-		{
-			get 
-			{ 
-				if (m_root == null)
-				{
-					lock(this)
-					{
-						if (m_root == null)
-						{
-							// Create the root logger
-							Logger root = m_defaultFactory.CreateLogger(this, null);
-							root.Hierarchy = this;
-
-							// Store root
-							m_root = root;
-						}
-					}
-				}
-				return m_root; 
-			}
-		}
-
-		/// <summary>
-		/// Gets or sets the default <see cref="ILoggerFactory" /> instance.
-		/// </summary>
-		/// <value>The default <see cref="ILoggerFactory" /></value>
-		/// <remarks>
-		/// <para>
-		/// The logger factory is used to create logger instances.
-		/// </para>
-		/// </remarks>
-		public ILoggerFactory LoggerFactory
-		{
-			get { return m_defaultFactory; }
-			set
-			{
-				if (value == null)
-				{
-					throw new ArgumentNullException("value");
-				}
-				m_defaultFactory = value;
-			}
-		}
-
-		#endregion Public Instance Properties
-
-		#region Override Implementation of LoggerRepositorySkeleton
-
-		/// <summary>
-		/// Test if a logger exists
-		/// </summary>
-		/// <param name="name">The name of the logger to lookup</param>
-		/// <returns>The Logger object with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Check if the named logger exists in the hierarchy. If so return
-		/// its reference, otherwise returns <c>null</c>.
-		/// </para>
-		/// </remarks>
-		public override ILogger Exists(string name) 
-		{	
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-
-			lock(m_ht) 
-			{
-				return m_ht[new LoggerKey(name)] as Logger;
-			}
-		}
-
-		/// <summary>
-		/// Returns all the currently defined loggers in the hierarchy as an Array
-		/// </summary>
-		/// <returns>All the defined loggers</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns all the currently defined loggers in the hierarchy as an Array.
-		/// The root logger is <b>not</b> included in the returned
-		/// enumeration.
-		/// </para>
-		/// </remarks>
-		public override ILogger[] GetCurrentLoggers() 
-		{
-			// The accumulation in loggers is necessary because not all elements in
-			// ht are Logger objects as there might be some ProvisionNodes
-			// as well.
-			lock(m_ht) 
-			{
-				System.Collections.ArrayList loggers = new System.Collections.ArrayList(m_ht.Count);
-	
-				// Iterate through m_ht values
-				foreach(object node in m_ht.Values)
-				{
-					if (node is Logger) 
-					{
-						loggers.Add(node);
-					}
-				}
-				return (Logger[])loggers.ToArray(typeof(Logger));
-			}
-		}
-
-		/// <summary>
-		/// Return a new logger instance named as the first parameter using
-		/// the default factory.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Return a new logger instance named as the first parameter using
-		/// the default factory.
-		/// </para>
-		/// <para>
-		/// If a logger of that name already exists, then it will be
-		/// returned.  Otherwise, a new logger will be instantiated and
-		/// then linked with its existing ancestors as well as children.
-		/// </para>
-		/// </remarks>
-		/// <param name="name">The name of the logger to retrieve</param>
-		/// <returns>The logger object with the name specified</returns>
-		public override ILogger GetLogger(string name) 
-		{
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-
-			return GetLogger(name, m_defaultFactory);
-		}
-
-		/// <summary>
-		/// Shutting down a hierarchy will <i>safely</i> close and remove
-		/// all appenders in all loggers including the root logger.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Shutting down a hierarchy will <i>safely</i> close and remove
-		/// all appenders in all loggers including the root logger.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the
-		/// application exists. Otherwise, pending logging events might be
-		/// lost.
-		/// </para>
-		/// <para>
-		/// The <c>Shutdown</c> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		public override void Shutdown() 
-		{
-			LogLog.Debug(declaringType, "Shutdown called on Hierarchy ["+this.Name+"]");
-
-			// begin by closing nested appenders
-			Root.CloseNestedAppenders();
-
-			lock(m_ht) 
-			{
-				ILogger[] currentLoggers = this.GetCurrentLoggers();
-
-				foreach(Logger logger in currentLoggers)
-				{
-					logger.CloseNestedAppenders();
-				}
-
-				// then, remove all appenders
-				Root.RemoveAllAppenders();
-
-				foreach(Logger logger in currentLoggers)
-				{
-					logger.RemoveAllAppenders();
-				}
-			}
-
-			base.Shutdown();
-		}
-
-		/// <summary>
-		/// Reset all values contained in this hierarchy instance to their default.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Reset all values contained in this hierarchy instance to their
-		/// default.  This removes all appenders from all loggers, sets
-		/// the level of all non-root loggers to <c>null</c>,
-		/// sets their additivity flag to <c>true</c> and sets the level
-		/// of the root logger to <see cref="Level.Debug"/>. Moreover,
-		/// message disabling is set its default "off" value.
-		/// </para>
-		/// <para>
-		/// Existing loggers are not removed. They are just reset.
-		/// </para>
-		/// <para>
-		/// This method should be used sparingly and with care as it will
-		/// block all logging until it is completed.
-		/// </para>
-		/// </remarks>
-		public override void ResetConfiguration() 
-		{
-			Root.Level = LevelMap.LookupWithDefault(Level.Debug);
-			Threshold = LevelMap.LookupWithDefault(Level.All);
-	
-			// the synchronization is needed to prevent hashtable surprises
-			lock(m_ht) 
-			{	
-				Shutdown(); // nested locks are OK	
-	
-				foreach(Logger l in this.GetCurrentLoggers())
-				{
-					l.Level = null;
-					l.Additivity = true;
-				}
-			}
-
-			base.ResetConfiguration();
-
-			// Notify listeners
-			OnConfigurationChanged(null);
-		}
-
-		/// <summary>
-		/// Log the logEvent through this hierarchy.
-		/// </summary>
-		/// <param name="logEvent">the event to log</param>
-		/// <remarks>
-		/// <para>
-		/// This method should not normally be used to log.
-		/// The <see cref="ILog"/> interface should be used 
-		/// for routine logging. This interface can be obtained
-		/// using the <see cref="M:log4net.LogManager.GetLogger(string)"/> method.
-		/// </para>
-		/// <para>
-		/// The <c>logEvent</c> is delivered to the appropriate logger and
-		/// that logger is then responsible for logging the event.
-		/// </para>
-		/// </remarks>
-		public override void Log(LoggingEvent logEvent)
-		{
-			if (logEvent == null)
-			{
-				throw new ArgumentNullException("logEvent");
-			}
-
-			this.GetLogger(logEvent.LoggerName, m_defaultFactory).Log(logEvent);
-		}
-
-		/// <summary>
-		/// Returns all the Appenders that are currently configured
-		/// </summary>
-		/// <returns>An array containing all the currently configured appenders</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns all the <see cref="log4net.Appender.IAppender"/> instances that are currently configured.
-		/// All the loggers are searched for appenders. The appenders may also be containers
-		/// for appenders and these are also searched for additional loggers.
-		/// </para>
-		/// <para>
-		/// The list returned is unordered but does not contain duplicates.
-		/// </para>
-		/// </remarks>
-		public override Appender.IAppender[] GetAppenders()
-		{
-			System.Collections.ArrayList appenderList = new System.Collections.ArrayList();
-
-			CollectAppenders(appenderList, Root);
-
-			foreach(Logger logger in GetCurrentLoggers())
-			{
-				CollectAppenders(appenderList, logger);
-			}
-
-			return (Appender.IAppender[])appenderList.ToArray(typeof(Appender.IAppender));
-		}
-
-		#endregion Override Implementation of LoggerRepositorySkeleton
-
-        #region Private Static Methods
-
-        /// <summary>
-		/// Collect the appenders from an <see cref="IAppenderAttachable"/>.
-		/// The appender may also be a container.
-		/// </summary>
-		/// <param name="appenderList"></param>
-		/// <param name="appender"></param>
-		private static void CollectAppender(System.Collections.ArrayList appenderList, Appender.IAppender appender)
-		{
-			if (!appenderList.Contains(appender))
-			{
-				appenderList.Add(appender);
-
-				IAppenderAttachable container = appender as IAppenderAttachable;
-				if (container != null)
-				{
-					CollectAppenders(appenderList, container);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Collect the appenders from an <see cref="IAppenderAttachable"/> container
-		/// </summary>
-		/// <param name="appenderList"></param>
-		/// <param name="container"></param>
-		private static void CollectAppenders(System.Collections.ArrayList appenderList, IAppenderAttachable container)
-		{
-			foreach(Appender.IAppender appender in container.Appenders)
-			{
-				CollectAppender(appenderList, appender);
-			}
-        }
-
-        #endregion
-
-        #region Implementation of IBasicRepositoryConfigurator
-
-        /// <summary>
-		/// Initialize the log4net system using the specified appender
-		/// </summary>
-		/// <param name="appender">the appender to use to log all logging events</param>
-		void IBasicRepositoryConfigurator.Configure(IAppender appender)
-		{
-			BasicRepositoryConfigure(appender);
-		}
-
-        /// <summary>
-        /// Initialize the log4net system using the specified appenders
-        /// </summary>
-        /// <param name="appenders">the appenders to use to log all logging events</param>
-        void IBasicRepositoryConfigurator.Configure(params IAppender[] appenders)
+    /// <summary>
+    /// Get the root of this hierarchy
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Get the root of this hierarchy.
+    /// </para>
+    /// </remarks>
+    public Logger Root
+    {
+      get
+      {
+        if (m_root == null)
         {
-            BasicRepositoryConfigure(appenders);
+          lock (this)
+          {
+            if (m_root == null)
+            {
+              // Create the root logger
+              Logger root = m_defaultFactory.CreateLogger(this, null);
+              root.Hierarchy = this;
+
+              // Store root
+              m_root = root;
+            }
+          }
+        }
+        return m_root;
+      }
+    }
+
+    /// <summary>
+    /// Gets or sets the default <see cref="ILoggerFactory" /> instance.
+    /// </summary>
+    /// <value>The default <see cref="ILoggerFactory" /></value>
+    /// <remarks>
+    /// <para>
+    /// The logger factory is used to create logger instances.
+    /// </para>
+    /// </remarks>
+    public ILoggerFactory LoggerFactory
+    {
+      get { return m_defaultFactory; }
+      set
+      {
+        if (value == null)
+        {
+          throw new ArgumentNullException("value");
+        }
+        m_defaultFactory = value;
+      }
+    }
+
+    #endregion Public Instance Properties
+
+    #region Override Implementation of LoggerRepositorySkeleton
+
+    /// <summary>
+    /// Test if a logger exists
+    /// </summary>
+    /// <param name="name">The name of the logger to lookup</param>
+    /// <returns>The Logger object with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Check if the named logger exists in the hierarchy. If so return
+    /// its reference, otherwise returns <c>null</c>.
+    /// </para>
+    /// </remarks>
+    public override ILogger Exists(string name)
+    {
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+
+      lock (m_ht)
+      {
+        return m_ht[new LoggerKey(name)] as Logger;
+      }
+    }
+
+    /// <summary>
+    /// Returns all the currently defined loggers in the hierarchy as an Array
+    /// </summary>
+    /// <returns>All the defined loggers</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns all the currently defined loggers in the hierarchy as an Array.
+    /// The root logger is <b>not</b> included in the returned
+    /// enumeration.
+    /// </para>
+    /// </remarks>
+    public override ILogger[] GetCurrentLoggers()
+    {
+      // The accumulation in loggers is necessary because not all elements in
+      // ht are Logger objects as there might be some ProvisionNodes
+      // as well.
+      lock (m_ht)
+      {
+        System.Collections.ArrayList loggers = new System.Collections.ArrayList(m_ht.Count);
+
+        // Iterate through m_ht values
+        foreach (object node in m_ht.Values)
+        {
+          if (node is Logger)
+          {
+            loggers.Add(node);
+          }
+        }
+        return (Logger[])loggers.ToArray(typeof(Logger));
+      }
+    }
+
+    /// <summary>
+    /// Return a new logger instance named as the first parameter using
+    /// the default factory.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Return a new logger instance named as the first parameter using
+    /// the default factory.
+    /// </para>
+    /// <para>
+    /// If a logger of that name already exists, then it will be
+    /// returned.  Otherwise, a new logger will be instantiated and
+    /// then linked with its existing ancestors as well as children.
+    /// </para>
+    /// </remarks>
+    /// <param name="name">The name of the logger to retrieve</param>
+    /// <returns>The logger object with the name specified</returns>
+    public override ILogger GetLogger(string name)
+    {
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+
+      return GetLogger(name, m_defaultFactory);
+    }
+
+    /// <summary>
+    /// Shutting down a hierarchy will <i>safely</i> close and remove
+    /// all appenders in all loggers including the root logger.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Shutting down a hierarchy will <i>safely</i> close and remove
+    /// all appenders in all loggers including the root logger.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the
+    /// application exists. Otherwise, pending logging events might be
+    /// lost.
+    /// </para>
+    /// <para>
+    /// The <c>Shutdown</c> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    public override void Shutdown()
+    {
+      LogLog.Debug(declaringType, "Shutdown called on Hierarchy [" + this.Name + "]");
+
+      // begin by closing nested appenders
+      Root.CloseNestedAppenders();
+
+      lock (m_ht)
+      {
+        ILogger[] currentLoggers = this.GetCurrentLoggers();
+
+        foreach (Logger logger in currentLoggers)
+        {
+          logger.CloseNestedAppenders();
         }
 
-		/// <summary>
-		/// Initialize the log4net system using the specified appenders
-		/// </summary>
-		/// <param name="appenders">the appenders to use to log all logging events</param>
-		/// <remarks>
-		/// <para>
-		/// This method provides the same functionality as the 
-		/// <see cref="M:IBasicRepositoryConfigurator.Configure(IAppender)"/> method implemented
-		/// on this object, but it is protected and therefore can be called by subclasses.
-		/// </para>
-		/// </remarks>
-		protected void BasicRepositoryConfigure(params IAppender[] appenders)
-		{
-            ArrayList configurationMessages = new ArrayList();
+        // then, remove all appenders
+        Root.RemoveAllAppenders();
 
-            using (new LogLog.LogReceivedAdapter(configurationMessages))
+        foreach (Logger logger in currentLoggers)
+        {
+          logger.RemoveAllAppenders();
+        }
+      }
+
+      base.Shutdown();
+    }
+
+    /// <summary>
+    /// Reset all values contained in this hierarchy instance to their default.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Reset all values contained in this hierarchy instance to their
+    /// default.  This removes all appenders from all loggers, sets
+    /// the level of all non-root loggers to <c>null</c>,
+    /// sets their additivity flag to <c>true</c> and sets the level
+    /// of the root logger to <see cref="Level.Debug"/>. Moreover,
+    /// message disabling is set its default "off" value.
+    /// </para>
+    /// <para>
+    /// Existing loggers are not removed. They are just reset.
+    /// </para>
+    /// <para>
+    /// This method should be used sparingly and with care as it will
+    /// block all logging until it is completed.
+    /// </para>
+    /// </remarks>
+    public override void ResetConfiguration()
+    {
+      Root.Level = LevelMap.LookupWithDefault(Level.Debug);
+      Threshold = LevelMap.LookupWithDefault(Level.All);
+
+      // the synchronization is needed to prevent hashtable surprises
+      lock (m_ht)
+      {
+        Shutdown(); // nested locks are OK  
+
+        foreach (Logger l in this.GetCurrentLoggers())
+        {
+          l.Level = null;
+          l.Additivity = true;
+        }
+      }
+
+      base.ResetConfiguration();
+
+      // Notify listeners
+      OnConfigurationChanged(null);
+    }
+
+    /// <summary>
+    /// Log the logEvent through this hierarchy.
+    /// </summary>
+    /// <param name="logEvent">the event to log</param>
+    /// <remarks>
+    /// <para>
+    /// This method should not normally be used to log.
+    /// The <see cref="ILog"/> interface should be used 
+    /// for routine logging. This interface can be obtained
+    /// using the <see cref="M:log4net.LogManager.GetLogger(string)"/> method.
+    /// </para>
+    /// <para>
+    /// The <c>logEvent</c> is delivered to the appropriate logger and
+    /// that logger is then responsible for logging the event.
+    /// </para>
+    /// </remarks>
+    public override void Log(LoggingEvent logEvent)
+    {
+      if (logEvent == null)
+      {
+        throw new ArgumentNullException("logEvent");
+      }
+
+      this.GetLogger(logEvent.LoggerName, m_defaultFactory).Log(logEvent);
+    }
+
+    /// <summary>
+    /// Returns all the Appenders that are currently configured
+    /// </summary>
+    /// <returns>An array containing all the currently configured appenders</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns all the <see cref="log4net.Appender.IAppender"/> instances that are currently configured.
+    /// All the loggers are searched for appenders. The appenders may also be containers
+    /// for appenders and these are also searched for additional loggers.
+    /// </para>
+    /// <para>
+    /// The list returned is unordered but does not contain duplicates.
+    /// </para>
+    /// </remarks>
+    public override Appender.IAppender[] GetAppenders()
+    {
+      System.Collections.ArrayList appenderList = new System.Collections.ArrayList();
+
+      CollectAppenders(appenderList, Root);
+
+      foreach (Logger logger in GetCurrentLoggers())
+      {
+        CollectAppenders(appenderList, logger);
+      }
+
+      return (Appender.IAppender[])appenderList.ToArray(typeof(Appender.IAppender));
+    }
+
+    #endregion Override Implementation of LoggerRepositorySkeleton
+
+    #region Private Static Methods
+
+    /// <summary>
+    /// Collect the appenders from an <see cref="IAppenderAttachable"/>.
+    /// The appender may also be a container.
+    /// </summary>
+    /// <param name="appenderList"></param>
+    /// <param name="appender"></param>
+    private static void CollectAppender(System.Collections.ArrayList appenderList, Appender.IAppender appender)
+    {
+      if (!appenderList.Contains(appender))
+      {
+        appenderList.Add(appender);
+
+        IAppenderAttachable container = appender as IAppenderAttachable;
+        if (container != null)
+        {
+          CollectAppenders(appenderList, container);
+        }
+      }
+    }
+
+    /// <summary>
+    /// Collect the appenders from an <see cref="IAppenderAttachable"/> container
+    /// </summary>
+    /// <param name="appenderList"></param>
+    /// <param name="container"></param>
+    private static void CollectAppenders(System.Collections.ArrayList appenderList, IAppenderAttachable container)
+    {
+      foreach (Appender.IAppender appender in container.Appenders)
+      {
+        CollectAppender(appenderList, appender);
+      }
+    }
+
+    #endregion
+
+    #region Implementation of IBasicRepositoryConfigurator
+
+    /// <summary>
+    /// Initialize the log4net system using the specified appender
+    /// </summary>
+    /// <param name="appender">the appender to use to log all logging events</param>
+    void IBasicRepositoryConfigurator.Configure(IAppender appender)
+    {
+      BasicRepositoryConfigure(appender);
+    }
+
+    /// <summary>
+    /// Initialize the log4net system using the specified appenders
+    /// </summary>
+    /// <param name="appenders">the appenders to use to log all logging events</param>
+    void IBasicRepositoryConfigurator.Configure(params IAppender[] appenders)
+    {
+      BasicRepositoryConfigure(appenders);
+    }
+
+    /// <summary>
+    /// Initialize the log4net system using the specified appenders
+    /// </summary>
+    /// <param name="appenders">the appenders to use to log all logging events</param>
+    /// <remarks>
+    /// <para>
+    /// This method provides the same functionality as the 
+    /// <see cref="M:IBasicRepositoryConfigurator.Configure(IAppender)"/> method implemented
+    /// on this object, but it is protected and therefore can be called by subclasses.
+    /// </para>
+    /// </remarks>
+    protected void BasicRepositoryConfigure(params IAppender[] appenders)
+    {
+      ArrayList configurationMessages = new ArrayList();
+
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        foreach (IAppender appender in appenders)
+        {
+          Root.AddAppender(appender);
+        }
+      }
+
+      Configured = true;
+
+      ConfigurationMessages = configurationMessages;
+
+      // Notify listeners
+      OnConfigurationChanged(new ConfigurationChangedEventArgs(configurationMessages));
+    }
+
+    #endregion Implementation of IBasicRepositoryConfigurator
+
+    #region Implementation of IXmlRepositoryConfigurator
+
+    /// <summary>
+    /// Initialize the log4net system using the specified config
+    /// </summary>
+    /// <param name="element">the element containing the root of the config</param>
+    void IXmlRepositoryConfigurator.Configure(System.Xml.XmlElement element)
+    {
+      XmlRepositoryConfigure(element);
+    }
+
+    /// <summary>
+    /// Initialize the log4net system using the specified config
+    /// </summary>
+    /// <param name="element">the element containing the root of the config</param>
+    /// <remarks>
+    /// <para>
+    /// This method provides the same functionality as the 
+    /// <see cref="M:IBasicRepositoryConfigurator.Configure(IAppender)"/> method implemented
+    /// on this object, but it is protected and therefore can be called by subclasses.
+    /// </para>
+    /// </remarks>
+    protected void XmlRepositoryConfigure(System.Xml.XmlElement element)
+    {
+      ArrayList configurationMessages = new ArrayList();
+
+      using (new LogLog.LogReceivedAdapter(configurationMessages))
+      {
+        XmlHierarchyConfigurator config = new XmlHierarchyConfigurator(this);
+        config.Configure(element);
+      }
+
+      Configured = true;
+
+      ConfigurationMessages = configurationMessages;
+
+      // Notify listeners
+      OnConfigurationChanged(new ConfigurationChangedEventArgs(configurationMessages));
+    }
+
+    #endregion Implementation of IXmlRepositoryConfigurator
+
+    #region Public Instance Methods
+
+    /// <summary>
+    /// Test if this hierarchy is disabled for the specified <see cref="Level"/>.
+    /// </summary>
+    /// <param name="level">The level to check against.</param>
+    /// <returns>
+    /// <c>true</c> if the repository is disabled for the level argument, <c>false</c> otherwise.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// If this hierarchy has not been configured then this method will
+    /// always return <c>true</c>.
+    /// </para>
+    /// <para>
+    /// This method will return <c>true</c> if this repository is
+    /// disabled for <c>level</c> object passed as parameter and
+    /// <c>false</c> otherwise.
+    /// </para>
+    /// <para>
+    /// See also the <see cref="ILoggerRepository.Threshold"/> property.
+    /// </para>
+    /// </remarks>
+    public bool IsDisabled(Level level)
+    {
+      // Cast level to object for performance
+      if ((object)level == null)
+      {
+        throw new ArgumentNullException("level");
+      }
+
+      if (Configured)
+      {
+        return Threshold > level;
+      }
+      else
+      {
+        // If not configured the hierarchy is effectively disabled
+        return true;
+      }
+    }
+
+    /// <summary>
+    /// Clear all logger definitions from the internal hashtable
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This call will clear all logger definitions from the internal
+    /// hashtable. Invoking this method will irrevocably mess up the
+    /// logger hierarchy.
+    /// </para>
+    /// <para>
+    /// You should <b>really</b> know what you are doing before
+    /// invoking this method.
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      lock (m_ht)
+      {
+        m_ht.Clear();
+      }
+    }
+
+    /// <summary>
+    /// Return a new logger instance named as the first parameter using
+    /// <paramref name="factory"/>.
+    /// </summary>
+    /// <param name="name">The name of the logger to retrieve</param>
+    /// <param name="factory">The factory that will make the new logger instance</param>
+    /// <returns>The logger object with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// If a logger of that name already exists, then it will be
+    /// returned. Otherwise, a new logger will be instantiated by the
+    /// <paramref name="factory"/> parameter and linked with its existing
+    /// ancestors as well as children.
+    /// </para>
+    /// </remarks>
+    public Logger GetLogger(string name, ILoggerFactory factory)
+    {
+      if (name == null)
+      {
+        throw new ArgumentNullException("name");
+      }
+      if (factory == null)
+      {
+        throw new ArgumentNullException("factory");
+      }
+
+      LoggerKey key = new LoggerKey(name);
+
+      // Synchronize to prevent write conflicts. Read conflicts (in
+      // GetEffectiveLevel() method) are possible only if variable
+      // assignments are non-atomic.
+
+      lock (m_ht)
+      {
+        Logger logger = null;
+
+        Object node = m_ht[key];
+        if (node == null)
+        {
+          logger = factory.CreateLogger(this, name);
+          logger.Hierarchy = this;
+          m_ht[key] = logger;
+          UpdateParents(logger);
+          OnLoggerCreationEvent(logger);
+          return logger;
+        }
+
+        Logger nodeLogger = node as Logger;
+        if (nodeLogger != null)
+        {
+          return nodeLogger;
+        }
+
+        ProvisionNode nodeProvisionNode = node as ProvisionNode;
+        if (nodeProvisionNode != null)
+        {
+          logger = factory.CreateLogger(this, name);
+          logger.Hierarchy = this;
+          m_ht[key] = logger;
+          UpdateChildren(nodeProvisionNode, logger);
+          UpdateParents(logger);
+          OnLoggerCreationEvent(logger);
+          return logger;
+        }
+
+        // It should be impossible to arrive here but let's keep the compiler happy.
+        return null;
+      }
+    }
+
+    #endregion Public Instance Methods
+
+    #region Protected Instance Methods
+
+    /// <summary>
+    /// Sends a logger creation event to all registered listeners
+    /// </summary>
+    /// <param name="logger">The newly created logger</param>
+    /// <remarks>
+    /// Raises the logger creation event.
+    /// </remarks>
+    protected virtual void OnLoggerCreationEvent(Logger logger)
+    {
+      LoggerCreationEventHandler handler = m_loggerCreatedEvent;
+      if (handler != null)
+      {
+        handler(this, new LoggerCreationEventArgs(logger));
+      }
+    }
+
+    #endregion Protected Instance Methods
+
+    #region Private Instance Methods
+
+    /// <summary>
+    /// Updates all the parents of the specified logger
+    /// </summary>
+    /// <param name="log">The logger to update the parents for</param>
+    /// <remarks>
+    /// <para>
+    /// This method loops through all the <i>potential</i> parents of
+    /// <paramref name="log"/>. There 3 possible cases:
+    /// </para>
+    /// <list type="number">
+    ///    <item>
+    ///      <term>No entry for the potential parent of <paramref name="log"/> exists</term>
+    ///      <description>
+    ///      We create a ProvisionNode for this potential 
+    ///      parent and insert <paramref name="log"/> in that provision node.
+    ///      </description>
+    ///    </item>
+    ///    <item>
+    ///      <term>The entry is of type Logger for the potential parent.</term>
+    ///      <description>
+    ///      The entry is <paramref name="log"/>'s nearest existing parent. We 
+    ///      update <paramref name="log"/>'s parent field with this entry. We also break from 
+    ///      he loop because updating our parent's parent is our parent's 
+    ///      responsibility.
+    ///      </description>
+    ///    </item>
+    ///    <item>
+    ///      <term>The entry is of type ProvisionNode for this potential parent.</term>
+    ///      <description>
+    ///      We add <paramref name="log"/> to the list of children for this 
+    ///      potential parent.
+    ///      </description>
+    ///    </item>
+    /// </list>
+    /// </remarks>
+    private void UpdateParents(Logger log)
+    {
+      string name = log.Name;
+      int length = name.Length;
+      bool parentFound = false;
+
+      // if name = "w.x.y.z", loop through "w.x.y", "w.x" and "w", but not "w.x.y.z" 
+      for (int i = name.LastIndexOf('.', length - 1); i >= 0; i = name.LastIndexOf('.', i - 1))
+      {
+        string substr = name.Substring(0, i);
+
+        LoggerKey key = new LoggerKey(substr); // simple constructor
+        Object node = m_ht[key];
+        // Create a provision node for a future parent.
+        if (node == null)
+        {
+          ProvisionNode pn = new ProvisionNode(log);
+          m_ht[key] = pn;
+        }
+        else
+        {
+          Logger nodeLogger = node as Logger;
+          if (nodeLogger != null)
+          {
+            parentFound = true;
+            log.Parent = nodeLogger;
+            break; // no need to update the ancestors of the closest ancestor
+          }
+          else
+          {
+            ProvisionNode nodeProvisionNode = node as ProvisionNode;
+            if (nodeProvisionNode != null)
             {
-                foreach (IAppender appender in appenders)
-                {
-                    Root.AddAppender(appender);
-                }
+              nodeProvisionNode.Add(log);
             }
+            else
+            {
+              LogLog.Error(declaringType, "Unexpected object type [" + node.GetType() + "] in ht.", new LogException());
+            }
+          }
+        }
+        if (i == 0)
+        {
+          // logger name starts with a dot
+          // and we've hit the start
+          break;
+        }
+      }
 
-		    Configured = true;
+      // If we could not find any existing parents, then link with root.
+      if (!parentFound)
+      {
+        log.Parent = this.Root;
+      }
+    }
 
-            ConfigurationMessages = configurationMessages;
+    /// <summary>
+    /// Replace a <see cref="ProvisionNode"/> with a <see cref="Logger"/> in the hierarchy.
+    /// </summary>
+    /// <param name="pn"></param>
+    /// <param name="log"></param>
+    /// <remarks>
+    /// <para>
+    /// We update the links for all the children that placed themselves
+    /// in the provision node 'pn'. The second argument 'log' is a
+    /// reference for the newly created Logger, parent of all the
+    /// children in 'pn'.
+    /// </para>
+    /// <para>
+    /// We loop on all the children 'c' in 'pn'.
+    /// </para>
+    /// <para>
+    /// If the child 'c' has been already linked to a child of
+    /// 'log' then there is no need to update 'c'.
+    /// </para>
+    /// <para>
+    /// Otherwise, we set log's parent field to c's parent and set
+    /// c's parent field to log.
+    /// </para>
+    /// </remarks>
+    private static void UpdateChildren(ProvisionNode pn, Logger log)
+    {
+      for (int i = 0; i < pn.Count; i++)
+      {
+        Logger childLogger = (Logger)pn[i];
 
-			// Notify listeners
-            OnConfigurationChanged(new ConfigurationChangedEventArgs(configurationMessages));
-		}
+        // Unless this child already points to a correct (lower) parent,
+        // make log.Parent point to childLogger.Parent and childLogger.Parent to log.
+        if (!childLogger.Parent.Name.StartsWith(log.Name))
+        {
+          log.Parent = childLogger.Parent;
+          childLogger.Parent = log;
+        }
+      }
+    }
 
-	    #endregion Implementation of IBasicRepositoryConfigurator
+    /// <summary>
+    /// Define or redefine a Level using the values in the <see cref="LevelEntry"/> argument
+    /// </summary>
+    /// <param name="levelEntry">the level values</param>
+    /// <remarks>
+    /// <para>
+    /// Define or redefine a Level using the values in the <see cref="LevelEntry"/> argument
+    /// </para>
+    /// <para>
+    /// Supports setting levels via the configuration file.
+    /// </para>
+    /// </remarks>
+    internal void AddLevel(LevelEntry levelEntry)
+    {
+      if (levelEntry == null) throw new ArgumentNullException("levelEntry");
+      if (levelEntry.Name == null) throw new ArgumentNullException("levelEntry.Name");
 
-		#region Implementation of IXmlRepositoryConfigurator
+      // Lookup replacement value
+      if (levelEntry.Value == -1)
+      {
+        Level previousLevel = LevelMap[levelEntry.Name];
+        if (previousLevel == null)
+        {
+          throw new InvalidOperationException("Cannot redefine level [" + levelEntry.Name + "] because it is not defined in the LevelMap. To define the level supply the level value.");
+        }
 
-		/// <summary>
-		/// Initialize the log4net system using the specified config
-		/// </summary>
-		/// <param name="element">the element containing the root of the config</param>
-		void IXmlRepositoryConfigurator.Configure(System.Xml.XmlElement element)
-		{
-			XmlRepositoryConfigure(element);
-		}
+        levelEntry.Value = previousLevel.Value;
+      }
 
-		/// <summary>
-		/// Initialize the log4net system using the specified config
-		/// </summary>
-		/// <param name="element">the element containing the root of the config</param>
-		/// <remarks>
-		/// <para>
-		/// This method provides the same functionality as the 
-		/// <see cref="M:IBasicRepositoryConfigurator.Configure(IAppender)"/> method implemented
-		/// on this object, but it is protected and therefore can be called by subclasses.
-		/// </para>
-		/// </remarks>
-		protected void XmlRepositoryConfigure(System.Xml.XmlElement element)
-		{
-            ArrayList configurationMessages = new ArrayList();
+      LevelMap.Add(levelEntry.Name, levelEntry.Value, levelEntry.DisplayName);
+    }
 
-            using (new LogLog.LogReceivedAdapter(configurationMessages))
-		    {
-		        XmlHierarchyConfigurator config = new XmlHierarchyConfigurator(this);
-                config.Configure(element);
-		    }
+    /// <summary>
+    /// A class to hold the value, name and display name for a level
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// A class to hold the value, name and display name for a level
+    /// </para>
+    /// </remarks>
+    internal class LevelEntry
+    {
+      private int m_levelValue = -1;
+      private string m_levelName = null;
+      private string m_levelDisplayName = null;
 
-		    Configured = true;
+      /// <summary>
+      /// Value of the level
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// If the value is not set (defaults to -1) the value will be looked
+      /// up for the current level with the same name.
+      /// </para>
+      /// </remarks>
+      public int Value
+      {
+        get { return m_levelValue; }
+        set { m_levelValue = value; }
+      }
 
-            ConfigurationMessages = configurationMessages;
+      /// <summary>
+      /// Name of the level
+      /// </summary>
+      /// <value>
+      /// The name of the level
+      /// </value>
+      /// <remarks>
+      /// <para>
+      /// The name of the level.
+      /// </para>
+      /// </remarks>
+      public string Name
+      {
+        get { return m_levelName; }
+        set { m_levelName = value; }
+      }
 
-			// Notify listeners
-            OnConfigurationChanged(new ConfigurationChangedEventArgs(configurationMessages));
-		}
+      /// <summary>
+      /// Display name for the level
+      /// </summary>
+      /// <value>
+      /// The display name of the level
+      /// </value>
+      /// <remarks>
+      /// <para>
+      /// The display name of the level.
+      /// </para>
+      /// </remarks>
+      public string DisplayName
+      {
+        get { return m_levelDisplayName; }
+        set { m_levelDisplayName = value; }
+      }
 
-		#endregion Implementation of IXmlRepositoryConfigurator
+      /// <summary>
+      /// Override <c>Object.ToString</c> to return sensible debug info
+      /// </summary>
+      /// <returns>string info about this object</returns>
+      public override string ToString()
+      {
+        return "LevelEntry(Value=" + m_levelValue + ", Name=" + m_levelName + ", DisplayName=" + m_levelDisplayName + ")";
+      }
+    }
 
-		#region Public Instance Methods
+    /// <summary>
+    /// Set a Property using the values in the <see cref="LevelEntry"/> argument
+    /// </summary>
+    /// <param name="propertyEntry">the property value</param>
+    /// <remarks>
+    /// <para>
+    /// Set a Property using the values in the <see cref="LevelEntry"/> argument.
+    /// </para>
+    /// <para>
+    /// Supports setting property values via the configuration file.
+    /// </para>
+    /// </remarks>
+    internal void AddProperty(PropertyEntry propertyEntry)
+    {
+      if (propertyEntry == null) throw new ArgumentNullException("propertyEntry");
+      if (propertyEntry.Key == null) throw new ArgumentNullException("propertyEntry.Key");
 
-		/// <summary>
-		/// Test if this hierarchy is disabled for the specified <see cref="Level"/>.
-		/// </summary>
-		/// <param name="level">The level to check against.</param>
-		/// <returns>
-		/// <c>true</c> if the repository is disabled for the level argument, <c>false</c> otherwise.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// If this hierarchy has not been configured then this method will
-		/// always return <c>true</c>.
-		/// </para>
-		/// <para>
-		/// This method will return <c>true</c> if this repository is
-		/// disabled for <c>level</c> object passed as parameter and
-		/// <c>false</c> otherwise.
-		/// </para>
-		/// <para>
-		/// See also the <see cref="ILoggerRepository.Threshold"/> property.
-		/// </para>
-		/// </remarks>
-		public bool IsDisabled(Level level) 
-		{
-			// Cast level to object for performance
-			if ((object)level == null)
-			{
-				throw new ArgumentNullException("level");
-			}
+      Properties[propertyEntry.Key] = propertyEntry.Value;
+    }
 
-			if (Configured)
-			{
-				return Threshold > level;
-			}
-			else
-			{
-				// If not configured the hierarchy is effectively disabled
-				return true;
-			}
-		}
+    #endregion Private Instance Methods
 
-		/// <summary>
-		/// Clear all logger definitions from the internal hashtable
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This call will clear all logger definitions from the internal
-		/// hashtable. Invoking this method will irrevocably mess up the
-		/// logger hierarchy.
-		/// </para>
-		/// <para>
-		/// You should <b>really</b> know what you are doing before
-		/// invoking this method.
-		/// </para>
-		/// </remarks>
-		public void Clear() 
-		{
-			lock(m_ht) 
-			{
-				m_ht.Clear();
-			}
-		}
+    #region Private Instance Fields
 
-		/// <summary>
-		/// Return a new logger instance named as the first parameter using
-		/// <paramref name="factory"/>.
-		/// </summary>
-		/// <param name="name">The name of the logger to retrieve</param>
-		/// <param name="factory">The factory that will make the new logger instance</param>
-		/// <returns>The logger object with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// If a logger of that name already exists, then it will be
-		/// returned. Otherwise, a new logger will be instantiated by the
-		/// <paramref name="factory"/> parameter and linked with its existing
-		/// ancestors as well as children.
-		/// </para>
-		/// </remarks>
-		public Logger GetLogger(string name, ILoggerFactory factory) 
-		{
-			if (name == null)
-			{
-				throw new ArgumentNullException("name");
-			}
-			if (factory == null)
-			{
-				throw new ArgumentNullException("factory");
-			}
+    private ILoggerFactory m_defaultFactory;
 
-			LoggerKey key = new LoggerKey(name);   
- 
-			// Synchronize to prevent write conflicts. Read conflicts (in
-			// GetEffectiveLevel() method) are possible only if variable
-			// assignments are non-atomic.
+    private System.Collections.Hashtable m_ht;
+    private Logger m_root;
 
-			lock(m_ht) 
-			{
-				Logger logger = null;
+    private bool m_emittedNoAppenderWarning = false;
 
-				Object node = m_ht[key];
-				if (node == null) 
-				{
-					logger = factory.CreateLogger(this, name);
-					logger.Hierarchy = this;
-					m_ht[key] = logger;	  
-					UpdateParents(logger);
-					OnLoggerCreationEvent(logger);
-					return logger;
-				} 
-				
-				Logger nodeLogger = node as Logger;
-				if (nodeLogger != null) 
-				{
-					return nodeLogger;
-				} 
-				
-				ProvisionNode nodeProvisionNode = node as ProvisionNode;
-				if (nodeProvisionNode != null) 
-				{
-					logger = factory.CreateLogger(this, name);
-					logger.Hierarchy = this; 
-					m_ht[key] = logger;
-					UpdateChildren(nodeProvisionNode, logger);
-					UpdateParents(logger);	
-					OnLoggerCreationEvent(logger);
-					return logger;
-				}
+    private event LoggerCreationEventHandler m_loggerCreatedEvent;
 
-				// It should be impossible to arrive here but let's keep the compiler happy.
-				return null;
-			}
-		}
+    #endregion Private Instance Fields
 
-		#endregion Public Instance Methods
+    #region Private Static Fields
 
-		#region Protected Instance Methods
+    /// <summary>
+    /// The fully qualified type of the Hierarchy class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(Hierarchy);
 
-		/// <summary>
-		/// Sends a logger creation event to all registered listeners
-		/// </summary>
-		/// <param name="logger">The newly created logger</param>
-		/// <remarks>
-		/// Raises the logger creation event.
-		/// </remarks>
-		protected virtual void OnLoggerCreationEvent(Logger logger) 
-		{
-			LoggerCreationEventHandler handler = m_loggerCreatedEvent;
-			if (handler != null)
-			{
-				handler(this, new LoggerCreationEventArgs(logger));
-			}
-		}
-
-		#endregion Protected Instance Methods
-
-		#region Private Instance Methods
-
-		/// <summary>
-		/// Updates all the parents of the specified logger
-		/// </summary>
-		/// <param name="log">The logger to update the parents for</param>
-		/// <remarks>
-		/// <para>
-		/// This method loops through all the <i>potential</i> parents of
-		/// <paramref name="log"/>. There 3 possible cases:
-		/// </para>
-		/// <list type="number">
-		///		<item>
-		///			<term>No entry for the potential parent of <paramref name="log"/> exists</term>
-		///			<description>
-		///			We create a ProvisionNode for this potential 
-		///			parent and insert <paramref name="log"/> in that provision node.
-		///			</description>
-		///		</item>
-		///		<item>
-		///			<term>The entry is of type Logger for the potential parent.</term>
-		///			<description>
-		///			The entry is <paramref name="log"/>'s nearest existing parent. We 
-		///			update <paramref name="log"/>'s parent field with this entry. We also break from 
-		///			he loop because updating our parent's parent is our parent's 
-		///			responsibility.
-		///			</description>
-		///		</item>
-		///		<item>
-		///			<term>The entry is of type ProvisionNode for this potential parent.</term>
-		///			<description>
-		///			We add <paramref name="log"/> to the list of children for this 
-		///			potential parent.
-		///			</description>
-		///		</item>
-		/// </list>
-		/// </remarks>
-		private void UpdateParents(Logger log) 
-		{
-			string name = log.Name;
-			int length = name.Length;
-			bool parentFound = false;
-	
-			// if name = "w.x.y.z", loop through "w.x.y", "w.x" and "w", but not "w.x.y.z" 
-			for(int i = name.LastIndexOf('.', length-1); i >= 0; i = name.LastIndexOf('.', i-1))  
-			{
-				string substr = name.Substring(0, i);
-
-				LoggerKey key = new LoggerKey(substr); // simple constructor
-				Object node = m_ht[key];
-				// Create a provision node for a future parent.
-				if (node == null) 
-				{
-					ProvisionNode pn = new ProvisionNode(log);
-					m_ht[key] = pn;
-				} 
-				else
-				{
-					Logger nodeLogger = node as Logger;
-					if (nodeLogger != null)
-					{
-						parentFound = true;
-						log.Parent = nodeLogger;
-						break; // no need to update the ancestors of the closest ancestor
-					}
-					else
-					{
-						ProvisionNode nodeProvisionNode = node as ProvisionNode;
-						if (nodeProvisionNode != null)
-						{
-							nodeProvisionNode.Add(log);
-						}
-						else
-						{
-							LogLog.Error(declaringType, "Unexpected object type ["+node.GetType()+"] in ht.", new LogException());
-						}
-					} 
-				}
-				if (i == 0) {
-				    // logger name starts with a dot
-				    // and we've hit the start
-				    break;
-				}
-			}
-
-			// If we could not find any existing parents, then link with root.
-			if (!parentFound) 
-			{
-				log.Parent = this.Root;
-			}
-		}
-
-		/// <summary>
-		/// Replace a <see cref="ProvisionNode"/> with a <see cref="Logger"/> in the hierarchy.
-		/// </summary>
-		/// <param name="pn"></param>
-		/// <param name="log"></param>
-		/// <remarks>
-		/// <para>
-		/// We update the links for all the children that placed themselves
-		/// in the provision node 'pn'. The second argument 'log' is a
-		/// reference for the newly created Logger, parent of all the
-		/// children in 'pn'.
-		/// </para>
-		/// <para>
-		/// We loop on all the children 'c' in 'pn'.
-		/// </para>
-		/// <para>
-		/// If the child 'c' has been already linked to a child of
-		/// 'log' then there is no need to update 'c'.
-		/// </para>
-		/// <para>
-		/// Otherwise, we set log's parent field to c's parent and set
-		/// c's parent field to log.
-		/// </para>
-		/// </remarks>
-		private static void UpdateChildren(ProvisionNode pn, Logger log) 
-		{
-			for(int i = 0; i < pn.Count; i++) 
-			{
-				Logger childLogger = (Logger)pn[i];
-
-				// Unless this child already points to a correct (lower) parent,
-				// make log.Parent point to childLogger.Parent and childLogger.Parent to log.
-				if (!childLogger.Parent.Name.StartsWith(log.Name)) 
-				{
-					log.Parent = childLogger.Parent;
-					childLogger.Parent = log;	  
-				}
-			}
-		}
-
-		/// <summary>
-		/// Define or redefine a Level using the values in the <see cref="LevelEntry"/> argument
-		/// </summary>
-		/// <param name="levelEntry">the level values</param>
-		/// <remarks>
-		/// <para>
-		/// Define or redefine a Level using the values in the <see cref="LevelEntry"/> argument
-		/// </para>
-		/// <para>
-		/// Supports setting levels via the configuration file.
-		/// </para>
-		/// </remarks>
-		internal void AddLevel(LevelEntry levelEntry)
-		{
-			if (levelEntry == null) throw new ArgumentNullException("levelEntry");
-			if (levelEntry.Name == null) throw new ArgumentNullException("levelEntry.Name");
-
-			// Lookup replacement value
-			if (levelEntry.Value == -1)
-			{
-				Level previousLevel = LevelMap[levelEntry.Name];
-				if (previousLevel == null)
-				{
-					throw new InvalidOperationException("Cannot redefine level ["+levelEntry.Name+"] because it is not defined in the LevelMap. To define the level supply the level value.");
-				}
-
-				levelEntry.Value = previousLevel.Value;
-			}
-
-			LevelMap.Add(levelEntry.Name, levelEntry.Value, levelEntry.DisplayName);
-		}
-
-		/// <summary>
-		/// A class to hold the value, name and display name for a level
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// A class to hold the value, name and display name for a level
-		/// </para>
-		/// </remarks>
-		internal class LevelEntry
-		{
-			private int m_levelValue = -1;
-			private string m_levelName = null;
-			private string m_levelDisplayName = null;
-
-			/// <summary>
-			/// Value of the level
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// If the value is not set (defaults to -1) the value will be looked
-			/// up for the current level with the same name.
-			/// </para>
-			/// </remarks>
-			public int Value
-			{
-				get { return m_levelValue; }
-				set { m_levelValue = value; }
-			}
-
-			/// <summary>
-			/// Name of the level
-			/// </summary>
-			/// <value>
-			/// The name of the level
-			/// </value>
-			/// <remarks>
-			/// <para>
-			/// The name of the level.
-			/// </para>
-			/// </remarks>
-			public string Name
-			{
-				get { return m_levelName; }
-				set { m_levelName = value; }
-			}
-
-			/// <summary>
-			/// Display name for the level
-			/// </summary>
-			/// <value>
-			/// The display name of the level
-			/// </value>
-			/// <remarks>
-			/// <para>
-			/// The display name of the level.
-			/// </para>
-			/// </remarks>
-			public string DisplayName
-			{
-				get { return m_levelDisplayName; }
-				set { m_levelDisplayName = value; }
-			}
-
-			/// <summary>
-			/// Override <c>Object.ToString</c> to return sensible debug info
-			/// </summary>
-			/// <returns>string info about this object</returns>
-			public override string ToString()
-			{
-				return "LevelEntry(Value="+m_levelValue+", Name="+m_levelName+", DisplayName="+m_levelDisplayName+")";
-			}
-		}
-
-		/// <summary>
-		/// Set a Property using the values in the <see cref="LevelEntry"/> argument
-		/// </summary>
-		/// <param name="propertyEntry">the property value</param>
-		/// <remarks>
-		/// <para>
-		/// Set a Property using the values in the <see cref="LevelEntry"/> argument.
-		/// </para>
-		/// <para>
-		/// Supports setting property values via the configuration file.
-		/// </para>
-		/// </remarks>
-		internal void AddProperty(PropertyEntry propertyEntry)
-		{
-			if (propertyEntry == null) throw new ArgumentNullException("propertyEntry");
-			if (propertyEntry.Key == null) throw new ArgumentNullException("propertyEntry.Key");
-
-			Properties[propertyEntry.Key] = propertyEntry.Value;
-		}
-
-		#endregion Private Instance Methods
-
-		#region Private Instance Fields
-
-		private ILoggerFactory m_defaultFactory;
-
-		private System.Collections.Hashtable m_ht;
-		private Logger m_root;
-  
-		private bool m_emittedNoAppenderWarning = false;
-
-	    private event LoggerCreationEventHandler m_loggerCreatedEvent;
-
-		#endregion Private Instance Fields
-
-	    #region Private Static Fields
-
-	    /// <summary>
-	    /// The fully qualified type of the Hierarchy class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(Hierarchy);
-
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/ILoggerFactory.cs b/src/log4net/Repository/Hierarchy/ILoggerFactory.cs
index 52966f4..9826a97 100644
--- a/src/log4net/Repository/Hierarchy/ILoggerFactory.cs
+++ b/src/log4net/Repository/Hierarchy/ILoggerFactory.cs
@@ -19,46 +19,46 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// Interface abstracts creation of <see cref="Logger"/> instances
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This interface is used by the <see cref="Hierarchy"/> to 
-	/// create new <see cref="Logger"/> objects.
-	/// </para>
-	/// <para>
-	/// The <see cref="CreateLogger"/> method is called
-	/// to create a named <see cref="Logger" />.
-	/// </para>
-	/// <para>
-	/// Implement this interface to create new subclasses of <see cref="Logger" />.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface ILoggerFactory
-	{
-		/// <summary>
-		/// Create a new <see cref="Logger" /> instance
-		/// </summary>
-		/// <param name="repository">The <see cref="ILoggerRepository" /> that will own the <see cref="Logger" />.</param>
-		/// <param name="name">The name of the <see cref="Logger" />.</param>
-		/// <returns>The <see cref="Logger" /> instance for the specified name.</returns>
-		/// <remarks>
-		/// <para>
-		/// Create a new <see cref="Logger" /> instance with the 
-		/// specified name.
-		/// </para>
-		/// <para>
-		/// Called by the <see cref="Hierarchy"/> to create
-		/// new named <see cref="Logger"/> instances.
-		/// </para>
-		/// <para>
-		/// If the <paramref name="name"/> is <c>null</c> then the root logger
-		/// must be returned.
-		/// </para>
-		/// </remarks>
-		Logger CreateLogger(ILoggerRepository repository, string name);
-	}
+  /// <summary>
+  /// Interface abstracts creation of <see cref="Logger"/> instances
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This interface is used by the <see cref="Hierarchy"/> to 
+  /// create new <see cref="Logger"/> objects.
+  /// </para>
+  /// <para>
+  /// The <see cref="CreateLogger"/> method is called
+  /// to create a named <see cref="Logger" />.
+  /// </para>
+  /// <para>
+  /// Implement this interface to create new subclasses of <see cref="Logger" />.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface ILoggerFactory
+  {
+    /// <summary>
+    /// Create a new <see cref="Logger" /> instance
+    /// </summary>
+    /// <param name="repository">The <see cref="ILoggerRepository" /> that will own the <see cref="Logger" />.</param>
+    /// <param name="name">The name of the <see cref="Logger" />.</param>
+    /// <returns>The <see cref="Logger" /> instance for the specified name.</returns>
+    /// <remarks>
+    /// <para>
+    /// Create a new <see cref="Logger" /> instance with the 
+    /// specified name.
+    /// </para>
+    /// <para>
+    /// Called by the <see cref="Hierarchy"/> to create
+    /// new named <see cref="Logger"/> instances.
+    /// </para>
+    /// <para>
+    /// If the <paramref name="name"/> is <c>null</c> then the root logger
+    /// must be returned.
+    /// </para>
+    /// </remarks>
+    Logger CreateLogger(ILoggerRepository repository, string name);
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/Logger.cs b/src/log4net/Repository/Hierarchy/Logger.cs
index 839e688..0ec41db 100644
--- a/src/log4net/Repository/Hierarchy/Logger.cs
+++ b/src/log4net/Repository/Hierarchy/Logger.cs
@@ -25,764 +25,764 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// Implementation of <see cref="ILogger"/> used by <see cref="Hierarchy"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Internal class used to provide implementation of <see cref="ILogger"/>
-	/// interface. Applications should use <see cref="LogManager"/> to get
-	/// logger instances.
-	/// </para>
-	/// <para>
-	/// This is one of the central classes in the log4net implementation. One of the
-	/// distinctive features of log4net are hierarchical loggers and their
-	/// evaluation. The <see cref="Hierarchy"/> organizes the <see cref="Logger"/>
-	/// instances into a rooted tree hierarchy.
-	/// </para>
-	/// <para>
-	/// The <see cref="Logger"/> class is abstract. Only concrete subclasses of
-	/// <see cref="Logger"/> can be created. The <see cref="ILoggerFactory"/>
-	/// is used to create instances of this type for the <see cref="Hierarchy"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Aspi Havewala</author>
-	/// <author>Douglas de la Torre</author>
-	public abstract class Logger : IAppenderAttachable, ILogger
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Implementation of <see cref="ILogger"/> used by <see cref="Hierarchy"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Internal class used to provide implementation of <see cref="ILogger"/>
+  /// interface. Applications should use <see cref="LogManager"/> to get
+  /// logger instances.
+  /// </para>
+  /// <para>
+  /// This is one of the central classes in the log4net implementation. One of the
+  /// distinctive features of log4net are hierarchical loggers and their
+  /// evaluation. The <see cref="Hierarchy"/> organizes the <see cref="Logger"/>
+  /// instances into a rooted tree hierarchy.
+  /// </para>
+  /// <para>
+  /// The <see cref="Logger"/> class is abstract. Only concrete subclasses of
+  /// <see cref="Logger"/> can be created. The <see cref="ILoggerFactory"/>
+  /// is used to create instances of this type for the <see cref="Hierarchy"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Aspi Havewala</author>
+  /// <author>Douglas de la Torre</author>
+  public abstract class Logger : IAppenderAttachable, ILogger
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// This constructor created a new <see cref="Logger" /> instance and
-		/// sets its name.
-		/// </summary>
-		/// <param name="name">The name of the <see cref="Logger" />.</param>
-		/// <remarks>
-		/// <para>
-		/// This constructor is protected and designed to be used by
-		/// a subclass that is not abstract.
-		/// </para>
-		/// <para>
-		/// Loggers are constructed by <see cref="ILoggerFactory"/> 
-		/// objects. See <see cref="DefaultLoggerFactory"/> for the default
-		/// logger creator.
-		/// </para>
-		/// </remarks>
-		protected Logger(string name) 
-		{
+    /// <summary>
+    /// This constructor created a new <see cref="Logger" /> instance and
+    /// sets its name.
+    /// </summary>
+    /// <param name="name">The name of the <see cref="Logger" />.</param>
+    /// <remarks>
+    /// <para>
+    /// This constructor is protected and designed to be used by
+    /// a subclass that is not abstract.
+    /// </para>
+    /// <para>
+    /// Loggers are constructed by <see cref="ILoggerFactory"/> 
+    /// objects. See <see cref="DefaultLoggerFactory"/> for the default
+    /// logger creator.
+    /// </para>
+    /// </remarks>
+    protected Logger(string name)
+    {
 #if NETCF || NETSTANDARD1_3
-			// NETCF: String.Intern causes Native Exception
-			m_name = name;
+      // NETCF: String.Intern causes Native Exception
+      m_name = name;
 #else
-			m_name = string.Intern(name);
+      m_name = string.Intern(name);
 #endif
-		}
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the parent logger in the hierarchy.
-		/// </summary>
-		/// <value>
-		/// The parent logger in the hierarchy.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Part of the Composite pattern that makes the hierarchy.
-		/// The hierarchy is parent linked rather than child linked.
-		/// </para>
-		/// </remarks>
-		public virtual Logger Parent
-		{
-			get { return m_parent; }
-			set { m_parent = value; }
-		}
+    /// <summary>
+    /// Gets or sets the parent logger in the hierarchy.
+    /// </summary>
+    /// <value>
+    /// The parent logger in the hierarchy.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Part of the Composite pattern that makes the hierarchy.
+    /// The hierarchy is parent linked rather than child linked.
+    /// </para>
+    /// </remarks>
+    public virtual Logger Parent
+    {
+      get { return m_parent; }
+      set { m_parent = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets a value indicating if child loggers inherit their parent's appenders.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if child loggers inherit their parent's appenders.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Additivity is set to <c>true</c> by default, that is children inherit
-		/// the appenders of their ancestors by default. If this variable is
-		/// set to <c>false</c> then the appenders found in the
-		/// ancestors of this logger are not used. However, the children
-		/// of this logger will inherit its appenders, unless the children
-		/// have their additivity flag set to <c>false</c> too. See
-		/// the user manual for more details.
-		/// </para>
-		/// </remarks>
-		public virtual bool Additivity
-		{
-			get { return m_additive; }
-			set { m_additive = value; }
-		}
+    /// <summary>
+    /// Gets or sets a value indicating if child loggers inherit their parent's appenders.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if child loggers inherit their parent's appenders.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Additivity is set to <c>true</c> by default, that is children inherit
+    /// the appenders of their ancestors by default. If this variable is
+    /// set to <c>false</c> then the appenders found in the
+    /// ancestors of this logger are not used. However, the children
+    /// of this logger will inherit its appenders, unless the children
+    /// have their additivity flag set to <c>false</c> too. See
+    /// the user manual for more details.
+    /// </para>
+    /// </remarks>
+    public virtual bool Additivity
+    {
+      get { return m_additive; }
+      set { m_additive = value; }
+    }
 
-		/// <summary>
-		/// Gets the effective level for this logger.
-		/// </summary>
-		/// <returns>The nearest level in the logger hierarchy.</returns>
-		/// <remarks>
-		/// <para>
-		/// Starting from this logger, searches the logger hierarchy for a
-		/// non-null level and returns it. Otherwise, returns the level of the
-		/// root logger.
-		/// </para>
-		/// <para>The Logger class is designed so that this method executes as
-		/// quickly as possible.</para>
-		/// </remarks>
-		public virtual Level EffectiveLevel
-		{
-			get 
-			{
-				for(Logger c = this; c != null; c = c.m_parent) 
-				{
-					Level level = c.m_level;
+    /// <summary>
+    /// Gets the effective level for this logger.
+    /// </summary>
+    /// <returns>The nearest level in the logger hierarchy.</returns>
+    /// <remarks>
+    /// <para>
+    /// Starting from this logger, searches the logger hierarchy for a
+    /// non-null level and returns it. Otherwise, returns the level of the
+    /// root logger.
+    /// </para>
+    /// <para>The Logger class is designed so that this method executes as
+    /// quickly as possible.</para>
+    /// </remarks>
+    public virtual Level EffectiveLevel
+    {
+      get
+      {
+        for (Logger c = this; c != null; c = c.m_parent)
+        {
+          Level level = c.m_level;
 
-					// Casting level to Object for performance, otherwise the overloaded operator is called
-					if ((object)level != null) 
-					{
-						return level;
-					}
-				}
-				return null; // If reached will cause an NullPointerException.
-			}
-		}
+          // Casting level to Object for performance, otherwise the overloaded operator is called
+          if ((object)level != null)
+          {
+            return level;
+          }
+        }
+        return null; // If reached will cause an NullPointerException.
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets the <see cref="Hierarchy"/> where this 
-		/// <c>Logger</c> instance is attached to.
-		/// </summary>
-		/// <value>The hierarchy that this logger belongs to.</value>
-		/// <remarks>
-		/// <para>
-		/// This logger must be attached to a single <see cref="Hierarchy"/>.
-		/// </para>
-		/// </remarks>
-		public virtual Hierarchy Hierarchy
-		{
-			get { return m_hierarchy; }
-			set { m_hierarchy = value; }
-		}
+    /// <summary>
+    /// Gets or sets the <see cref="Hierarchy"/> where this 
+    /// <c>Logger</c> instance is attached to.
+    /// </summary>
+    /// <value>The hierarchy that this logger belongs to.</value>
+    /// <remarks>
+    /// <para>
+    /// This logger must be attached to a single <see cref="Hierarchy"/>.
+    /// </para>
+    /// </remarks>
+    public virtual Hierarchy Hierarchy
+    {
+      get { return m_hierarchy; }
+      set { m_hierarchy = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the assigned <see cref="Level"/>, if any, for this Logger.  
-		/// </summary>
-		/// <value>
-		/// The <see cref="Level"/> of this logger.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The assigned <see cref="Level"/> can be <c>null</c>.
-		/// </para>
-		/// </remarks>
-		public virtual Level Level
-		{
-			get { return m_level; }
-			set { m_level = value; }
-		}
+    /// <summary>
+    /// Gets or sets the assigned <see cref="Level"/>, if any, for this Logger.  
+    /// </summary>
+    /// <value>
+    /// The <see cref="Level"/> of this logger.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The assigned <see cref="Level"/> can be <c>null</c>.
+    /// </para>
+    /// </remarks>
+    public virtual Level Level
+    {
+      get { return m_level; }
+      set { m_level = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Implementation of IAppenderAttachable
+    #region Implementation of IAppenderAttachable
 
-		/// <summary>
-		/// Add <paramref name="newAppender"/> to the list of appenders of this
-		/// Logger instance.
-		/// </summary>
-		/// <param name="newAppender">An appender to add to this logger</param>
-		/// <remarks>
-		/// <para>
-		/// Add <paramref name="newAppender"/> to the list of appenders of this
-		/// Logger instance.
-		/// </para>
-		/// <para>
-		/// If <paramref name="newAppender"/> is already in the list of
-		/// appenders, then it won't be added again.
-		/// </para>
-		/// </remarks>
-		public virtual void AddAppender(IAppender newAppender) 
-		{
-			if (newAppender == null)
-			{
-				throw new ArgumentNullException("newAppender");
-			}
+    /// <summary>
+    /// Add <paramref name="newAppender"/> to the list of appenders of this
+    /// Logger instance.
+    /// </summary>
+    /// <param name="newAppender">An appender to add to this logger</param>
+    /// <remarks>
+    /// <para>
+    /// Add <paramref name="newAppender"/> to the list of appenders of this
+    /// Logger instance.
+    /// </para>
+    /// <para>
+    /// If <paramref name="newAppender"/> is already in the list of
+    /// appenders, then it won't be added again.
+    /// </para>
+    /// </remarks>
+    public virtual void AddAppender(IAppender newAppender)
+    {
+      if (newAppender == null)
+      {
+        throw new ArgumentNullException("newAppender");
+      }
 
-			m_appenderLock.AcquireWriterLock();
-			try
-			{
-				if (m_appenderAttachedImpl == null) 
-				{
-					m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
-				}
-				m_appenderAttachedImpl.AddAppender(newAppender);
-			}
-			finally
-			{
-				m_appenderLock.ReleaseWriterLock();
-			}
-		}
+      m_appenderLock.AcquireWriterLock();
+      try
+      {
+        if (m_appenderAttachedImpl == null)
+        {
+          m_appenderAttachedImpl = new log4net.Util.AppenderAttachedImpl();
+        }
+        m_appenderAttachedImpl.AddAppender(newAppender);
+      }
+      finally
+      {
+        m_appenderLock.ReleaseWriterLock();
+      }
+    }
 
-		/// <summary>
-		/// Get the appenders contained in this logger as an 
-		/// <see cref="System.Collections.ICollection"/>.
-		/// </summary>
-		/// <returns>A collection of the appenders in this logger</returns>
-		/// <remarks>
-		/// <para>
-		/// Get the appenders contained in this logger as an 
-		/// <see cref="System.Collections.ICollection"/>. If no appenders 
-		/// can be found, then a <see cref="EmptyCollection"/> is returned.
-		/// </para>
-		/// </remarks>
-		public virtual AppenderCollection Appenders 
-		{
-			get
-			{
-				m_appenderLock.AcquireReaderLock();
-				try
-				{
-					if (m_appenderAttachedImpl == null)
-					{
-						return AppenderCollection.EmptyCollection;
-					}
-					else 
-					{
-						return m_appenderAttachedImpl.Appenders;
-					}
-				}
-				finally
-				{
-					m_appenderLock.ReleaseReaderLock();
-				}
-			}
-		}
+    /// <summary>
+    /// Get the appenders contained in this logger as an 
+    /// <see cref="System.Collections.ICollection"/>.
+    /// </summary>
+    /// <returns>A collection of the appenders in this logger</returns>
+    /// <remarks>
+    /// <para>
+    /// Get the appenders contained in this logger as an 
+    /// <see cref="System.Collections.ICollection"/>. If no appenders 
+    /// can be found, then a <see cref="EmptyCollection"/> is returned.
+    /// </para>
+    /// </remarks>
+    public virtual AppenderCollection Appenders
+    {
+      get
+      {
+        m_appenderLock.AcquireReaderLock();
+        try
+        {
+          if (m_appenderAttachedImpl == null)
+          {
+            return AppenderCollection.EmptyCollection;
+          }
+          else
+          {
+            return m_appenderAttachedImpl.Appenders;
+          }
+        }
+        finally
+        {
+          m_appenderLock.ReleaseReaderLock();
+        }
+      }
+    }
 
-		/// <summary>
-		/// Look for the appender named as <c>name</c>
-		/// </summary>
-		/// <param name="name">The name of the appender to lookup</param>
-		/// <returns>The appender with the name specified, or <c>null</c>.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the named appender, or null if the appender is not found.
-		/// </para>
-		/// </remarks>
-		public virtual IAppender GetAppender(string name) 
-		{
-			m_appenderLock.AcquireReaderLock();
-			try
-			{
-				if (m_appenderAttachedImpl == null || name == null)
-				{
-					return null;
-				}
+    /// <summary>
+    /// Look for the appender named as <c>name</c>
+    /// </summary>
+    /// <param name="name">The name of the appender to lookup</param>
+    /// <returns>The appender with the name specified, or <c>null</c>.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the named appender, or null if the appender is not found.
+    /// </para>
+    /// </remarks>
+    public virtual IAppender GetAppender(string name)
+    {
+      m_appenderLock.AcquireReaderLock();
+      try
+      {
+        if (m_appenderAttachedImpl == null || name == null)
+        {
+          return null;
+        }
 
-				return m_appenderAttachedImpl.GetAppender(name);
-			}
-			finally
-			{
-				m_appenderLock.ReleaseReaderLock();
-			}
-		}
+        return m_appenderAttachedImpl.GetAppender(name);
+      }
+      finally
+      {
+        m_appenderLock.ReleaseReaderLock();
+      }
+    }
 
-		/// <summary>
-		/// Remove all previously added appenders from this Logger instance.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Remove all previously added appenders from this Logger instance.
-		/// </para>
-		/// <para>
-		/// This is useful when re-reading configuration information.
-		/// </para>
-		/// </remarks>
-		public virtual void RemoveAllAppenders() 
-		{
-			m_appenderLock.AcquireWriterLock();
-			try
-			{
-				if (m_appenderAttachedImpl != null) 
-				{
-					m_appenderAttachedImpl.RemoveAllAppenders();
-					m_appenderAttachedImpl = null;
-				}
-			}
-			finally
-			{
-				m_appenderLock.ReleaseWriterLock();
-			}
-		}
+    /// <summary>
+    /// Remove all previously added appenders from this Logger instance.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Remove all previously added appenders from this Logger instance.
+    /// </para>
+    /// <para>
+    /// This is useful when re-reading configuration information.
+    /// </para>
+    /// </remarks>
+    public virtual void RemoveAllAppenders()
+    {
+      m_appenderLock.AcquireWriterLock();
+      try
+      {
+        if (m_appenderAttachedImpl != null)
+        {
+          m_appenderAttachedImpl.RemoveAllAppenders();
+          m_appenderAttachedImpl = null;
+        }
+      }
+      finally
+      {
+        m_appenderLock.ReleaseWriterLock();
+      }
+    }
 
-		/// <summary>
-		/// Remove the appender passed as parameter form the list of appenders.
-		/// </summary>
-		/// <param name="appender">The appender to remove</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// <para>
-		/// Remove the appender passed as parameter form the list of appenders.
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </para>
-		/// </remarks>
-		public virtual IAppender RemoveAppender(IAppender appender) 
-		{
-			m_appenderLock.AcquireWriterLock();
-			try
-			{
-				if (appender != null && m_appenderAttachedImpl != null) 
-				{
-					return m_appenderAttachedImpl.RemoveAppender(appender);
-				}
-			}
-			finally
-			{
-				m_appenderLock.ReleaseWriterLock();
-			}
-			return null;
-		}
+    /// <summary>
+    /// Remove the appender passed as parameter form the list of appenders.
+    /// </summary>
+    /// <param name="appender">The appender to remove</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// <para>
+    /// Remove the appender passed as parameter form the list of appenders.
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </para>
+    /// </remarks>
+    public virtual IAppender RemoveAppender(IAppender appender)
+    {
+      m_appenderLock.AcquireWriterLock();
+      try
+      {
+        if (appender != null && m_appenderAttachedImpl != null)
+        {
+          return m_appenderAttachedImpl.RemoveAppender(appender);
+        }
+      }
+      finally
+      {
+        m_appenderLock.ReleaseWriterLock();
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Remove the appender passed as parameter form the list of appenders.
-		/// </summary>
-		/// <param name="name">The name of the appender to remove</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// <para>
-		/// Remove the named appender passed as parameter form the list of appenders.
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </para>
-		/// </remarks>
-		public virtual IAppender RemoveAppender(string name) 
-		{
-			m_appenderLock.AcquireWriterLock();
-			try
-			{
-				if (name != null && m_appenderAttachedImpl != null)
-				{
-					return m_appenderAttachedImpl.RemoveAppender(name);
-				}
-			}
-			finally
-			{
-				m_appenderLock.ReleaseWriterLock();
-			}
-			return null;
-		}
-  
-		#endregion
+    /// <summary>
+    /// Remove the appender passed as parameter form the list of appenders.
+    /// </summary>
+    /// <param name="name">The name of the appender to remove</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// <para>
+    /// Remove the named appender passed as parameter form the list of appenders.
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </para>
+    /// </remarks>
+    public virtual IAppender RemoveAppender(string name)
+    {
+      m_appenderLock.AcquireWriterLock();
+      try
+      {
+        if (name != null && m_appenderAttachedImpl != null)
+        {
+          return m_appenderAttachedImpl.RemoveAppender(name);
+        }
+      }
+      finally
+      {
+        m_appenderLock.ReleaseWriterLock();
+      }
+      return null;
+    }
 
-		#region Implementation of ILogger
+    #endregion
 
-		/// <summary>
-		/// Gets the logger name.
-		/// </summary>
-		/// <value>
-		/// The name of the logger.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of this logger
-		/// </para>
-		/// </remarks>
-		public virtual string Name
-		{
-			get { return m_name; }
-		}
+    #region Implementation of ILogger
 
-		/// <summary>
-		/// This generic form is intended to be used by wrappers.
-		/// </summary>
-		/// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-		/// the stack boundary into the logging system for this call.</param>
-		/// <param name="level">The level of the message to be logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Generate a logging event for the specified <paramref name="level"/> using
-		/// the <paramref name="message"/> and <paramref name="exception"/>.
-		/// </para>
-		/// <para>
-		/// This method must not throw any exception to the caller.
-		/// </para>
-		/// </remarks>
-		public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) 
-		{
-			try
-			{
-				if (IsEnabledFor(level))
-				{
-                    ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : declaringType, level, message, exception);
-				}
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
+    /// <summary>
+    /// Gets the logger name.
+    /// </summary>
+    /// <value>
+    /// The name of the logger.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of this logger
+    /// </para>
+    /// </remarks>
+    public virtual string Name
+    {
+      get { return m_name; }
+    }
+
+    /// <summary>
+    /// This generic form is intended to be used by wrappers.
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <param name="level">The level of the message to be logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Generate a logging event for the specified <paramref name="level"/> using
+    /// the <paramref name="message"/> and <paramref name="exception"/>.
+    /// </para>
+    /// <para>
+    /// This method must not throw any exception to the caller.
+    /// </para>
+    /// </remarks>
+    public virtual void Log(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception)
+    {
+      try
+      {
+        if (IsEnabledFor(level))
+        {
+          ForcedLog((callerStackBoundaryDeclaringType != null) ? callerStackBoundaryDeclaringType : declaringType, level, message, exception);
+        }
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
 #if !NET_2_0 && !MONO_2_0 && !MONO_3_5 && !MONO_4_0 && !NETSTANDARD
-			catch
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging");
-			}
+      catch
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging");
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// This is the most generic printing method that is intended to be used 
-		/// by wrappers.
-		/// </summary>
-		/// <param name="logEvent">The event being logged.</param>
-		/// <remarks>
-		/// <para>
-		/// Logs the specified logging event through this logger.
-		/// </para>
-		/// <para>
-		/// This method must not throw any exception to the caller.
-		/// </para>
-		/// </remarks>
-		public virtual void Log(LoggingEvent logEvent)
-		{
-			try
-			{
-				if (logEvent != null)
-				{
-					if (IsEnabledFor(logEvent.Level))
-					{
-						ForcedLog(logEvent);
-					}
-				}
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
+    /// <summary>
+    /// This is the most generic printing method that is intended to be used 
+    /// by wrappers.
+    /// </summary>
+    /// <param name="logEvent">The event being logged.</param>
+    /// <remarks>
+    /// <para>
+    /// Logs the specified logging event through this logger.
+    /// </para>
+    /// <para>
+    /// This method must not throw any exception to the caller.
+    /// </para>
+    /// </remarks>
+    public virtual void Log(LoggingEvent logEvent)
+    {
+      try
+      {
+        if (logEvent != null)
+        {
+          if (IsEnabledFor(logEvent.Level))
+          {
+            ForcedLog(logEvent);
+          }
+        }
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
 #if !NET_2_0 && !MONO_2_0 && !MONO_3_5 && !MONO_4_0 && !NETSTANDARD
-			catch
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging");
-			}
+      catch
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging");
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Checks if this logger is enabled for a given <see cref="Level"/> passed as parameter.
-		/// </summary>
-		/// <param name="level">The level to check.</param>
-		/// <returns>
-		/// <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Test if this logger is going to log events of the specified <paramref name="level"/>.
-		/// </para>
-		/// <para>
-		/// This method must not throw any exception to the caller.
-		/// </para>
-		/// </remarks>
-		public virtual bool IsEnabledFor(Level level)
-		{
-			try
-			{
-				if (level != null)
-				{
-					if (m_hierarchy.IsDisabled(level))
-					{
-						return false;
-					}
-					return level >= this.EffectiveLevel;
-				}
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
+    /// <summary>
+    /// Checks if this logger is enabled for a given <see cref="Level"/> passed as parameter.
+    /// </summary>
+    /// <param name="level">The level to check.</param>
+    /// <returns>
+    /// <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Test if this logger is going to log events of the specified <paramref name="level"/>.
+    /// </para>
+    /// <para>
+    /// This method must not throw any exception to the caller.
+    /// </para>
+    /// </remarks>
+    public virtual bool IsEnabledFor(Level level)
+    {
+      try
+      {
+        if (level != null)
+        {
+          if (m_hierarchy.IsDisabled(level))
+          {
+            return false;
+          }
+          return level >= this.EffectiveLevel;
+        }
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
 #if !NET_2_0 && !MONO_2_0 && !MONO_3_5 && !MONO_4_0 && !NETSTANDARD
-			catch
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging");
-			}
+      catch
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging");
+      }
 #endif
-			return false;
-		}
+      return false;
+    }
 
-		/// <summary>
-		/// Gets the <see cref="ILoggerRepository"/> where this 
-		/// <c>Logger</c> instance is attached to.
-		/// </summary>
-		/// <value>
-		/// The <see cref="ILoggerRepository" /> that this logger belongs to.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the <see cref="ILoggerRepository"/> where this 
-		/// <c>Logger</c> instance is attached to.
-		/// </para>
-		/// </remarks>
-		public ILoggerRepository Repository
-		{ 
-			get { return m_hierarchy; }
-		}
+    /// <summary>
+    /// Gets the <see cref="ILoggerRepository"/> where this 
+    /// <c>Logger</c> instance is attached to.
+    /// </summary>
+    /// <value>
+    /// The <see cref="ILoggerRepository" /> that this logger belongs to.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the <see cref="ILoggerRepository"/> where this 
+    /// <c>Logger</c> instance is attached to.
+    /// </para>
+    /// </remarks>
+    public ILoggerRepository Repository
+    {
+      get { return m_hierarchy; }
+    }
 
-  		#endregion Implementation of ILogger
+    #endregion Implementation of ILogger
 
-		/// <summary>
-		/// Deliver the <see cref="LoggingEvent"/> to the attached appenders.
-		/// </summary>
-		/// <param name="loggingEvent">The event to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Call the appenders in the hierarchy starting at
-		/// <c>this</c>. If no appenders could be found, emit a
-		/// warning.
-		/// </para>
-		/// <para>
-		/// This method calls all the appenders inherited from the
-		/// hierarchy circumventing any evaluation of whether to log or not
-		/// to log the particular log request.
-		/// </para>
-		/// </remarks>
-		protected virtual void CallAppenders(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Deliver the <see cref="LoggingEvent"/> to the attached appenders.
+    /// </summary>
+    /// <param name="loggingEvent">The event to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Call the appenders in the hierarchy starting at
+    /// <c>this</c>. If no appenders could be found, emit a
+    /// warning.
+    /// </para>
+    /// <para>
+    /// This method calls all the appenders inherited from the
+    /// hierarchy circumventing any evaluation of whether to log or not
+    /// to log the particular log request.
+    /// </para>
+    /// </remarks>
+    protected virtual void CallAppenders(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			int writes = 0;
+      int writes = 0;
 
-			for(Logger c=this; c != null; c=c.m_parent) 
-			{
-				if (c.m_appenderAttachedImpl != null) 
-				{
-					// Protected against simultaneous call to addAppender, removeAppender,...
-					c.m_appenderLock.AcquireReaderLock();
-					try
-					{
-						if (c.m_appenderAttachedImpl != null) 
-						{
-							writes += c.m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvent);
-						}
-					}
-					finally
-					{
-						c.m_appenderLock.ReleaseReaderLock();
-					}
-				}
+      for (Logger c = this; c != null; c = c.m_parent)
+      {
+        if (c.m_appenderAttachedImpl != null)
+        {
+          // Protected against simultaneous call to addAppender, removeAppender,...
+          c.m_appenderLock.AcquireReaderLock();
+          try
+          {
+            if (c.m_appenderAttachedImpl != null)
+            {
+              writes += c.m_appenderAttachedImpl.AppendLoopOnAppenders(loggingEvent);
+            }
+          }
+          finally
+          {
+            c.m_appenderLock.ReleaseReaderLock();
+          }
+        }
 
-				if (!c.m_additive) 
-				{
-					break;
-				}
-			}
-			
-			// No appenders in hierarchy, warn user only once.
-			//
-			// Note that by including the AppDomain values for the currently running
-			// thread, it becomes much easier to see which application the warning
-			// is from, which is especially helpful in a multi-AppDomain environment
-			// (like IIS with multiple VDIRS).  Without this, it can be difficult
-			// or impossible to determine which .config file is missing appender
-			// definitions.
-			//
-			if (!m_hierarchy.EmittedNoAppenderWarning && writes == 0) 
-			{
-				m_hierarchy.EmittedNoAppenderWarning = true;
-				LogLog.Debug(declaringType, "No appenders could be found for logger [" + Name + "] repository [" + Repository.Name + "]");
-				LogLog.Debug(declaringType, "Please initialize the log4net system properly.");
-				try
-				{
-					LogLog.Debug(declaringType, "    Current AppDomain context information: ");
-					LogLog.Debug(declaringType, "       BaseDirectory   : " + SystemInfo.ApplicationBaseDirectory);
+        if (!c.m_additive)
+        {
+          break;
+        }
+      }
+
+      // No appenders in hierarchy, warn user only once.
+      //
+      // Note that by including the AppDomain values for the currently running
+      // thread, it becomes much easier to see which application the warning
+      // is from, which is especially helpful in a multi-AppDomain environment
+      // (like IIS with multiple VDIRS).  Without this, it can be difficult
+      // or impossible to determine which .config file is missing appender
+      // definitions.
+      //
+      if (!m_hierarchy.EmittedNoAppenderWarning && writes == 0)
+      {
+        m_hierarchy.EmittedNoAppenderWarning = true;
+        LogLog.Debug(declaringType, "No appenders could be found for logger [" + Name + "] repository [" + Repository.Name + "]");
+        LogLog.Debug(declaringType, "Please initialize the log4net system properly.");
+        try
+        {
+          LogLog.Debug(declaringType, "    Current AppDomain context information: ");
+          LogLog.Debug(declaringType, "       BaseDirectory   : " + SystemInfo.ApplicationBaseDirectory);
 #if !NETCF && !NETSTANDARD1_3
-					LogLog.Debug(declaringType, "       FriendlyName    : " + AppDomain.CurrentDomain.FriendlyName);
-					LogLog.Debug(declaringType, "       DynamicDirectory: " + AppDomain.CurrentDomain.DynamicDirectory);
+          LogLog.Debug(declaringType, "       FriendlyName    : " + AppDomain.CurrentDomain.FriendlyName);
+          LogLog.Debug(declaringType, "       DynamicDirectory: " + AppDomain.CurrentDomain.DynamicDirectory);
 #endif
-				}
-				catch(System.Security.SecurityException)
-				{
-					// Insufficient permissions to display info from the AppDomain
-				}
-			}
-		}
+        }
+        catch (System.Security.SecurityException)
+        {
+          // Insufficient permissions to display info from the AppDomain
+        }
+      }
+    }
 
-		/// <summary>
-		/// Closes all attached appenders implementing the <see cref="IAppenderAttachable"/> interface.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Used to ensure that the appenders are correctly shutdown.
-		/// </para>
-		/// </remarks>
-		public virtual void CloseNestedAppenders() 
-		{
-			m_appenderLock.AcquireWriterLock();
-			try
-			{
-				if (m_appenderAttachedImpl != null)
-				{
-					AppenderCollection appenders = m_appenderAttachedImpl.Appenders;
-					foreach(IAppender appender in appenders)
-					{
-						if (appender is IAppenderAttachable)
-						{
-							appender.Close();
-						}
-					}
-				}
-			}
-			finally
-			{
-				m_appenderLock.ReleaseWriterLock();
-			}
-		}
+    /// <summary>
+    /// Closes all attached appenders implementing the <see cref="IAppenderAttachable"/> interface.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Used to ensure that the appenders are correctly shutdown.
+    /// </para>
+    /// </remarks>
+    public virtual void CloseNestedAppenders()
+    {
+      m_appenderLock.AcquireWriterLock();
+      try
+      {
+        if (m_appenderAttachedImpl != null)
+        {
+          AppenderCollection appenders = m_appenderAttachedImpl.Appenders;
+          foreach (IAppender appender in appenders)
+          {
+            if (appender is IAppenderAttachable)
+            {
+              appender.Close();
+            }
+          }
+        }
+      }
+      finally
+      {
+        m_appenderLock.ReleaseWriterLock();
+      }
+    }
 
-		/// <summary>
-		/// This is the most generic printing method. This generic form is intended to be used by wrappers
-		/// </summary>
-		/// <param name="level">The level of the message to be logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Generate a logging event for the specified <paramref name="level"/> using
-		/// the <paramref name="message"/>.
-		/// </para>
-		/// </remarks>
-		public virtual void Log(Level level, object message, Exception exception) 
-		{
-			if (IsEnabledFor(level))
-			{
-                ForcedLog(declaringType, level, message, exception);
-			}
-		}
+    /// <summary>
+    /// This is the most generic printing method. This generic form is intended to be used by wrappers
+    /// </summary>
+    /// <param name="level">The level of the message to be logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Generate a logging event for the specified <paramref name="level"/> using
+    /// the <paramref name="message"/>.
+    /// </para>
+    /// </remarks>
+    public virtual void Log(Level level, object message, Exception exception)
+    {
+      if (IsEnabledFor(level))
+      {
+        ForcedLog(declaringType, level, message, exception);
+      }
+    }
 
-		/// <summary>
-		/// Creates a new logging event and logs the event without further checks.
-		/// </summary>
-		/// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
-		/// the stack boundary into the logging system for this call.</param>
-		/// <param name="level">The level of the message to be logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// Generates a logging event and delivers it to the attached
-		/// appenders.
-		/// </para>
-		/// </remarks>
-		protected virtual void ForcedLog(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception) 
-		{
-			CallAppenders(new LoggingEvent(callerStackBoundaryDeclaringType, this.Hierarchy, this.Name, level, message, exception));
-		}
+    /// <summary>
+    /// Creates a new logging event and logs the event without further checks.
+    /// </summary>
+    /// <param name="callerStackBoundaryDeclaringType">The declaring type of the method that is
+    /// the stack boundary into the logging system for this call.</param>
+    /// <param name="level">The level of the message to be logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// Generates a logging event and delivers it to the attached
+    /// appenders.
+    /// </para>
+    /// </remarks>
+    protected virtual void ForcedLog(Type callerStackBoundaryDeclaringType, Level level, object message, Exception exception)
+    {
+      CallAppenders(new LoggingEvent(callerStackBoundaryDeclaringType, this.Hierarchy, this.Name, level, message, exception));
+    }
 
-		/// <summary>
-		/// Creates a new logging event and logs the event without further checks.
-		/// </summary>
-		/// <param name="logEvent">The event being logged.</param>
-		/// <remarks>
-		/// <para>
-		/// Delivers the logging event to the attached appenders.
-		/// </para>
-		/// </remarks>
-		protected virtual void ForcedLog(LoggingEvent logEvent) 
-		{
-			// The logging event may not have been created by this logger
-			// the Repository may not be correctly set on the event. This
-			// is required for the appenders to correctly lookup renderers etc...
-			logEvent.EnsureRepository(this.Hierarchy);
+    /// <summary>
+    /// Creates a new logging event and logs the event without further checks.
+    /// </summary>
+    /// <param name="logEvent">The event being logged.</param>
+    /// <remarks>
+    /// <para>
+    /// Delivers the logging event to the attached appenders.
+    /// </para>
+    /// </remarks>
+    protected virtual void ForcedLog(LoggingEvent logEvent)
+    {
+      // The logging event may not have been created by this logger
+      // the Repository may not be correctly set on the event. This
+      // is required for the appenders to correctly lookup renderers etc...
+      logEvent.EnsureRepository(this.Hierarchy);
 
-			CallAppenders(logEvent);
-		}
+      CallAppenders(logEvent);
+    }
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-        /// <summary>
-        /// The fully qualified type of the Logger class.
-        /// </summary>
-        private static readonly Type declaringType = typeof(Logger);
+    /// <summary>
+    /// The fully qualified type of the Logger class.
+    /// </summary>
+    private static readonly Type declaringType = typeof(Logger);
 
-		#endregion Private Static Fields
+    #endregion Private Static Fields
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The name of this logger.
-		/// </summary>
-		private readonly string m_name;  
+    /// <summary>
+    /// The name of this logger.
+    /// </summary>
+    private readonly string m_name;
 
-		/// <summary>
-		/// The assigned level of this logger. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <c>level</c> variable need not be 
-		/// assigned a value in which case it is inherited 
-		/// form the hierarchy.
-		/// </para>
-		/// </remarks>
-		private Level m_level;
+    /// <summary>
+    /// The assigned level of this logger. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <c>level</c> variable need not be 
+    /// assigned a value in which case it is inherited 
+    /// form the hierarchy.
+    /// </para>
+    /// </remarks>
+    private Level m_level;
 
-		/// <summary>
-		/// The parent of this logger.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The parent of this logger. 
-		/// All loggers have at least one ancestor which is the root logger.
-		/// </para>
-		/// </remarks>
-		private Logger m_parent;
+    /// <summary>
+    /// The parent of this logger.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The parent of this logger. 
+    /// All loggers have at least one ancestor which is the root logger.
+    /// </para>
+    /// </remarks>
+    private Logger m_parent;
 
-		/// <summary>
-		/// Loggers need to know what Hierarchy they are in.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Loggers need to know what Hierarchy they are in.
-		/// The hierarchy that this logger is a member of is stored
-		/// here.
-		/// </para>
-		/// </remarks>
-		private Hierarchy m_hierarchy;
+    /// <summary>
+    /// Loggers need to know what Hierarchy they are in.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Loggers need to know what Hierarchy they are in.
+    /// The hierarchy that this logger is a member of is stored
+    /// here.
+    /// </para>
+    /// </remarks>
+    private Hierarchy m_hierarchy;
 
-		/// <summary>
-		/// Helper implementation of the <see cref="IAppenderAttachable"/> interface
-		/// </summary>
-		private log4net.Util.AppenderAttachedImpl m_appenderAttachedImpl;
+    /// <summary>
+    /// Helper implementation of the <see cref="IAppenderAttachable"/> interface
+    /// </summary>
+    private log4net.Util.AppenderAttachedImpl m_appenderAttachedImpl;
 
-		/// <summary>
-		/// Flag indicating if child loggers inherit their parents appenders
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Additivity is set to true by default, that is children inherit
-		/// the appenders of their ancestors by default. If this variable is
-		/// set to <c>false</c> then the appenders found in the
-		/// ancestors of this logger are not used. However, the children
-		/// of this logger will inherit its appenders, unless the children
-		/// have their additivity flag set to <c>false</c> too. See
-		/// the user manual for more details.
-		/// </para>
-		/// </remarks>
-		private bool m_additive = true;
+    /// <summary>
+    /// Flag indicating if child loggers inherit their parents appenders
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Additivity is set to true by default, that is children inherit
+    /// the appenders of their ancestors by default. If this variable is
+    /// set to <c>false</c> then the appenders found in the
+    /// ancestors of this logger are not used. However, the children
+    /// of this logger will inherit its appenders, unless the children
+    /// have their additivity flag set to <c>false</c> too. See
+    /// the user manual for more details.
+    /// </para>
+    /// </remarks>
+    private bool m_additive = true;
 
-		/// <summary>
-		/// Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl
-		/// </summary>
-		private readonly ReaderWriterLock m_appenderLock = new ReaderWriterLock();
-  
-		#endregion
-	}
+    /// <summary>
+    /// Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl
+    /// </summary>
+    private readonly ReaderWriterLock m_appenderLock = new ReaderWriterLock();
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/LoggerKey.cs b/src/log4net/Repository/Hierarchy/LoggerKey.cs
index 1485417..7d74ad8 100644
--- a/src/log4net/Repository/Hierarchy/LoggerKey.cs
+++ b/src/log4net/Repository/Hierarchy/LoggerKey.cs
@@ -21,118 +21,118 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// Used internally to accelerate hash table searches.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Internal class used to improve performance of 
-	/// string keyed hashtables.
-	/// </para>
-	/// <para>
-	/// The hashcode of the string is cached for reuse.
-	/// The string is stored as an interned value.
-	/// When comparing two <see cref="LoggerKey"/> objects for equality 
-	/// the reference equality of the interned strings is compared.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	internal sealed class LoggerKey
-	{
-		#region Internal Instance Constructors
+  /// <summary>
+  /// Used internally to accelerate hash table searches.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Internal class used to improve performance of 
+  /// string keyed hashtables.
+  /// </para>
+  /// <para>
+  /// The hashcode of the string is cached for reuse.
+  /// The string is stored as an interned value.
+  /// When comparing two <see cref="LoggerKey"/> objects for equality 
+  /// the reference equality of the interned strings is compared.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  internal sealed class LoggerKey
+  {
+    #region Internal Instance Constructors
 
-		/// <summary>
-		/// Construct key with string name
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LoggerKey" /> class 
-		/// with the specified name.
-		/// </para>
-		/// <para>
-		/// Stores the hashcode of the string and interns
-		/// the string key to optimize comparisons.
-		/// </para>
-		/// <note>
-		/// The Compact Framework 1.0 the <see cref="String.Intern"/>
-		/// method does not work. On the Compact Framework
-		/// the string keys are not interned nor are they
-		/// compared by reference.
-		/// </note>
-		/// </remarks>
-		/// <param name="name">The name of the logger.</param>
-		internal LoggerKey(string name) 
-		{
+    /// <summary>
+    /// Construct key with string name
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LoggerKey" /> class 
+    /// with the specified name.
+    /// </para>
+    /// <para>
+    /// Stores the hashcode of the string and interns
+    /// the string key to optimize comparisons.
+    /// </para>
+    /// <note>
+    /// The Compact Framework 1.0 the <see cref="String.Intern"/>
+    /// method does not work. On the Compact Framework
+    /// the string keys are not interned nor are they
+    /// compared by reference.
+    /// </note>
+    /// </remarks>
+    /// <param name="name">The name of the logger.</param>
+    internal LoggerKey(string name)
+    {
 #if NETCF || NETSTANDARD1_3
-			// NETCF: String.Intern causes Native Exception
-			m_name = name;
+      // NETCF: String.Intern causes Native Exception
+      m_name = name;
 #else
-			m_name = string.Intern(name);
+      m_name = string.Intern(name);
 #endif
-			m_hashCache = name.GetHashCode();
-		}
+      m_hashCache = name.GetHashCode();
+    }
 
-		#endregion Internal Instance Constructors
+    #endregion Internal Instance Constructors
 
-		#region Override implementation of Object
+    #region Override implementation of Object
 
-		/// <summary>
-		/// Returns a hash code for the current instance.
-		/// </summary>
-		/// <returns>A hash code for the current instance.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the cached hashcode.
-		/// </para>
-		/// </remarks>
-		public override int GetHashCode() 
-		{
-			return m_hashCache;
-		}
+    /// <summary>
+    /// Returns a hash code for the current instance.
+    /// </summary>
+    /// <returns>A hash code for the current instance.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the cached hashcode.
+    /// </para>
+    /// </remarks>
+    public override int GetHashCode()
+    {
+      return m_hashCache;
+    }
 
-		/// <summary>
-		/// Determines whether two <see cref="LoggerKey" /> instances 
-		/// are equal.
-		/// </summary>
-		/// <param name="obj">The <see cref="object" /> to compare with the current <see cref="LoggerKey" />.</param>
-		/// <returns>
-		/// <c>true</c> if the specified <see cref="object" /> is equal to the current <see cref="LoggerKey" />; otherwise, <c>false</c>.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Compares the references of the interned strings.
-		/// </para>
-		/// </remarks>
-		public override bool Equals(object obj) 
-		{
-			// Compare reference type of this against argument
-			if (((object)this) == obj)
-			{
-				return true;
-			}
-			
-			LoggerKey objKey = obj as LoggerKey;
-			if (objKey != null) 
-			{
+    /// <summary>
+    /// Determines whether two <see cref="LoggerKey" /> instances 
+    /// are equal.
+    /// </summary>
+    /// <param name="obj">The <see cref="object" /> to compare with the current <see cref="LoggerKey" />.</param>
+    /// <returns>
+    /// <c>true</c> if the specified <see cref="object" /> is equal to the current <see cref="LoggerKey" />; otherwise, <c>false</c>.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Compares the references of the interned strings.
+    /// </para>
+    /// </remarks>
+    public override bool Equals(object obj)
+    {
+      // Compare reference type of this against argument
+      if (((object)this) == obj)
+      {
+        return true;
+      }
+
+      LoggerKey objKey = obj as LoggerKey;
+      if (objKey != null)
+      {
 #if NETCF || NETSTANDARD1_3
-				return ( m_name == objKey.m_name );
+        return ( m_name == objKey.m_name );
 #else
-				// Compare reference types rather than string's overloaded ==
-				return ( ((object)m_name) == ((object)objKey.m_name) );
+        // Compare reference types rather than string's overloaded ==
+        return (((object)m_name) == ((object)objKey.m_name));
 #endif
-			}
-			return false;
-		}
+      }
+      return false;
+    }
 
-		#endregion
+    #endregion
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private readonly string m_name;  
-		private readonly int m_hashCache;
+    private readonly string m_name;
+    private readonly int m_hashCache;
 
-		#endregion Private Instance Fields
-	}	
+    #endregion Private Instance Fields
+  }
 }
 
diff --git a/src/log4net/Repository/Hierarchy/ProvisionNode.cs b/src/log4net/Repository/Hierarchy/ProvisionNode.cs
index 50f4e16..9262a47 100644
--- a/src/log4net/Repository/Hierarchy/ProvisionNode.cs
+++ b/src/log4net/Repository/Hierarchy/ProvisionNode.cs
@@ -22,37 +22,37 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// Provision nodes are used where no logger instance has been specified
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <see cref="ProvisionNode"/> instances are used in the 
-	/// <see cref="Hierarchy" /> when there is no specified 
-	/// <see cref="Logger" /> for that node.
-	/// </para>
-	/// <para>
-	/// A provision node holds a list of child loggers on behalf of
-	/// a logger that does not exist.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	internal sealed class ProvisionNode : ArrayList
-	{
-		/// <summary>
-		/// Create a new provision node with child node
-		/// </summary>
-		/// <param name="log">A child logger to add to this node.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ProvisionNode" /> class 
-		/// with the specified child logger.
-		/// </para>
-		/// </remarks>
-		internal ProvisionNode(Logger log) : base()
-		{
-			this.Add(log);
-		}
-	}
+  /// <summary>
+  /// Provision nodes are used where no logger instance has been specified
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <see cref="ProvisionNode"/> instances are used in the 
+  /// <see cref="Hierarchy" /> when there is no specified 
+  /// <see cref="Logger" /> for that node.
+  /// </para>
+  /// <para>
+  /// A provision node holds a list of child loggers on behalf of
+  /// a logger that does not exist.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  internal sealed class ProvisionNode : ArrayList
+  {
+    /// <summary>
+    /// Create a new provision node with child node
+    /// </summary>
+    /// <param name="log">A child logger to add to this node.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ProvisionNode" /> class 
+    /// with the specified child logger.
+    /// </para>
+    /// </remarks>
+    internal ProvisionNode(Logger log) : base()
+    {
+      this.Add(log);
+    }
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/RootLogger.cs b/src/log4net/Repository/Hierarchy/RootLogger.cs
index 8184e3f..10cb878 100644
--- a/src/log4net/Repository/Hierarchy/RootLogger.cs
+++ b/src/log4net/Repository/Hierarchy/RootLogger.cs
@@ -24,110 +24,110 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// The <see cref="RootLogger" /> sits at the root of the logger hierarchy tree. 
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <see cref="RootLogger" /> is a regular <see cref="Logger" /> except 
-	/// that it provides several guarantees.
-	/// </para>
-	/// <para>
-	/// First, it cannot be assigned a <c>null</c>
-	/// level. Second, since the root logger cannot have a parent, the
-	/// <see cref="EffectiveLevel"/> property always returns the value of the
-	/// level field without walking the hierarchy.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class RootLogger : Logger
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// The <see cref="RootLogger" /> sits at the root of the logger hierarchy tree. 
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <see cref="RootLogger" /> is a regular <see cref="Logger" /> except 
+  /// that it provides several guarantees.
+  /// </para>
+  /// <para>
+  /// First, it cannot be assigned a <c>null</c>
+  /// level. Second, since the root logger cannot have a parent, the
+  /// <see cref="EffectiveLevel"/> property always returns the value of the
+  /// level field without walking the hierarchy.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class RootLogger : Logger
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Construct a <see cref="RootLogger"/>
-		/// </summary>
-		/// <param name="level">The level to assign to the root logger.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="RootLogger" /> class with
-		/// the specified logging level.
-		/// </para>
-		/// <para>
-		/// The root logger names itself as "root". However, the root
-		/// logger cannot be retrieved by name.
-		/// </para>
-		/// </remarks>
-		public RootLogger(Level level) : base("root")
-		{
-			this.Level = level;
-		}
+    /// <summary>
+    /// Construct a <see cref="RootLogger"/>
+    /// </summary>
+    /// <param name="level">The level to assign to the root logger.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="RootLogger" /> class with
+    /// the specified logging level.
+    /// </para>
+    /// <para>
+    /// The root logger names itself as "root". However, the root
+    /// logger cannot be retrieved by name.
+    /// </para>
+    /// </remarks>
+    public RootLogger(Level level) : base("root")
+    {
+      this.Level = level;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Override implementation of Logger
+    #region Override implementation of Logger
 
-		/// <summary>
-		/// Gets the assigned level value without walking the logger hierarchy.
-		/// </summary>
-		/// <value>The assigned level value without walking the logger hierarchy.</value>
-		/// <remarks>
-		/// <para>
-		/// Because the root logger cannot have a parent and its level
-		/// must not be <c>null</c> this property just returns the
-		/// value of <see cref="Logger.Level"/>.
-		/// </para>
-		/// </remarks>
-		public override Level EffectiveLevel 
-		{
-			get 
-			{
-				return base.Level;
-			}
-		}
+    /// <summary>
+    /// Gets the assigned level value without walking the logger hierarchy.
+    /// </summary>
+    /// <value>The assigned level value without walking the logger hierarchy.</value>
+    /// <remarks>
+    /// <para>
+    /// Because the root logger cannot have a parent and its level
+    /// must not be <c>null</c> this property just returns the
+    /// value of <see cref="Logger.Level"/>.
+    /// </para>
+    /// </remarks>
+    public override Level EffectiveLevel
+    {
+      get
+      {
+        return base.Level;
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets the assigned <see cref="Level"/> for the root logger.  
-		/// </summary>
-		/// <value>
-		/// The <see cref="Level"/> of the root logger.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Setting the level of the root logger to a <c>null</c> reference
-		/// may have catastrophic results. We prevent this here.
-		/// </para>
-		/// </remarks>
-		public override Level Level
-		{
-			get { return base.Level; }
-			set
-			{
-				if (value == null) 
-				{
-					LogLog.Error(declaringType, "You have tried to set a null level to root.", new LogException());
-				}
-				else 
-				{
-					base.Level = value;
-				}
-			}
-		}
+    /// <summary>
+    /// Gets or sets the assigned <see cref="Level"/> for the root logger.  
+    /// </summary>
+    /// <value>
+    /// The <see cref="Level"/> of the root logger.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Setting the level of the root logger to a <c>null</c> reference
+    /// may have catastrophic results. We prevent this here.
+    /// </para>
+    /// </remarks>
+    public override Level Level
+    {
+      get { return base.Level; }
+      set
+      {
+        if (value == null)
+        {
+          LogLog.Error(declaringType, "You have tried to set a null level to root.", new LogException());
+        }
+        else
+        {
+          base.Level = value;
+        }
+      }
+    }
 
-		#endregion Override implementation of Logger
+    #endregion Override implementation of Logger
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the RootLogger class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(RootLogger);
+    /// <summary>
+    /// The fully qualified type of the RootLogger class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(RootLogger);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs b/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
index bc2561d..164933f 100644
--- a/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
+++ b/src/log4net/Repository/Hierarchy/XmlHierarchyConfigurator.cs
@@ -30,1134 +30,1136 @@
 
 namespace log4net.Repository.Hierarchy
 {
-	/// <summary>
-	/// Initializes the log4net environment using an XML DOM.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Configures a <see cref="Hierarchy"/> using an XML DOM.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class XmlHierarchyConfigurator
-	{
-		private enum ConfigUpdateMode
-		{
-			Merge, 
-			Overwrite
-		}
+  /// <summary>
+  /// Initializes the log4net environment using an XML DOM.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Configures a <see cref="Hierarchy"/> using an XML DOM.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class XmlHierarchyConfigurator
+  {
+    private enum ConfigUpdateMode
+    {
+      Merge,
+      Overwrite
+    }
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Construct the configurator for a hierarchy
-		/// </summary>
-		/// <param name="hierarchy">The hierarchy to build.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="XmlHierarchyConfigurator" /> class
-		/// with the specified <see cref="Hierarchy" />.
-		/// </para>
-		/// </remarks>
-		public XmlHierarchyConfigurator(Hierarchy hierarchy) 
-		{
-			m_hierarchy = hierarchy;
-			m_appenderBag = new Hashtable();
-		}
+    /// <summary>
+    /// Construct the configurator for a hierarchy
+    /// </summary>
+    /// <param name="hierarchy">The hierarchy to build.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="XmlHierarchyConfigurator" /> class
+    /// with the specified <see cref="Hierarchy" />.
+    /// </para>
+    /// </remarks>
+    public XmlHierarchyConfigurator(Hierarchy hierarchy)
+    {
+      m_hierarchy = hierarchy;
+      m_appenderBag = new Hashtable();
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Configure the hierarchy by parsing a DOM tree of XML elements.
-		/// </summary>
-		/// <param name="element">The root element to parse.</param>
-		/// <remarks>
-		/// <para>
-		/// Configure the hierarchy by parsing a DOM tree of XML elements.
-		/// </para>
-		/// </remarks>
-		public void Configure(XmlElement element) 
-		{
-			if (element == null || m_hierarchy == null)
-			{
-                return;
-			}
+    /// <summary>
+    /// Configure the hierarchy by parsing a DOM tree of XML elements.
+    /// </summary>
+    /// <param name="element">The root element to parse.</param>
+    /// <remarks>
+    /// <para>
+    /// Configure the hierarchy by parsing a DOM tree of XML elements.
+    /// </para>
+    /// </remarks>
+    public void Configure(XmlElement element)
+    {
+      if (element == null || m_hierarchy == null)
+      {
+        return;
+      }
 
-			string rootElementName = element.LocalName;
+      string rootElementName = element.LocalName;
 
-			if (rootElementName != CONFIGURATION_TAG)
-			{
-				LogLog.Error(declaringType, "Xml element is - not a <" + CONFIGURATION_TAG + "> element.");
-                return;
-			}
+      if (rootElementName != CONFIGURATION_TAG)
+      {
+        LogLog.Error(declaringType, "Xml element is - not a <" + CONFIGURATION_TAG + "> element.");
+        return;
+      }
 
-            if (!LogLog.EmitInternalMessages)
+      if (!LogLog.EmitInternalMessages)
+      {
+        // Look for a emitDebug attribute to enable internal debug
+        string emitDebugAttribute = element.GetAttribute(EMIT_INTERNAL_DEBUG_ATTR);
+        LogLog.Debug(declaringType, EMIT_INTERNAL_DEBUG_ATTR + " attribute [" + emitDebugAttribute + "].");
+
+        if (emitDebugAttribute.Length > 0 && emitDebugAttribute != "null")
+        {
+          LogLog.EmitInternalMessages = OptionConverter.ToBoolean(emitDebugAttribute, true);
+        }
+        else
+        {
+          LogLog.Debug(declaringType, "Ignoring " + EMIT_INTERNAL_DEBUG_ATTR + " attribute.");
+        }
+      }
+
+      if (!LogLog.InternalDebugging)
+      {
+        // Look for a debug attribute to enable internal debug
+        string debugAttribute = element.GetAttribute(INTERNAL_DEBUG_ATTR);
+        LogLog.Debug(declaringType, INTERNAL_DEBUG_ATTR + " attribute [" + debugAttribute + "].");
+
+        if (debugAttribute.Length > 0 && debugAttribute != "null")
+        {
+          LogLog.InternalDebugging = OptionConverter.ToBoolean(debugAttribute, true);
+        }
+        else
+        {
+          LogLog.Debug(declaringType, "Ignoring " + INTERNAL_DEBUG_ATTR + " attribute.");
+        }
+
+        string confDebug = element.GetAttribute(CONFIG_DEBUG_ATTR);
+        if (confDebug.Length > 0 && confDebug != "null")
+        {
+          LogLog.Warn(declaringType, "The \"" + CONFIG_DEBUG_ATTR + "\" attribute is deprecated.");
+          LogLog.Warn(declaringType, "Use the \"" + INTERNAL_DEBUG_ATTR + "\" attribute instead.");
+          LogLog.InternalDebugging = OptionConverter.ToBoolean(confDebug, true);
+        }
+      }
+
+      // Default mode is merge
+      ConfigUpdateMode configUpdateMode = ConfigUpdateMode.Merge;
+
+      // Look for the config update attribute
+      string configUpdateModeAttribute = element.GetAttribute(CONFIG_UPDATE_MODE_ATTR);
+      if (configUpdateModeAttribute != null && configUpdateModeAttribute.Length > 0)
+      {
+        // Parse the attribute
+        try
+        {
+          configUpdateMode = (ConfigUpdateMode)OptionConverter.ConvertStringTo(typeof(ConfigUpdateMode), configUpdateModeAttribute);
+        }
+        catch
+        {
+          LogLog.Error(declaringType, "Invalid " + CONFIG_UPDATE_MODE_ATTR + " attribute value [" + configUpdateModeAttribute + "]");
+        }
+      }
+
+      // IMPL: The IFormatProvider argument to Enum.ToString() is deprecated in .NET 2.0
+      LogLog.Debug(declaringType, "Configuration update mode [" + configUpdateMode.ToString() + "].");
+
+      // Only reset configuration if overwrite flag specified
+      if (configUpdateMode == ConfigUpdateMode.Overwrite)
+      {
+        // Reset to original unset configuration
+        m_hierarchy.ResetConfiguration();
+        LogLog.Debug(declaringType, "Configuration reset before reading config.");
+      }
+
+      /* Building Appender objects, placing them in a local namespace
+         for future reference */
+
+      /* Process all the top level elements */
+
+      foreach (XmlNode currentNode in element.ChildNodes)
+      {
+        if (currentNode.NodeType == XmlNodeType.Element)
+        {
+          XmlElement currentElement = (XmlElement)currentNode;
+
+          if (currentElement.LocalName == LOGGER_TAG)
+          {
+            ParseLogger(currentElement);
+          }
+          else if (currentElement.LocalName == CATEGORY_TAG)
+          {
+            // TODO: deprecated use of category
+            ParseLogger(currentElement);
+          }
+          else if (currentElement.LocalName == ROOT_TAG)
+          {
+            ParseRoot(currentElement);
+          }
+          else if (currentElement.LocalName == RENDERER_TAG)
+          {
+            ParseRenderer(currentElement);
+          }
+          else if (currentElement.LocalName == APPENDER_TAG)
+          {
+            // We ignore appenders in this pass. They will
+            // be found and loaded if they are referenced.
+          }
+          else
+          {
+            // Read the param tags and set properties on the hierarchy
+            SetParameter(currentElement, m_hierarchy);
+          }
+        }
+      }
+
+      // Lastly set the hierarchy threshold
+      string thresholdStr = element.GetAttribute(THRESHOLD_ATTR);
+      LogLog.Debug(declaringType, "Hierarchy Threshold [" + thresholdStr + "]");
+      if (thresholdStr.Length > 0 && thresholdStr != "null")
+      {
+        Level thresholdLevel = (Level)ConvertStringTo(typeof(Level), thresholdStr);
+        if (thresholdLevel != null)
+        {
+          m_hierarchy.Threshold = thresholdLevel;
+        }
+        else
+        {
+          LogLog.Warn(declaringType, "Unable to set hierarchy threshold using value [" + thresholdStr + "] (with acceptable conversion types)");
+        }
+      }
+
+      // Done reading config
+    }
+
+    #endregion Public Instance Methods
+
+    #region Protected Instance Methods
+
+    /// <summary>
+    /// Parse appenders by IDREF.
+    /// </summary>
+    /// <param name="appenderRef">The appender ref element.</param>
+    /// <returns>The instance of the appender that the ref refers to.</returns>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element that represents an appender and return 
+    /// the appender.
+    /// </para>
+    /// </remarks>
+    protected IAppender FindAppenderByReference(XmlElement appenderRef)
+    {
+      string appenderName = appenderRef.GetAttribute(REF_ATTR);
+
+      IAppender appender = (IAppender)m_appenderBag[appenderName];
+      if (appender != null)
+      {
+        return appender;
+      }
+      else
+      {
+        // Find the element with that id
+        XmlElement element = null;
+
+        if (appenderName != null && appenderName.Length > 0)
+        {
+          foreach (XmlElement curAppenderElement in appenderRef.OwnerDocument.GetElementsByTagName(APPENDER_TAG))
+          {
+            if (curAppenderElement.GetAttribute("name") == appenderName)
             {
-                // Look for a emitDebug attribute to enable internal debug
-                string emitDebugAttribute = element.GetAttribute(EMIT_INTERNAL_DEBUG_ATTR);
-                LogLog.Debug(declaringType, EMIT_INTERNAL_DEBUG_ATTR + " attribute [" + emitDebugAttribute + "].");
+              element = curAppenderElement;
+              break;
+            }
+          }
+        }
 
-                if (emitDebugAttribute.Length > 0 && emitDebugAttribute != "null")
+        if (element == null)
+        {
+          LogLog.Error(declaringType, "XmlHierarchyConfigurator: No appender named [" + appenderName + "] could be found.");
+          return null;
+        }
+        else
+        {
+          appender = ParseAppender(element);
+          if (appender != null)
+          {
+            m_appenderBag[appenderName] = appender;
+          }
+          return appender;
+        }
+      }
+    }
+
+    /// <summary>
+    /// Parses an appender element.
+    /// </summary>
+    /// <param name="appenderElement">The appender element.</param>
+    /// <returns>The appender instance or <c>null</c> when parsing failed.</returns>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element that represents an appender and return
+    /// the appender instance.
+    /// </para>
+    /// </remarks>
+    protected IAppender ParseAppender(XmlElement appenderElement)
+    {
+      string appenderName = appenderElement.GetAttribute(NAME_ATTR);
+      string typeName = appenderElement.GetAttribute(TYPE_ATTR);
+
+      LogLog.Debug(declaringType, "Loading Appender [" + appenderName + "] type: [" + typeName + "]");
+      try
+      {
+#if NETSTANDARD1_3
+        IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, typeName, true, true));
+#else
+        IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));
+#endif
+        appender.Name = appenderName;
+
+        foreach (XmlNode currentNode in appenderElement.ChildNodes)
+        {
+          /* We're only interested in Elements */
+          if (currentNode.NodeType == XmlNodeType.Element)
+          {
+            XmlElement currentElement = (XmlElement)currentNode;
+
+            // Look for the appender ref tag
+            if (currentElement.LocalName == APPENDER_REF_TAG)
+            {
+              string refName = currentElement.GetAttribute(REF_ATTR);
+
+              IAppenderAttachable appenderContainer = appender as IAppenderAttachable;
+              if (appenderContainer != null)
+              {
+                LogLog.Debug(declaringType, "Attaching appender named [" + refName + "] to appender named [" + appender.Name + "].");
+
+                IAppender referencedAppender = FindAppenderByReference(currentElement);
+                if (referencedAppender != null)
                 {
-                    LogLog.EmitInternalMessages = OptionConverter.ToBoolean(emitDebugAttribute, true);
+                  appenderContainer.AddAppender(referencedAppender);
+                }
+              }
+              else
+              {
+                LogLog.Error(declaringType, "Requesting attachment of appender named [" + refName + "] to appender named [" + appender.Name + "] which does not implement log4net.Core.IAppenderAttachable.");
+              }
+            }
+            else
+            {
+              // For all other tags we use standard set param method
+              SetParameter(currentElement, appender);
+            }
+          }
+        }
+
+        IOptionHandler optionHandler = appender as IOptionHandler;
+        if (optionHandler != null)
+        {
+          optionHandler.ActivateOptions();
+        }
+
+        LogLog.Debug(declaringType, "Created Appender [" + appenderName + "]");
+        return appender;
+      }
+      catch (Exception ex)
+      {
+        // Yes, it's ugly.  But all exceptions point to the same problem: we can't create an Appender
+
+        LogLog.Error(declaringType, "Could not create Appender [" + appenderName + "] of type [" + typeName + "]. Reported error follows.", ex);
+        return null;
+      }
+    }
+
+    /// <summary>
+    /// Parses a logger element.
+    /// </summary>
+    /// <param name="loggerElement">The logger element.</param>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element that represents a logger.
+    /// </para>
+    /// </remarks>
+    protected void ParseLogger(XmlElement loggerElement)
+    {
+      // Create a new log4net.Logger object from the <logger> element.
+      string loggerName = loggerElement.GetAttribute(NAME_ATTR);
+
+      LogLog.Debug(declaringType, "Retrieving an instance of log4net.Repository.Logger for logger [" + loggerName + "].");
+      Logger log = m_hierarchy.GetLogger(loggerName) as Logger;
+
+      // Setting up a logger needs to be an atomic operation, in order
+      // to protect potential log operations while logger
+      // configuration is in progress.
+      lock (log)
+      {
+        bool additivity = OptionConverter.ToBoolean(loggerElement.GetAttribute(ADDITIVITY_ATTR), true);
+
+        LogLog.Debug(declaringType, "Setting [" + log.Name + "] additivity to [" + additivity + "].");
+        log.Additivity = additivity;
+        ParseChildrenOfLoggerElement(loggerElement, log, false);
+      }
+    }
+
+    /// <summary>
+    /// Parses the root logger element.
+    /// </summary>
+    /// <param name="rootElement">The root element.</param>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element that represents the root logger.
+    /// </para>
+    /// </remarks>
+    protected void ParseRoot(XmlElement rootElement)
+    {
+      Logger root = m_hierarchy.Root;
+      // logger configuration needs to be atomic
+      lock (root)
+      {
+        ParseChildrenOfLoggerElement(rootElement, root, true);
+      }
+    }
+
+    /// <summary>
+    /// Parses the children of a logger element.
+    /// </summary>
+    /// <param name="catElement">The category element.</param>
+    /// <param name="log">The logger instance.</param>
+    /// <param name="isRoot">Flag to indicate if the logger is the root logger.</param>
+    /// <remarks>
+    /// <para>
+    /// Parse the child elements of a &lt;logger&gt; element.
+    /// </para>
+    /// </remarks>
+    protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot)
+    {
+      // Remove all existing appenders from log. They will be
+      // reconstructed if need be.
+      log.RemoveAllAppenders();
+
+      foreach (XmlNode currentNode in catElement.ChildNodes)
+      {
+        if (currentNode.NodeType == XmlNodeType.Element)
+        {
+          XmlElement currentElement = (XmlElement)currentNode;
+
+          if (currentElement.LocalName == APPENDER_REF_TAG)
+          {
+            IAppender appender = FindAppenderByReference(currentElement);
+            string refName = currentElement.GetAttribute(REF_ATTR);
+            if (appender != null)
+            {
+              LogLog.Debug(declaringType, "Adding appender named [" + refName + "] to logger [" + log.Name + "].");
+              log.AddAppender(appender);
+            }
+            else
+            {
+              LogLog.Error(declaringType, "Appender named [" + refName + "] not found.");
+            }
+          }
+          else if (currentElement.LocalName == LEVEL_TAG || currentElement.LocalName == PRIORITY_TAG)
+          {
+            ParseLevel(currentElement, log, isRoot);
+          }
+          else
+          {
+            SetParameter(currentElement, log);
+          }
+        }
+      }
+
+      IOptionHandler optionHandler = log as IOptionHandler;
+      if (optionHandler != null)
+      {
+        optionHandler.ActivateOptions();
+      }
+    }
+
+    /// <summary>
+    /// Parses an object renderer.
+    /// </summary>
+    /// <param name="element">The renderer element.</param>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element that represents a renderer.
+    /// </para>
+    /// </remarks>
+    protected void ParseRenderer(XmlElement element)
+    {
+      string renderingClassName = element.GetAttribute(RENDERING_TYPE_ATTR);
+      string renderedClassName = element.GetAttribute(RENDERED_TYPE_ATTR);
+
+      LogLog.Debug(declaringType, "Rendering class [" + renderingClassName + "], Rendered class [" + renderedClassName + "].");
+      IObjectRenderer renderer = (IObjectRenderer)OptionConverter.InstantiateByClassName(renderingClassName, typeof(IObjectRenderer), null);
+      if (renderer == null)
+      {
+        LogLog.Error(declaringType, "Could not instantiate renderer [" + renderingClassName + "].");
+        return;
+      }
+      else
+      {
+        try
+        {
+#if NETSTANDARD1_3
+          m_hierarchy.RendererMap.Put(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, renderedClassName, true, true), renderer);
+#else
+          m_hierarchy.RendererMap.Put(SystemInfo.GetTypeFromString(renderedClassName, true, true), renderer);
+#endif
+        }
+        catch (Exception e)
+        {
+          LogLog.Error(declaringType, "Could not find class [" + renderedClassName + "].", e);
+        }
+      }
+    }
+
+    /// <summary>
+    /// Parses a level element.
+    /// </summary>
+    /// <param name="element">The level element.</param>
+    /// <param name="log">The logger object to set the level on.</param>
+    /// <param name="isRoot">Flag to indicate if the logger is the root logger.</param>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element that represents a level.
+    /// </para>
+    /// </remarks>
+    protected void ParseLevel(XmlElement element, Logger log, bool isRoot)
+    {
+      string loggerName = log.Name;
+      if (isRoot)
+      {
+        loggerName = "root";
+      }
+
+      string levelStr = element.GetAttribute(VALUE_ATTR);
+      LogLog.Debug(declaringType, "Logger [" + loggerName + "] Level string is [" + levelStr + "].");
+
+      if (INHERITED == levelStr)
+      {
+        if (isRoot)
+        {
+          LogLog.Error(declaringType, "Root level cannot be inherited. Ignoring directive.");
+        }
+        else
+        {
+          LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to inherit from parent.");
+          log.Level = null;
+        }
+      }
+      else
+      {
+        log.Level = log.Hierarchy.LevelMap[levelStr];
+        if (log.Level == null)
+        {
+          LogLog.Error(declaringType, "Undefined level [" + levelStr + "] on Logger [" + loggerName + "].");
+        }
+        else
+        {
+          LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to [name=\"" + log.Level.Name + "\",value=" + log.Level.Value + "].");
+        }
+      }
+    }
+
+    /// <summary>
+    /// Sets a parameter on an object.
+    /// </summary>
+    /// <param name="element">The parameter element.</param>
+    /// <param name="target">The object to set the parameter on.</param>
+    /// <remarks>
+    /// The parameter name must correspond to a writable property
+    /// on the object. The value of the parameter is a string,
+    /// therefore this function will attempt to set a string
+    /// property first. If unable to set a string property it
+    /// will inspect the property and its argument type. It will
+    /// attempt to call a static method called <c>Parse</c> on the
+    /// type of the property. This method will take a single
+    /// string argument and return a value that can be used to
+    /// set the property.
+    /// </remarks>
+    protected void SetParameter(XmlElement element, object target)
+    {
+      // Get the property name
+      string name = element.GetAttribute(NAME_ATTR);
+
+      // If the name attribute does not exist then use the name of the element
+      if (element.LocalName != PARAM_TAG || name == null || name.Length == 0)
+      {
+        name = element.LocalName;
+      }
+
+      // Look for the property on the target object
+      Type targetType = target.GetType();
+      Type propertyType = null;
+
+      PropertyInfo propInfo = null;
+      MethodInfo methInfo = null;
+
+      // Try to find a writable property
+      propInfo = targetType.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
+      if (propInfo != null && propInfo.CanWrite)
+      {
+        // found a property
+        propertyType = propInfo.PropertyType;
+      }
+      else
+      {
+        propInfo = null;
+
+        // look for a method with the signature Add<property>(type)
+        methInfo = FindMethodInfo(targetType, name);
+
+        if (methInfo != null)
+        {
+          propertyType = methInfo.GetParameters()[0].ParameterType;
+        }
+      }
+
+      if (propertyType == null)
+      {
+        LogLog.Error(declaringType, "XmlHierarchyConfigurator: Cannot find Property [" + name + "] to set object on [" + target.ToString() + "]");
+      }
+      else
+      {
+        string propertyValue = null;
+
+        if (element.GetAttributeNode(VALUE_ATTR) != null)
+        {
+          propertyValue = element.GetAttribute(VALUE_ATTR);
+        }
+        else if (element.HasChildNodes)
+        {
+          // Concatenate the CDATA and Text nodes together
+          foreach (XmlNode childNode in element.ChildNodes)
+          {
+            if (childNode.NodeType == XmlNodeType.CDATA || childNode.NodeType == XmlNodeType.Text)
+            {
+              if (propertyValue == null)
+              {
+                propertyValue = childNode.InnerText;
+              }
+              else
+              {
+                propertyValue += childNode.InnerText;
+              }
+            }
+          }
+        }
+
+        if (propertyValue != null)
+        {
+#if !NETCF && !NETSTANDARD1_3 // NETSTANDARD1_3: System.Runtime.InteropServices.RuntimeInformation not available on desktop 4.6
+          try
+          {
+            // Expand environment variables in the string.
+            IDictionary environmentVariables = Environment.GetEnvironmentVariables();
+            if (HasCaseInsensitiveEnvironment)
+            {
+              environmentVariables = CreateCaseInsensitiveWrapper(environmentVariables);
+            }
+            propertyValue = OptionConverter.SubstituteVariables(propertyValue, environmentVariables);
+          }
+          catch (System.Security.SecurityException)
+          {
+            // This security exception will occur if the caller does not have 
+            // unrestricted environment permission. If this occurs the expansion 
+            // will be skipped with the following warning message.
+            LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion.");
+          }
+#endif
+
+          Type parsedObjectConversionTargetType = null;
+
+          // Check if a specific subtype is specified on the element using the 'type' attribute
+          string subTypeString = element.GetAttribute(TYPE_ATTR);
+          if (subTypeString != null && subTypeString.Length > 0)
+          {
+            // Read the explicit subtype
+            try
+            {
+#if NETSTANDARD1_3
+              Type subType = SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, subTypeString, true, true);
+#else
+              Type subType = SystemInfo.GetTypeFromString(subTypeString, true, true);
+#endif
+
+              LogLog.Debug(declaringType, "Parameter [" + name + "] specified subtype [" + subType.FullName + "]");
+
+              if (!propertyType.IsAssignableFrom(subType))
+              {
+                // Check if there is an appropriate type converter
+                if (OptionConverter.CanConvertTypeTo(subType, propertyType))
+                {
+                  // Must re-convert to the real property type
+                  parsedObjectConversionTargetType = propertyType;
+
+                  // Use sub type as intermediary type
+                  propertyType = subType;
                 }
                 else
                 {
-                    LogLog.Debug(declaringType, "Ignoring " + EMIT_INTERNAL_DEBUG_ATTR + " attribute.");
+                  LogLog.Error(declaringType, "subtype [" + subType.FullName + "] set on [" + name + "] is not a subclass of property type [" + propertyType.FullName + "] and there are no acceptable type conversions.");
                 }
+              }
+              else
+              {
+                // The subtype specified is found and is actually a subtype of the property
+                // type, therefore we can switch to using this type.
+                propertyType = subType;
+              }
+            }
+            catch (Exception ex)
+            {
+              LogLog.Error(declaringType, "Failed to find type [" + subTypeString + "] set on [" + name + "]", ex);
+            }
+          }
+
+          // Now try to convert the string value to an acceptable type
+          // to pass to this property.
+
+          object convertedValue = ConvertStringTo(propertyType, propertyValue);
+
+          // Check if we need to do an additional conversion
+          if (convertedValue != null && parsedObjectConversionTargetType != null)
+          {
+            LogLog.Debug(declaringType, "Performing additional conversion of value from [" + convertedValue.GetType().Name + "] to [" + parsedObjectConversionTargetType.Name + "]");
+            convertedValue = OptionConverter.ConvertTypeTo(convertedValue, parsedObjectConversionTargetType);
+          }
+
+          if (convertedValue != null)
+          {
+            if (propInfo != null)
+            {
+              // Got a converted result
+              LogLog.Debug(declaringType, "Setting Property [" + propInfo.Name + "] to " + convertedValue.GetType().Name + " value [" + convertedValue.ToString() + "]");
+
+              try
+              {
+                // Pass to the property
+#if NETSTANDARD1_3 // TODO BindingFlags is available for netstandard1.5
+                propInfo.SetValue(target, convertedValue, null);
+#else
+                propInfo.SetValue(target, convertedValue, BindingFlags.SetProperty, null, null, CultureInfo.InvariantCulture);
+#endif
+              }
+              catch (TargetInvocationException targetInvocationEx)
+              {
+                LogLog.Error(declaringType, "Failed to set parameter [" + propInfo.Name + "] on object [" + target + "] using value [" + convertedValue + "]", targetInvocationEx.InnerException);
+              }
+            }
+            else if (methInfo != null)
+            {
+              // Got a converted result
+              LogLog.Debug(declaringType, "Setting Collection Property [" + methInfo.Name + "] to " + convertedValue.GetType().Name + " value [" + convertedValue.ToString() + "]");
+
+              try
+              {
+                // Pass to the property
+#if NETSTANDARD1_3 // TODO BindingFlags is available for netstandard1.5
+                methInfo.Invoke(target, new[] { convertedValue });
+#else
+                methInfo.Invoke(target, BindingFlags.InvokeMethod, null, new object[] { convertedValue }, CultureInfo.InvariantCulture);
+#endif
+              }
+              catch (TargetInvocationException targetInvocationEx)
+              {
+                LogLog.Error(declaringType, "Failed to set parameter [" + name + "] on object [" + target + "] using value [" + convertedValue + "]", targetInvocationEx.InnerException);
+              }
+            }
+          }
+          else
+          {
+            LogLog.Warn(declaringType, "Unable to set property [" + name + "] on object [" + target + "] using value [" + propertyValue + "] (with acceptable conversion types)");
+          }
+        }
+        else
+        {
+          object createdObject = null;
+
+          if (propertyType == typeof(string) && !HasAttributesOrElements(element))
+          {
+            // If the property is a string and the element is empty (no attributes
+            // or child elements) then we special case the object value to an empty string.
+            // This is necessary because while the String is a class it does not have
+            // a default constructor that creates an empty string, which is the behavior
+            // we are trying to simulate and would be expected from CreateObjectFromXml
+            createdObject = "";
+          }
+          else
+          {
+            // No value specified
+            Type defaultObjectType = null;
+            if (IsTypeConstructible(propertyType))
+            {
+              defaultObjectType = propertyType;
             }
 
-		    if (!LogLog.InternalDebugging)
-			{
-				// Look for a debug attribute to enable internal debug
-				string debugAttribute = element.GetAttribute(INTERNAL_DEBUG_ATTR);
-				LogLog.Debug(declaringType, INTERNAL_DEBUG_ATTR+" attribute [" + debugAttribute + "].");
+            createdObject = CreateObjectFromXml(element, defaultObjectType, propertyType);
+          }
 
-				if (debugAttribute.Length>0 && debugAttribute != "null") 
-				{	  
-					LogLog.InternalDebugging = OptionConverter.ToBoolean(debugAttribute, true);
-				}
-				else 
-				{
-					LogLog.Debug(declaringType, "Ignoring " + INTERNAL_DEBUG_ATTR + " attribute.");
-				}
+          if (createdObject == null)
+          {
+            LogLog.Error(declaringType, "Failed to create object to set param: " + name);
+          }
+          else
+          {
+            if (propInfo != null)
+            {
+              // Got a converted result
+              LogLog.Debug(declaringType, "Setting Property [" + propInfo.Name + "] to object [" + createdObject + "]");
 
-				string confDebug = element.GetAttribute(CONFIG_DEBUG_ATTR);
-				if (confDebug.Length>0 && confDebug != "null")
-				{	  
-					LogLog.Warn(declaringType, "The \"" + CONFIG_DEBUG_ATTR + "\" attribute is deprecated.");
-					LogLog.Warn(declaringType, "Use the \"" + INTERNAL_DEBUG_ATTR + "\" attribute instead.");
-					LogLog.InternalDebugging = OptionConverter.ToBoolean(confDebug, true);
-				}
-			}
-
-			// Default mode is merge
-			ConfigUpdateMode configUpdateMode = ConfigUpdateMode.Merge;
-
-			// Look for the config update attribute
-			string configUpdateModeAttribute = element.GetAttribute(CONFIG_UPDATE_MODE_ATTR);
-			if (configUpdateModeAttribute != null && configUpdateModeAttribute.Length > 0)
-			{
-				// Parse the attribute
-				try
-				{
-					configUpdateMode = (ConfigUpdateMode)OptionConverter.ConvertStringTo(typeof(ConfigUpdateMode), configUpdateModeAttribute);
-				}
-				catch
-				{
-					LogLog.Error(declaringType, "Invalid " + CONFIG_UPDATE_MODE_ATTR + " attribute value [" + configUpdateModeAttribute + "]");
-				}
-			}
-
-			// IMPL: The IFormatProvider argument to Enum.ToString() is deprecated in .NET 2.0
-			LogLog.Debug(declaringType, "Configuration update mode [" + configUpdateMode.ToString() + "].");
-
-			// Only reset configuration if overwrite flag specified
-			if (configUpdateMode == ConfigUpdateMode.Overwrite)
-			{
-				// Reset to original unset configuration
-				m_hierarchy.ResetConfiguration();
-				LogLog.Debug(declaringType, "Configuration reset before reading config.");
-			}
-
-			/* Building Appender objects, placing them in a local namespace
-			   for future reference */
-
-			/* Process all the top level elements */
-
-			foreach (XmlNode currentNode in element.ChildNodes)
-			{
-				if (currentNode.NodeType == XmlNodeType.Element) 
-				{
-					XmlElement currentElement = (XmlElement)currentNode;
-
-					if (currentElement.LocalName == LOGGER_TAG)
-					{
-						ParseLogger(currentElement);
-					} 
-					else if (currentElement.LocalName == CATEGORY_TAG)
-					{
-						// TODO: deprecated use of category
-						ParseLogger(currentElement);
-					} 
-					else if (currentElement.LocalName == ROOT_TAG)
-					{
-						ParseRoot(currentElement);
-					} 
-					else if (currentElement.LocalName == RENDERER_TAG)
-					{
-						ParseRenderer(currentElement);
-					}
-					else if (currentElement.LocalName == APPENDER_TAG)
-					{
-						// We ignore appenders in this pass. They will
-						// be found and loaded if they are referenced.
-					}
-					else
-					{
-						// Read the param tags and set properties on the hierarchy
-						SetParameter(currentElement, m_hierarchy);
-					}
-				}
-			}
-
-			// Lastly set the hierarchy threshold
-			string thresholdStr = element.GetAttribute(THRESHOLD_ATTR);
-			LogLog.Debug(declaringType, "Hierarchy Threshold [" + thresholdStr + "]");
-			if (thresholdStr.Length > 0 && thresholdStr != "null") 
-			{
-				Level thresholdLevel = (Level) ConvertStringTo(typeof(Level), thresholdStr);
-				if (thresholdLevel != null)
-				{
-					m_hierarchy.Threshold = thresholdLevel;
-				}
-				else
-				{
-					LogLog.Warn(declaringType, "Unable to set hierarchy threshold using value [" + thresholdStr + "] (with acceptable conversion types)");
-				}
-			}
-
-			// Done reading config
-		}
-
-	    #endregion Public Instance Methods
-
-		#region Protected Instance Methods
-
-		/// <summary>
-		/// Parse appenders by IDREF.
-		/// </summary>
-		/// <param name="appenderRef">The appender ref element.</param>
-		/// <returns>The instance of the appender that the ref refers to.</returns>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element that represents an appender and return 
-		/// the appender.
-		/// </para>
-		/// </remarks>
-		protected IAppender FindAppenderByReference(XmlElement appenderRef) 
-		{	
-			string appenderName = appenderRef.GetAttribute(REF_ATTR);
-
-			IAppender appender = (IAppender)m_appenderBag[appenderName];
-			if (appender != null) 
-			{
-				return appender;
-			} 
-			else 
-			{
-				// Find the element with that id
-				XmlElement element = null;
-
-				if (appenderName != null && appenderName.Length > 0)
-				{
-					foreach (XmlElement curAppenderElement in appenderRef.OwnerDocument.GetElementsByTagName(APPENDER_TAG))
-					{
-						if (curAppenderElement.GetAttribute("name") == appenderName)
-						{
-							element = curAppenderElement;
-							break;
-						}
-					}
-				}
-
-				if (element == null) 
-				{
-					LogLog.Error(declaringType, "XmlHierarchyConfigurator: No appender named [" + appenderName + "] could be found."); 
-					return null;
-				} 
-				else
-				{
-					appender = ParseAppender(element);
-					if (appender != null)
-					{
-						m_appenderBag[appenderName] = appender;
-					}
-					return appender;
-				}
-			} 
-		}
-
-		/// <summary>
-		/// Parses an appender element.
-		/// </summary>
-		/// <param name="appenderElement">The appender element.</param>
-		/// <returns>The appender instance or <c>null</c> when parsing failed.</returns>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element that represents an appender and return
-		/// the appender instance.
-		/// </para>
-		/// </remarks>
-		protected IAppender ParseAppender(XmlElement appenderElement) 
-		{
-			string appenderName = appenderElement.GetAttribute(NAME_ATTR);
-			string typeName = appenderElement.GetAttribute(TYPE_ATTR);
-
-			LogLog.Debug(declaringType, "Loading Appender [" + appenderName + "] type: [" + typeName + "]");
-			try 
-			{
-#if NETSTANDARD1_3
-				IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, typeName, true, true));
-#else
-				IAppender appender = (IAppender)Activator.CreateInstance(SystemInfo.GetTypeFromString(typeName, true, true));
-#endif
-				appender.Name = appenderName;
-
-				foreach (XmlNode currentNode in appenderElement.ChildNodes)
-				{
-					/* We're only interested in Elements */
-					if (currentNode.NodeType == XmlNodeType.Element) 
-					{
-						XmlElement currentElement = (XmlElement)currentNode;
-
-						// Look for the appender ref tag
-						if (currentElement.LocalName == APPENDER_REF_TAG)
-						{
-							string refName = currentElement.GetAttribute(REF_ATTR);
-
-							IAppenderAttachable appenderContainer = appender as IAppenderAttachable;
-							if (appenderContainer != null) 
-							{
-								LogLog.Debug(declaringType, "Attaching appender named [" + refName + "] to appender named [" + appender.Name + "].");
-
-								IAppender referencedAppender = FindAppenderByReference(currentElement);
-								if (referencedAppender != null)
-								{
-									appenderContainer.AddAppender(referencedAppender);
-								}
-							} 
-							else 
-							{
-								LogLog.Error(declaringType, "Requesting attachment of appender named ["+refName+ "] to appender named [" + appender.Name + "] which does not implement log4net.Core.IAppenderAttachable.");
-							}
-						}
-						else
-						{
-							// For all other tags we use standard set param method
-							SetParameter(currentElement, appender);
-						}
-					}
-				}
-
-				IOptionHandler optionHandler = appender as IOptionHandler;
-				if (optionHandler != null) 
-				{
-					optionHandler.ActivateOptions();
-				}
-
-				LogLog.Debug(declaringType, "Created Appender [" + appenderName + "]");	
-				return appender;
-			}
-			catch (Exception ex) 
-			{
-				// Yes, it's ugly.  But all exceptions point to the same problem: we can't create an Appender
-
-				LogLog.Error(declaringType, "Could not create Appender [" + appenderName + "] of type [" + typeName + "]. Reported error follows.", ex);
-				return null;
-			}
-		}
-
-		/// <summary>
-		/// Parses a logger element.
-		/// </summary>
-		/// <param name="loggerElement">The logger element.</param>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element that represents a logger.
-		/// </para>
-		/// </remarks>
-		protected void ParseLogger(XmlElement loggerElement) 
-		{
-			// Create a new log4net.Logger object from the <logger> element.
-			string loggerName = loggerElement.GetAttribute(NAME_ATTR);
-
-			LogLog.Debug(declaringType, "Retrieving an instance of log4net.Repository.Logger for logger [" + loggerName + "].");
-			Logger log = m_hierarchy.GetLogger(loggerName) as Logger;
-
-			// Setting up a logger needs to be an atomic operation, in order
-			// to protect potential log operations while logger
-			// configuration is in progress.
-			lock(log) 
-			{
-				bool additivity = OptionConverter.ToBoolean(loggerElement.GetAttribute(ADDITIVITY_ATTR), true);
-	
-				LogLog.Debug(declaringType, "Setting [" + log.Name + "] additivity to [" + additivity + "].");
-				log.Additivity = additivity;
-				ParseChildrenOfLoggerElement(loggerElement, log, false);
-			}
-		}
-
-		/// <summary>
-		/// Parses the root logger element.
-		/// </summary>
-		/// <param name="rootElement">The root element.</param>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element that represents the root logger.
-		/// </para>
-		/// </remarks>
-		protected void ParseRoot(XmlElement rootElement) 
-		{
-			Logger root = m_hierarchy.Root;
-			// logger configuration needs to be atomic
-			lock(root) 
-			{	
-				ParseChildrenOfLoggerElement(rootElement, root, true);
-			}
-		}
-
-		/// <summary>
-		/// Parses the children of a logger element.
-		/// </summary>
-		/// <param name="catElement">The category element.</param>
-		/// <param name="log">The logger instance.</param>
-		/// <param name="isRoot">Flag to indicate if the logger is the root logger.</param>
-		/// <remarks>
-		/// <para>
-		/// Parse the child elements of a &lt;logger&gt; element.
-		/// </para>
-		/// </remarks>
-		protected void ParseChildrenOfLoggerElement(XmlElement catElement, Logger log, bool isRoot) 
-		{
-			// Remove all existing appenders from log. They will be
-			// reconstructed if need be.
-			log.RemoveAllAppenders();
-
-			foreach (XmlNode currentNode in catElement.ChildNodes)
-			{
-				if (currentNode.NodeType == XmlNodeType.Element) 
-				{
-					XmlElement currentElement = (XmlElement) currentNode;
-	
-					if (currentElement.LocalName == APPENDER_REF_TAG)
-					{
-						IAppender appender = FindAppenderByReference(currentElement);
-						string refName =  currentElement.GetAttribute(REF_ATTR);
-						if (appender != null)
-						{
-							LogLog.Debug(declaringType, "Adding appender named [" + refName + "] to logger [" + log.Name + "].");
-							log.AddAppender(appender);
-						}
-						else 
-						{
-							LogLog.Error(declaringType, "Appender named [" + refName + "] not found.");
-						}
-					} 
-					else if (currentElement.LocalName == LEVEL_TAG || currentElement.LocalName == PRIORITY_TAG) 
-					{
-						ParseLevel(currentElement, log, isRoot);	
-					} 
-					else
-					{
-						SetParameter(currentElement, log);
-					}
-				}
-			}
-
-			IOptionHandler optionHandler = log as IOptionHandler;
-			if (optionHandler != null) 
-			{
-				optionHandler.ActivateOptions();
-			}
-		}
-
-		/// <summary>
-		/// Parses an object renderer.
-		/// </summary>
-		/// <param name="element">The renderer element.</param>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element that represents a renderer.
-		/// </para>
-		/// </remarks>
-		protected void ParseRenderer(XmlElement element) 
-		{
-			string renderingClassName = element.GetAttribute(RENDERING_TYPE_ATTR);
-			string renderedClassName = element.GetAttribute(RENDERED_TYPE_ATTR);
-
-			LogLog.Debug(declaringType, "Rendering class [" + renderingClassName + "], Rendered class [" + renderedClassName + "].");
-			IObjectRenderer renderer = (IObjectRenderer)OptionConverter.InstantiateByClassName(renderingClassName, typeof(IObjectRenderer), null);
-			if (renderer == null) 
-			{
-				LogLog.Error(declaringType, "Could not instantiate renderer [" + renderingClassName + "].");
-				return;
-			} 
-			else 
-			{
-				try 
-				{
-#if NETSTANDARD1_3
-					m_hierarchy.RendererMap.Put(SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, renderedClassName, true, true), renderer);
-#else
-					m_hierarchy.RendererMap.Put(SystemInfo.GetTypeFromString(renderedClassName, true, true), renderer);
-#endif
-				} 
-				catch(Exception e) 
-				{
-					LogLog.Error(declaringType, "Could not find class [" + renderedClassName + "].", e);
-				}
-			}
-		}
-
-		/// <summary>
-		/// Parses a level element.
-		/// </summary>
-		/// <param name="element">The level element.</param>
-		/// <param name="log">The logger object to set the level on.</param>
-		/// <param name="isRoot">Flag to indicate if the logger is the root logger.</param>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element that represents a level.
-		/// </para>
-		/// </remarks>
-		protected void ParseLevel(XmlElement element, Logger log, bool isRoot) 
-		{
-			string loggerName = log.Name;
-			if (isRoot) 
-			{
-				loggerName = "root";
-			}
-
-			string levelStr = element.GetAttribute(VALUE_ATTR);
-			LogLog.Debug(declaringType, "Logger [" + loggerName + "] Level string is [" + levelStr + "].");
-	
-			if (INHERITED == levelStr) 
-			{
-				if (isRoot) 
-				{
-					LogLog.Error(declaringType, "Root level cannot be inherited. Ignoring directive.");
-				} 
-				else 
-				{
-					LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to inherit from parent.");	
-					log.Level = null;
-				}
-			} 
-			else 
-			{
-				log.Level = log.Hierarchy.LevelMap[levelStr];
-				if (log.Level == null)
-				{
-					LogLog.Error(declaringType, "Undefined level [" + levelStr + "] on Logger [" + loggerName + "].");
-				}
-				else
-				{
-					LogLog.Debug(declaringType, "Logger [" + loggerName + "] level set to [name=\"" + log.Level.Name + "\",value=" + log.Level.Value + "].");	
-				}
-			}
-		}
-
-		/// <summary>
-		/// Sets a parameter on an object.
-		/// </summary>
-		/// <param name="element">The parameter element.</param>
-		/// <param name="target">The object to set the parameter on.</param>
-		/// <remarks>
-		/// The parameter name must correspond to a writable property
-		/// on the object. The value of the parameter is a string,
-		/// therefore this function will attempt to set a string
-		/// property first. If unable to set a string property it
-		/// will inspect the property and its argument type. It will
-		/// attempt to call a static method called <c>Parse</c> on the
-		/// type of the property. This method will take a single
-		/// string argument and return a value that can be used to
-		/// set the property.
-		/// </remarks>
-		protected void SetParameter(XmlElement element, object target) 
-		{
-			// Get the property name
-			string name = element.GetAttribute(NAME_ATTR);
-
-			// If the name attribute does not exist then use the name of the element
-			if (element.LocalName != PARAM_TAG || name == null || name.Length == 0)
-			{
-				name = element.LocalName;
-			}
-
-			// Look for the property on the target object
-			Type targetType = target.GetType();
-			Type propertyType = null;
-
-			PropertyInfo propInfo = null;
-			MethodInfo methInfo = null;
-
-			// Try to find a writable property
-			propInfo = targetType.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.IgnoreCase);
-			if (propInfo != null && propInfo.CanWrite)
-			{
-				// found a property
-				propertyType = propInfo.PropertyType;
-			}
-			else
-			{
-				propInfo = null;
-
-				// look for a method with the signature Add<property>(type)
-				methInfo = FindMethodInfo(targetType, name);
-
-				if (methInfo != null)
-				{
-					propertyType = methInfo.GetParameters()[0].ParameterType;
-				}
-			}
-
-			if (propertyType == null)
-			{
-				LogLog.Error(declaringType, "XmlHierarchyConfigurator: Cannot find Property [" + name + "] to set object on [" + target.ToString() + "]");
-			}
-			else
-			{
-				string propertyValue = null;
-
-				if (element.GetAttributeNode(VALUE_ATTR) != null)
-				{
-					propertyValue = element.GetAttribute(VALUE_ATTR);
-				}
-				else if (element.HasChildNodes)
-				{
-					// Concatenate the CDATA and Text nodes together
-					foreach(XmlNode childNode in element.ChildNodes)
-					{
-						if (childNode.NodeType == XmlNodeType.CDATA || childNode.NodeType == XmlNodeType.Text)
-						{
-							if (propertyValue == null)
-							{
-								propertyValue = childNode.InnerText;
-							}
-							else
-							{
-								propertyValue += childNode.InnerText;
-							}
-						}
-					}
-				}
-
-				if(propertyValue != null)
-				{
-#if !NETCF && !NETSTANDARD1_3 // NETSTANDARD1_3: System.Runtime.InteropServices.RuntimeInformation not available on desktop 4.6
-					try
-					{
-						// Expand environment variables in the string.
-					    IDictionary environmentVariables = Environment.GetEnvironmentVariables();
-					    if (HasCaseInsensitiveEnvironment) {
-						environmentVariables = CreateCaseInsensitiveWrapper(environmentVariables);
-					    }
-						propertyValue = OptionConverter.SubstituteVariables(propertyValue, environmentVariables);
-					}
-					catch(System.Security.SecurityException)
-					{
-						// This security exception will occur if the caller does not have 
-						// unrestricted environment permission. If this occurs the expansion 
-						// will be skipped with the following warning message.
-						LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion.");
-					}
-#endif
-
-					Type parsedObjectConversionTargetType = null;
-
-					// Check if a specific subtype is specified on the element using the 'type' attribute
-					string subTypeString = element.GetAttribute(TYPE_ATTR);
-					if (subTypeString != null && subTypeString.Length > 0)
-					{
-						// Read the explicit subtype
-						try
-						{
-#if NETSTANDARD1_3
-							Type subType = SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, subTypeString, true, true);
-#else
-							Type subType = SystemInfo.GetTypeFromString(subTypeString, true, true);
-#endif
-
-							LogLog.Debug(declaringType, "Parameter ["+name+"] specified subtype ["+subType.FullName+"]");
-
-							if (!propertyType.IsAssignableFrom(subType))
-							{
-								// Check if there is an appropriate type converter
-								if (OptionConverter.CanConvertTypeTo(subType, propertyType))
-								{
-									// Must re-convert to the real property type
-									parsedObjectConversionTargetType = propertyType;
-
-									// Use sub type as intermediary type
-									propertyType = subType;
-								}
-								else
-								{
-									LogLog.Error(declaringType, "subtype ["+subType.FullName+"] set on ["+name+"] is not a subclass of property type ["+propertyType.FullName+"] and there are no acceptable type conversions.");
-								}
-							}
-							else
-							{
-								// The subtype specified is found and is actually a subtype of the property
-								// type, therefore we can switch to using this type.
-								propertyType = subType;
-							}
-						}
-						catch(Exception ex)
-						{
-							LogLog.Error(declaringType, "Failed to find type ["+subTypeString+"] set on ["+name+"]", ex);
-						}
-					}
-
-					// Now try to convert the string value to an acceptable type
-					// to pass to this property.
-
-					object convertedValue = ConvertStringTo(propertyType, propertyValue);
-					
-					// Check if we need to do an additional conversion
-					if (convertedValue != null && parsedObjectConversionTargetType != null)
-					{
-						LogLog.Debug(declaringType, "Performing additional conversion of value from [" + convertedValue.GetType().Name + "] to [" + parsedObjectConversionTargetType.Name + "]");
-						convertedValue = OptionConverter.ConvertTypeTo(convertedValue, parsedObjectConversionTargetType);
-					}
-
-					if (convertedValue != null)
-					{
-						if (propInfo != null)
-						{
-							// Got a converted result
-							LogLog.Debug(declaringType, "Setting Property [" + propInfo.Name + "] to " + convertedValue.GetType().Name + " value [" + convertedValue.ToString() + "]");
-
-							try
-							{
-								// Pass to the property
+              try
+              {
+                // Pass to the property
 #if NETSTANDARD1_3 // TODO BindingFlags is available for netstandard1.5
-								propInfo.SetValue(target, convertedValue, null);
+                propInfo.SetValue(target, createdObject, null);
 #else
-								propInfo.SetValue(target, convertedValue, BindingFlags.SetProperty, null, null, CultureInfo.InvariantCulture);
+                propInfo.SetValue(target, createdObject, BindingFlags.SetProperty, null, null, CultureInfo.InvariantCulture);
 #endif
-							}
-							catch(TargetInvocationException targetInvocationEx)
-							{
-								LogLog.Error(declaringType, "Failed to set parameter [" + propInfo.Name + "] on object [" + target + "] using value [" + convertedValue + "]", targetInvocationEx.InnerException);
-							}
-						}
-						else if (methInfo != null)
-						{
-							// Got a converted result
-							LogLog.Debug(declaringType, "Setting Collection Property [" + methInfo.Name + "] to " + convertedValue.GetType().Name + " value [" + convertedValue.ToString() + "]");
+              }
+              catch (TargetInvocationException targetInvocationEx)
+              {
+                LogLog.Error(declaringType, "Failed to set parameter [" + propInfo.Name + "] on object [" + target + "] using value [" + createdObject + "]", targetInvocationEx.InnerException);
+              }
+            }
+            else if (methInfo != null)
+            {
+              // Got a converted result
+              LogLog.Debug(declaringType, "Setting Collection Property [" + methInfo.Name + "] to object [" + createdObject + "]");
 
-							try
-							{
-								// Pass to the property
+              try
+              {
+                // Pass to the property
 #if NETSTANDARD1_3 // TODO BindingFlags is available for netstandard1.5
-								methInfo.Invoke(target, new[] { convertedValue });
+                methInfo.Invoke(target, new[] { createdObject });
 #else
-								methInfo.Invoke(target, BindingFlags.InvokeMethod, null, new object[] {convertedValue}, CultureInfo.InvariantCulture);
+                methInfo.Invoke(target, BindingFlags.InvokeMethod, null, new object[] { createdObject }, CultureInfo.InvariantCulture);
 #endif
-							}
-							catch(TargetInvocationException targetInvocationEx)
-							{
-								LogLog.Error(declaringType, "Failed to set parameter [" + name + "] on object [" + target + "] using value [" + convertedValue + "]", targetInvocationEx.InnerException);
-							}
-						}
-					}
-					else
-					{
-						LogLog.Warn(declaringType, "Unable to set property [" + name + "] on object [" + target + "] using value [" + propertyValue + "] (with acceptable conversion types)");
-					}
-				}
-				else
-				{
-					object createdObject = null;
+              }
+              catch (TargetInvocationException targetInvocationEx)
+              {
+                LogLog.Error(declaringType, "Failed to set parameter [" + methInfo.Name + "] on object [" + target + "] using value [" + createdObject + "]", targetInvocationEx.InnerException);
+              }
+            }
+          }
+        }
+      }
+    }
 
-					if (propertyType == typeof(string) && !HasAttributesOrElements(element))
-					{
-						// If the property is a string and the element is empty (no attributes
-						// or child elements) then we special case the object value to an empty string.
-						// This is necessary because while the String is a class it does not have
-						// a default constructor that creates an empty string, which is the behavior
-						// we are trying to simulate and would be expected from CreateObjectFromXml
-						createdObject = "";
-					}
-					else
-					{
-						// No value specified
-						Type defaultObjectType = null;
-						if (IsTypeConstructible(propertyType))
-						{
-							defaultObjectType = propertyType;
-						}
+    /// <summary>
+    /// Test if an element has no attributes or child elements
+    /// </summary>
+    /// <param name="element">the element to inspect</param>
+    /// <returns><c>true</c> if the element has any attributes or child elements, <c>false</c> otherwise</returns>
+    private bool HasAttributesOrElements(XmlElement element)
+    {
+      foreach (XmlNode node in element.ChildNodes)
+      {
+        if (node.NodeType == XmlNodeType.Attribute || node.NodeType == XmlNodeType.Element)
+        {
+          return true;
+        }
+      }
+      return false;
+    }
 
-						createdObject = CreateObjectFromXml(element, defaultObjectType, propertyType);
-					}
-
-					if (createdObject == null)
-					{
-						LogLog.Error(declaringType, "Failed to create object to set param: "+name);
-					}
-					else
-					{
-						if (propInfo != null)
-						{
-							// Got a converted result
-							LogLog.Debug(declaringType, "Setting Property ["+ propInfo.Name +"] to object ["+ createdObject +"]");
-
-							try
-							{
-								// Pass to the property
-#if NETSTANDARD1_3 // TODO BindingFlags is available for netstandard1.5
-								propInfo.SetValue(target, createdObject, null);
-#else
-								propInfo.SetValue(target, createdObject, BindingFlags.SetProperty, null, null, CultureInfo.InvariantCulture);
-#endif
-							}
-							catch(TargetInvocationException targetInvocationEx)
-							{
-								LogLog.Error(declaringType, "Failed to set parameter [" + propInfo.Name + "] on object [" + target + "] using value [" + createdObject + "]", targetInvocationEx.InnerException);
-							}
-						}
-						else if (methInfo != null)
-						{
-							// Got a converted result
-							LogLog.Debug(declaringType, "Setting Collection Property ["+ methInfo.Name +"] to object ["+ createdObject +"]");
-
-							try
-							{
-								// Pass to the property
-#if NETSTANDARD1_3 // TODO BindingFlags is available for netstandard1.5
-								methInfo.Invoke(target, new[] { createdObject });
-#else
-								methInfo.Invoke(target, BindingFlags.InvokeMethod, null, new object[] {createdObject}, CultureInfo.InvariantCulture);
-#endif
-							}
-							catch(TargetInvocationException targetInvocationEx)
-							{
-								LogLog.Error(declaringType, "Failed to set parameter [" + methInfo.Name + "] on object [" + target + "] using value [" + createdObject + "]", targetInvocationEx.InnerException);
-							}
-						}
-					}
-				}
-			}
-		}
-
-		/// <summary>
-		/// Test if an element has no attributes or child elements
-		/// </summary>
-		/// <param name="element">the element to inspect</param>
-		/// <returns><c>true</c> if the element has any attributes or child elements, <c>false</c> otherwise</returns>
-		private bool HasAttributesOrElements(XmlElement element)
-		{
-			foreach(XmlNode node in element.ChildNodes)
-			{
-				if (node.NodeType == XmlNodeType.Attribute || node.NodeType == XmlNodeType.Element)
-				{
-					return true;
-				}
-			}
-			return false;
-		}
-
-		/// <summary>
-		/// Test if a <see cref="Type"/> is constructible with <c>Activator.CreateInstance</c>.
-		/// </summary>
-		/// <param name="type">the type to inspect</param>
-		/// <returns><c>true</c> if the type is creatable using a default constructor, <c>false</c> otherwise</returns>
-		private static bool IsTypeConstructible(Type type)
-		{
+    /// <summary>
+    /// Test if a <see cref="Type"/> is constructible with <c>Activator.CreateInstance</c>.
+    /// </summary>
+    /// <param name="type">the type to inspect</param>
+    /// <returns><c>true</c> if the type is creatable using a default constructor, <c>false</c> otherwise</returns>
+    private static bool IsTypeConstructible(Type type)
+    {
 #if NETSTANDARD1_3
-			TypeInfo typeInfo = type.GetTypeInfo();
-			if (typeInfo.IsClass && !typeInfo.IsAbstract)
+      TypeInfo typeInfo = type.GetTypeInfo();
+      if (typeInfo.IsClass && !typeInfo.IsAbstract)
 #else
-			if (type.IsClass && !type.IsAbstract)
+      if (type.IsClass && !type.IsAbstract)
 #endif
-			{
-				ConstructorInfo defaultConstructor = type.GetConstructor(new Type[0]);
-				if (defaultConstructor != null && !defaultConstructor.IsAbstract && !defaultConstructor.IsPrivate)
-				{
-					return true;
-				}
-			}
-			return false;
-		}
+      {
+        ConstructorInfo defaultConstructor = type.GetConstructor(new Type[0]);
+        if (defaultConstructor != null && !defaultConstructor.IsAbstract && !defaultConstructor.IsPrivate)
+        {
+          return true;
+        }
+      }
+      return false;
+    }
 
-		/// <summary>
-		/// Look for a method on the <paramref name="targetType"/> that matches the <paramref name="name"/> supplied
-		/// </summary>
-		/// <param name="targetType">the type that has the method</param>
-		/// <param name="name">the name of the method</param>
-		/// <returns>the method info found</returns>
-		/// <remarks>
-		/// <para>
-		/// The method must be a public instance method on the <paramref name="targetType"/>.
-		/// The method must be named <paramref name="name"/> or "Add" followed by <paramref name="name"/>.
-		/// The method must take a single parameter.
-		/// </para>
-		/// </remarks>
-		private MethodInfo FindMethodInfo(Type targetType, string name)
-		{
-			string requiredMethodNameA = name;
-			string requiredMethodNameB = "Add" + name;
+    /// <summary>
+    /// Look for a method on the <paramref name="targetType"/> that matches the <paramref name="name"/> supplied
+    /// </summary>
+    /// <param name="targetType">the type that has the method</param>
+    /// <param name="name">the name of the method</param>
+    /// <returns>the method info found</returns>
+    /// <remarks>
+    /// <para>
+    /// The method must be a public instance method on the <paramref name="targetType"/>.
+    /// The method must be named <paramref name="name"/> or "Add" followed by <paramref name="name"/>.
+    /// The method must take a single parameter.
+    /// </para>
+    /// </remarks>
+    private MethodInfo FindMethodInfo(Type targetType, string name)
+    {
+      string requiredMethodNameA = name;
+      string requiredMethodNameB = "Add" + name;
 
-			MethodInfo[] methods = targetType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
+      MethodInfo[] methods = targetType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
 
-			foreach(MethodInfo methInfo in methods)
-			{
-				if (!methInfo.IsStatic)
-				{
-					string methodInfoName = methInfo.Name;
+      foreach (MethodInfo methInfo in methods)
+      {
+        if (!methInfo.IsStatic)
+        {
+          string methodInfoName = methInfo.Name;
 
-					if (SystemInfo.EqualsIgnoringCase(methodInfoName, requiredMethodNameA) ||
-					    SystemInfo.EqualsIgnoringCase(methodInfoName, requiredMethodNameB))
-					{
-						// Found matching method name
+          if (SystemInfo.EqualsIgnoringCase(methodInfoName, requiredMethodNameA) ||
+              SystemInfo.EqualsIgnoringCase(methodInfoName, requiredMethodNameB))
+          {
+            // Found matching method name
 
-						// Look for version with one arg only
-						System.Reflection.ParameterInfo[] methParams = methInfo.GetParameters();
-						if (methParams.Length == 1)
-						{
-							return methInfo;
-						}
-					}
-				}
-			}
-			return null;
-		}
+            // Look for version with one arg only
+            System.Reflection.ParameterInfo[] methParams = methInfo.GetParameters();
+            if (methParams.Length == 1)
+            {
+              return methInfo;
+            }
+          }
+        }
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Converts a string value to a target type.
-		/// </summary>
-		/// <param name="type">The type of object to convert the string to.</param>
-		/// <param name="value">The string value to use as the value of the object.</param>
-		/// <returns>
-		/// <para>
-		/// An object of type <paramref name="type"/> with value <paramref name="value"/> or 
-		/// <c>null</c> when the conversion could not be performed.
-		/// </para>
-		/// </returns>
-		protected object ConvertStringTo(Type type, string value)
-		{
-			// Hack to allow use of Level in property
-			if (typeof(Level) == type)
-			{
-				// Property wants a level
-				Level levelValue = m_hierarchy.LevelMap[value];
+    /// <summary>
+    /// Converts a string value to a target type.
+    /// </summary>
+    /// <param name="type">The type of object to convert the string to.</param>
+    /// <param name="value">The string value to use as the value of the object.</param>
+    /// <returns>
+    /// <para>
+    /// An object of type <paramref name="type"/> with value <paramref name="value"/> or 
+    /// <c>null</c> when the conversion could not be performed.
+    /// </para>
+    /// </returns>
+    protected object ConvertStringTo(Type type, string value)
+    {
+      // Hack to allow use of Level in property
+      if (typeof(Level) == type)
+      {
+        // Property wants a level
+        Level levelValue = m_hierarchy.LevelMap[value];
 
-				if (levelValue == null)
-				{
-					LogLog.Error(declaringType, "XmlHierarchyConfigurator: Unknown Level Specified ["+ value +"]");
-				}
+        if (levelValue == null)
+        {
+          LogLog.Error(declaringType, "XmlHierarchyConfigurator: Unknown Level Specified [" + value + "]");
+        }
 
-				return levelValue;
-			}
-			return OptionConverter.ConvertStringTo(type, value);
-		}
+        return levelValue;
+      }
+      return OptionConverter.ConvertStringTo(type, value);
+    }
 
-		/// <summary>
-		/// Creates an object as specified in XML.
-		/// </summary>
-		/// <param name="element">The XML element that contains the definition of the object.</param>
-		/// <param name="defaultTargetType">The object type to use if not explicitly specified.</param>
-		/// <param name="typeConstraint">The type that the returned object must be or must inherit from.</param>
-		/// <returns>The object or <c>null</c></returns>
-		/// <remarks>
-		/// <para>
-		/// Parse an XML element and create an object instance based on the configuration
-		/// data.
-		/// </para>
-		/// <para>
-		/// The type of the instance may be specified in the XML. If not
-		/// specified then the <paramref name="defaultTargetType"/> is used
-		/// as the type. However the type is specified it must support the
-		/// <paramref name="typeConstraint"/> type.
-		/// </para>
-		/// </remarks>
-		protected object CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint) 
-		{
-			Type objectType = null;
+    /// <summary>
+    /// Creates an object as specified in XML.
+    /// </summary>
+    /// <param name="element">The XML element that contains the definition of the object.</param>
+    /// <param name="defaultTargetType">The object type to use if not explicitly specified.</param>
+    /// <param name="typeConstraint">The type that the returned object must be or must inherit from.</param>
+    /// <returns>The object or <c>null</c></returns>
+    /// <remarks>
+    /// <para>
+    /// Parse an XML element and create an object instance based on the configuration
+    /// data.
+    /// </para>
+    /// <para>
+    /// The type of the instance may be specified in the XML. If not
+    /// specified then the <paramref name="defaultTargetType"/> is used
+    /// as the type. However the type is specified it must support the
+    /// <paramref name="typeConstraint"/> type.
+    /// </para>
+    /// </remarks>
+    protected object CreateObjectFromXml(XmlElement element, Type defaultTargetType, Type typeConstraint)
+    {
+      Type objectType = null;
 
-			// Get the object type
-			string objectTypeString = element.GetAttribute(TYPE_ATTR);
-			if (objectTypeString == null || objectTypeString.Length == 0)
-			{
-				if (defaultTargetType == null)
-				{
-					LogLog.Error(declaringType, "Object type not specified. Cannot create object of type ["+typeConstraint.FullName+"]. Missing Value or Type.");
-					return null;
-				}
-				else
-				{
-					// Use the default object type
-					objectType = defaultTargetType;
-				}
-			}
-			else
-			{
-				// Read the explicit object type
-				try
-				{
+      // Get the object type
+      string objectTypeString = element.GetAttribute(TYPE_ATTR);
+      if (objectTypeString == null || objectTypeString.Length == 0)
+      {
+        if (defaultTargetType == null)
+        {
+          LogLog.Error(declaringType, "Object type not specified. Cannot create object of type [" + typeConstraint.FullName + "]. Missing Value or Type.");
+          return null;
+        }
+        else
+        {
+          // Use the default object type
+          objectType = defaultTargetType;
+        }
+      }
+      else
+      {
+        // Read the explicit object type
+        try
+        {
 #if NETSTANDARD1_3
-					objectType = SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, objectTypeString, true, true);
+          objectType = SystemInfo.GetTypeFromString(this.GetType().GetTypeInfo().Assembly, objectTypeString, true, true);
 #else
-					objectType = SystemInfo.GetTypeFromString(objectTypeString, true, true);
+          objectType = SystemInfo.GetTypeFromString(objectTypeString, true, true);
 #endif
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Failed to find type ["+objectTypeString+"]", ex);
-					return null;
-				}
-			}
+        }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Failed to find type [" + objectTypeString + "]", ex);
+          return null;
+        }
+      }
 
-			bool requiresConversion = false;
+      bool requiresConversion = false;
 
-			// Got the object type. Check that it meets the typeConstraint
-			if (typeConstraint != null)
-			{
-				if (!typeConstraint.IsAssignableFrom(objectType))
-				{
-					// Check if there is an appropriate type converter
-					if (OptionConverter.CanConvertTypeTo(objectType, typeConstraint))
-					{
-						requiresConversion = true;
-					}
-					else
-					{
-						LogLog.Error(declaringType, "Object type ["+objectType.FullName+"] is not assignable to type ["+typeConstraint.FullName+"]. There are no acceptable type conversions.");
-						return null;
-					}
-				}
-			}
+      // Got the object type. Check that it meets the typeConstraint
+      if (typeConstraint != null)
+      {
+        if (!typeConstraint.IsAssignableFrom(objectType))
+        {
+          // Check if there is an appropriate type converter
+          if (OptionConverter.CanConvertTypeTo(objectType, typeConstraint))
+          {
+            requiresConversion = true;
+          }
+          else
+          {
+            LogLog.Error(declaringType, "Object type [" + objectType.FullName + "] is not assignable to type [" + typeConstraint.FullName + "]. There are no acceptable type conversions.");
+            return null;
+          }
+        }
+      }
 
-			// Create using the default constructor
-			object createdObject = null;
-			try
-			{
-				createdObject = Activator.CreateInstance(objectType);
-			}
-			catch(Exception createInstanceEx)
-			{
-				LogLog.Error(declaringType, "XmlHierarchyConfigurator: Failed to construct object of type [" + objectType.FullName + "] Exception: "+createInstanceEx.ToString());
-			}
+      // Create using the default constructor
+      object createdObject = null;
+      try
+      {
+        createdObject = Activator.CreateInstance(objectType);
+      }
+      catch (Exception createInstanceEx)
+      {
+        LogLog.Error(declaringType, "XmlHierarchyConfigurator: Failed to construct object of type [" + objectType.FullName + "] Exception: " + createInstanceEx.ToString());
+      }
 
-			// Set any params on object
-			foreach (XmlNode currentNode in element.ChildNodes)
-			{
-				if (currentNode.NodeType == XmlNodeType.Element) 
-				{
-					SetParameter((XmlElement)currentNode, createdObject);
-				}
-			}
+      // Set any params on object
+      foreach (XmlNode currentNode in element.ChildNodes)
+      {
+        if (currentNode.NodeType == XmlNodeType.Element)
+        {
+          SetParameter((XmlElement)currentNode, createdObject);
+        }
+      }
 
-			// Check if we need to call ActivateOptions
-			IOptionHandler optionHandler = createdObject as IOptionHandler;
-			if (optionHandler != null)
-			{
-				optionHandler.ActivateOptions();
-			}
+      // Check if we need to call ActivateOptions
+      IOptionHandler optionHandler = createdObject as IOptionHandler;
+      if (optionHandler != null)
+      {
+        optionHandler.ActivateOptions();
+      }
 
-			// Ok object should be initialized
+      // Ok object should be initialized
 
-			if (requiresConversion)
-			{
-				// Convert the object type
-				return OptionConverter.ConvertTypeTo(createdObject, typeConstraint);
-			}
-			else
-			{
-				// The object is of the correct type
-				return createdObject;
-			}
-		}
+      if (requiresConversion)
+      {
+        // Convert the object type
+        return OptionConverter.ConvertTypeTo(createdObject, typeConstraint);
+      }
+      else
+      {
+        // The object is of the correct type
+        return createdObject;
+      }
+    }
 
-		#endregion Protected Instance Methods
+    #endregion Protected Instance Methods
 
 #if !NETCF && !NETSTANDARD1_3 // NETSTANDARD1_3: System.Runtime.InteropServices.RuntimeInformation not available on desktop 4.6
-		private bool HasCaseInsensitiveEnvironment
-	        {
-		    get
-		    {
+    private bool HasCaseInsensitiveEnvironment
+    {
+      get
+      {
 #if NET_1_0 || NET_1_1 || CLI_1_0
-			// actually there is no guarantee, but we don't know better
-			return true;
+      // actually there is no guarantee, but we don't know better
+      return true;
 #elif MONO_1_0
-			// see above
-			return false;
+      // see above
+      return false;
 #else
-			PlatformID platform = Environment.OSVersion.Platform;
-			return platform != PlatformID.Unix && platform != PlatformID.MacOSX;
+        PlatformID platform = Environment.OSVersion.Platform;
+        return platform != PlatformID.Unix && platform != PlatformID.MacOSX;
 #endif
-		    }
-		}
+      }
+    }
 
-	        private IDictionary CreateCaseInsensitiveWrapper(IDictionary dict)
-	        {
-		    if (dict == null)
-		    {
-			return dict;
-		    }
-		    Hashtable hash = SystemInfo.CreateCaseInsensitiveHashtable();
-		    foreach (DictionaryEntry entry in dict) {
-			hash[entry.Key] = entry.Value;
-		    }
-		    return hash;
-		}
+    private IDictionary CreateCaseInsensitiveWrapper(IDictionary dict)
+    {
+      if (dict == null)
+      {
+        return dict;
+      }
+      Hashtable hash = SystemInfo.CreateCaseInsensitiveHashtable();
+      foreach (DictionaryEntry entry in dict)
+      {
+        hash[entry.Key] = entry.Value;
+      }
+      return hash;
+    }
 #endif
 
-		#region Private Constants
+    #region Private Constants
 
-		// String constants used while parsing the XML data
-		private const string CONFIGURATION_TAG			= "log4net";
-		private const string RENDERER_TAG				= "renderer";
-		private const string APPENDER_TAG 				= "appender";
-		private const string APPENDER_REF_TAG 			= "appender-ref";  
-		private const string PARAM_TAG					= "param";
+    // String constants used while parsing the XML data
+    private const string CONFIGURATION_TAG = "log4net";
+    private const string RENDERER_TAG = "renderer";
+    private const string APPENDER_TAG = "appender";
+    private const string APPENDER_REF_TAG = "appender-ref";
+    private const string PARAM_TAG = "param";
 
-		// TODO: Deprecate use of category tags
-		private const string CATEGORY_TAG				= "category";
-		// TODO: Deprecate use of priority tag
-		private const string PRIORITY_TAG				= "priority";
+    // TODO: Deprecate use of category tags
+    private const string CATEGORY_TAG = "category";
+    // TODO: Deprecate use of priority tag
+    private const string PRIORITY_TAG = "priority";
 
-		private const string LOGGER_TAG					= "logger";
-		private const string NAME_ATTR					= "name";
-		private const string TYPE_ATTR					= "type";
-		private const string VALUE_ATTR					= "value";
-		private const string ROOT_TAG					= "root";
-		private const string LEVEL_TAG					= "level";
-		private const string REF_ATTR					= "ref";
-		private const string ADDITIVITY_ATTR			= "additivity";  
-		private const string THRESHOLD_ATTR				= "threshold";
-		private const string CONFIG_DEBUG_ATTR			= "configDebug";
-		private const string INTERNAL_DEBUG_ATTR		= "debug";
-		private const string EMIT_INTERNAL_DEBUG_ATTR   = "emitDebug";
-		private const string CONFIG_UPDATE_MODE_ATTR	= "update";
-		private const string RENDERING_TYPE_ATTR		= "renderingClass";
-		private const string RENDERED_TYPE_ATTR			= "renderedClass";
+    private const string LOGGER_TAG = "logger";
+    private const string NAME_ATTR = "name";
+    private const string TYPE_ATTR = "type";
+    private const string VALUE_ATTR = "value";
+    private const string ROOT_TAG = "root";
+    private const string LEVEL_TAG = "level";
+    private const string REF_ATTR = "ref";
+    private const string ADDITIVITY_ATTR = "additivity";
+    private const string THRESHOLD_ATTR = "threshold";
+    private const string CONFIG_DEBUG_ATTR = "configDebug";
+    private const string INTERNAL_DEBUG_ATTR = "debug";
+    private const string EMIT_INTERNAL_DEBUG_ATTR = "emitDebug";
+    private const string CONFIG_UPDATE_MODE_ATTR = "update";
+    private const string RENDERING_TYPE_ATTR = "renderingClass";
+    private const string RENDERED_TYPE_ATTR = "renderedClass";
 
-		// flag used on the level element
-		private const string INHERITED = "inherited";
+    // flag used on the level element
+    private const string INHERITED = "inherited";
 
-		#endregion Private Constants
+    #endregion Private Constants
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// key: appenderName, value: appender.
-		/// </summary>
-		private Hashtable m_appenderBag;
+    /// <summary>
+    /// key: appenderName, value: appender.
+    /// </summary>
+    private Hashtable m_appenderBag;
 
-		/// <summary>
-		/// The Hierarchy being configured.
-		/// </summary>
-		private readonly Hierarchy m_hierarchy;
+    /// <summary>
+    /// The Hierarchy being configured.
+    /// </summary>
+    private readonly Hierarchy m_hierarchy;
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the XmlHierarchyConfigurator class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(XmlHierarchyConfigurator);
+    /// <summary>
+    /// The fully qualified type of the XmlHierarchyConfigurator class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(XmlHierarchyConfigurator);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Repository/IBasicRepositoryConfigurator.cs b/src/log4net/Repository/IBasicRepositoryConfigurator.cs
index 7fdbb70..a0bfb2f 100644
--- a/src/log4net/Repository/IBasicRepositoryConfigurator.cs
+++ b/src/log4net/Repository/IBasicRepositoryConfigurator.cs
@@ -19,45 +19,45 @@
 
 namespace log4net.Repository
 {
-	/// <summary>
-	/// Basic Configurator interface for repositories
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface used by basic configurator to configure a <see cref="ILoggerRepository"/>
-	/// with a default <see cref="log4net.Appender.IAppender"/>.
-	/// </para>
-	/// <para>
-	/// A <see cref="ILoggerRepository"/> should implement this interface to support
-	/// configuration by the <see cref="log4net.Config.BasicConfigurator"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IBasicRepositoryConfigurator
-	{
-		/// <summary>
-		/// Initialize the repository using the specified appender
-		/// </summary>
-		/// <param name="appender">the appender to use to log all logging events</param>
-		/// <remarks>
-		/// <para>
-		/// Configure the repository to route all logging events to the
-		/// specified appender.
-		/// </para>
-		/// </remarks>
-        void Configure(Appender.IAppender appender);
+  /// <summary>
+  /// Basic Configurator interface for repositories
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface used by basic configurator to configure a <see cref="ILoggerRepository"/>
+  /// with a default <see cref="log4net.Appender.IAppender"/>.
+  /// </para>
+  /// <para>
+  /// A <see cref="ILoggerRepository"/> should implement this interface to support
+  /// configuration by the <see cref="log4net.Config.BasicConfigurator"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IBasicRepositoryConfigurator
+  {
+    /// <summary>
+    /// Initialize the repository using the specified appender
+    /// </summary>
+    /// <param name="appender">the appender to use to log all logging events</param>
+    /// <remarks>
+    /// <para>
+    /// Configure the repository to route all logging events to the
+    /// specified appender.
+    /// </para>
+    /// </remarks>
+    void Configure(Appender.IAppender appender);
 
-        /// <summary>
-        /// Initialize the repository using the specified appenders
-        /// </summary>
-        /// <param name="appenders">the appenders to use to log all logging events</param>
-        /// <remarks>
-        /// <para>
-        /// Configure the repository to route all logging events to the
-        /// specified appenders.
-        /// </para>
-        /// </remarks>
-        void Configure(params Appender.IAppender[] appenders);
-	}
+    /// <summary>
+    /// Initialize the repository using the specified appenders
+    /// </summary>
+    /// <param name="appenders">the appenders to use to log all logging events</param>
+    /// <remarks>
+    /// <para>
+    /// Configure the repository to route all logging events to the
+    /// specified appenders.
+    /// </para>
+    /// </remarks>
+    void Configure(params Appender.IAppender[] appenders);
+  }
 }
diff --git a/src/log4net/Repository/ILoggerRepository.cs b/src/log4net/Repository/ILoggerRepository.cs
index 30ef5b3..29d64ea 100644
--- a/src/log4net/Repository/ILoggerRepository.cs
+++ b/src/log4net/Repository/ILoggerRepository.cs
@@ -28,322 +28,322 @@
 
 namespace log4net.Repository
 {
-	#region LoggerRepositoryShutdownEvent
+  #region LoggerRepositoryShutdownEvent
 
-	/// <summary>
-	/// Delegate used to handle logger repository shutdown event notifications
-	/// </summary>
-	/// <param name="sender">The <see cref="ILoggerRepository"/> that is shutting down.</param>
-	/// <param name="e">Empty event args</param>
-	/// <remarks>
-	/// <para>
-	/// Delegate used to handle logger repository shutdown event notifications.
-	/// </para>
-	/// </remarks>
-	public delegate void LoggerRepositoryShutdownEventHandler(object sender, EventArgs e);
+  /// <summary>
+  /// Delegate used to handle logger repository shutdown event notifications
+  /// </summary>
+  /// <param name="sender">The <see cref="ILoggerRepository"/> that is shutting down.</param>
+  /// <param name="e">Empty event args</param>
+  /// <remarks>
+  /// <para>
+  /// Delegate used to handle logger repository shutdown event notifications.
+  /// </para>
+  /// </remarks>
+  public delegate void LoggerRepositoryShutdownEventHandler(object sender, EventArgs e);
 
-	#endregion
+  #endregion
 
-	#region LoggerRepositoryConfigurationResetEventHandler
+  #region LoggerRepositoryConfigurationResetEventHandler
 
-	/// <summary>
-	/// Delegate used to handle logger repository configuration reset event notifications
-	/// </summary>
-	/// <param name="sender">The <see cref="ILoggerRepository"/> that has had its configuration reset.</param>
-	/// <param name="e">Empty event args</param>
-	/// <remarks>
-	/// <para>
-	/// Delegate used to handle logger repository configuration reset event notifications.
-	/// </para>
-	/// </remarks>
-	public delegate void LoggerRepositoryConfigurationResetEventHandler(object sender, EventArgs e);
+  /// <summary>
+  /// Delegate used to handle logger repository configuration reset event notifications
+  /// </summary>
+  /// <param name="sender">The <see cref="ILoggerRepository"/> that has had its configuration reset.</param>
+  /// <param name="e">Empty event args</param>
+  /// <remarks>
+  /// <para>
+  /// Delegate used to handle logger repository configuration reset event notifications.
+  /// </para>
+  /// </remarks>
+  public delegate void LoggerRepositoryConfigurationResetEventHandler(object sender, EventArgs e);
 
-	#endregion
+  #endregion
 
-	#region LoggerRepositoryConfigurationChangedEventHandler
+  #region LoggerRepositoryConfigurationChangedEventHandler
 
-	/// <summary>
-	/// Delegate used to handle event notifications for logger repository configuration changes.
-	/// </summary>
-	/// <param name="sender">The <see cref="ILoggerRepository"/> that has had its configuration changed.</param>
-	/// <param name="e">Empty event arguments.</param>
-	/// <remarks>
-	/// <para>
-	/// Delegate used to handle event notifications for logger repository configuration changes.
-	/// </para>
-	/// </remarks>
-	public delegate void LoggerRepositoryConfigurationChangedEventHandler(object sender, EventArgs e);
+  /// <summary>
+  /// Delegate used to handle event notifications for logger repository configuration changes.
+  /// </summary>
+  /// <param name="sender">The <see cref="ILoggerRepository"/> that has had its configuration changed.</param>
+  /// <param name="e">Empty event arguments.</param>
+  /// <remarks>
+  /// <para>
+  /// Delegate used to handle event notifications for logger repository configuration changes.
+  /// </para>
+  /// </remarks>
+  public delegate void LoggerRepositoryConfigurationChangedEventHandler(object sender, EventArgs e);
 
-    #endregion
-	
-	/// <summary>
-	/// Interface implemented by logger repositories.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This interface is implemented by logger repositories. e.g. 
-	/// <see cref="Hierarchy"/>.
-	/// </para>
-	/// <para>
-	/// This interface is used by the <see cref="LogManager"/>
-	/// to obtain <see cref="ILog"/> interfaces.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface ILoggerRepository
-	{
-		/// <summary>
-		/// The name of the repository
-		/// </summary>
-		/// <value>
-		/// The name of the repository
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of the repository.
-		/// </para>
-		/// </remarks>
-		string Name { get; set; }
+  #endregion
 
-		/// <summary>
-		/// RendererMap accesses the object renderer map for this repository.
-		/// </summary>
-		/// <value>
-		/// RendererMap accesses the object renderer map for this repository.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// RendererMap accesses the object renderer map for this repository.
-		/// </para>
-		/// <para>
-		/// The RendererMap holds a mapping between types and
-		/// <see cref="IObjectRenderer"/> objects.
-		/// </para>
-		/// </remarks>
-		RendererMap RendererMap { get; }
+  /// <summary>
+  /// Interface implemented by logger repositories.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This interface is implemented by logger repositories. e.g. 
+  /// <see cref="Hierarchy"/>.
+  /// </para>
+  /// <para>
+  /// This interface is used by the <see cref="LogManager"/>
+  /// to obtain <see cref="ILog"/> interfaces.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface ILoggerRepository
+  {
+    /// <summary>
+    /// The name of the repository
+    /// </summary>
+    /// <value>
+    /// The name of the repository
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of the repository.
+    /// </para>
+    /// </remarks>
+    string Name { get; set; }
 
-		/// <summary>
-		/// The plugin map for this repository.
-		/// </summary>
-		/// <value>
-		/// The plugin map for this repository.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The plugin map holds the <see cref="IPlugin"/> instances
-		/// that have been attached to this repository.
-		/// </para>
-		/// </remarks>
-		PluginMap PluginMap { get; }
+    /// <summary>
+    /// RendererMap accesses the object renderer map for this repository.
+    /// </summary>
+    /// <value>
+    /// RendererMap accesses the object renderer map for this repository.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// RendererMap accesses the object renderer map for this repository.
+    /// </para>
+    /// <para>
+    /// The RendererMap holds a mapping between types and
+    /// <see cref="IObjectRenderer"/> objects.
+    /// </para>
+    /// </remarks>
+    RendererMap RendererMap { get; }
 
-		/// <summary>
-		/// Get the level map for the Repository.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Get the level map for the Repository.
-		/// </para>
-		/// <para>
-		/// The level map defines the mappings between
-		/// level names and <see cref="Level"/> objects in
-		/// this repository.
-		/// </para>
-		/// </remarks>
-		LevelMap LevelMap { get; }
+    /// <summary>
+    /// The plugin map for this repository.
+    /// </summary>
+    /// <value>
+    /// The plugin map for this repository.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The plugin map holds the <see cref="IPlugin"/> instances
+    /// that have been attached to this repository.
+    /// </para>
+    /// </remarks>
+    PluginMap PluginMap { get; }
 
-		/// <summary>
-		/// The threshold for all events in this repository
-		/// </summary>
-		/// <value>
-		/// The threshold for all events in this repository
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The threshold for all events in this repository.
-		/// </para>
-		/// </remarks>
-		Level Threshold { get; set; }
+    /// <summary>
+    /// Get the level map for the Repository.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Get the level map for the Repository.
+    /// </para>
+    /// <para>
+    /// The level map defines the mappings between
+    /// level names and <see cref="Level"/> objects in
+    /// this repository.
+    /// </para>
+    /// </remarks>
+    LevelMap LevelMap { get; }
 
-		/// <summary>
-		/// Check if the named logger exists in the repository. If so return
-		/// its reference, otherwise returns <c>null</c>.
-		/// </summary>
-		/// <param name="name">The name of the logger to lookup</param>
-		/// <returns>The Logger object with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// If the names logger exists it is returned, otherwise
-		/// <c>null</c> is returned.
-		/// </para>
-		/// </remarks>
-		ILogger Exists(string name);
+    /// <summary>
+    /// The threshold for all events in this repository
+    /// </summary>
+    /// <value>
+    /// The threshold for all events in this repository
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The threshold for all events in this repository.
+    /// </para>
+    /// </remarks>
+    Level Threshold { get; set; }
 
-		/// <summary>
-		/// Returns all the currently defined loggers as an Array.
-		/// </summary>
-		/// <returns>All the defined loggers</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns all the currently defined loggers as an Array.
-		/// </para>
-		/// </remarks>
-		ILogger[] GetCurrentLoggers();
+    /// <summary>
+    /// Check if the named logger exists in the repository. If so return
+    /// its reference, otherwise returns <c>null</c>.
+    /// </summary>
+    /// <param name="name">The name of the logger to lookup</param>
+    /// <returns>The Logger object with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// If the names logger exists it is returned, otherwise
+    /// <c>null</c> is returned.
+    /// </para>
+    /// </remarks>
+    ILogger Exists(string name);
 
-		/// <summary>
-		/// Returns a named logger instance
-		/// </summary>
-		/// <param name="name">The name of the logger to retrieve</param>
-		/// <returns>The logger object with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns a named logger instance.
-		/// </para>
-		/// <para>
-		/// If a logger of that name already exists, then it will be
-		/// returned.  Otherwise, a new logger will be instantiated and
-		/// then linked with its existing ancestors as well as children.
-		/// </para>
-		/// </remarks>
-		ILogger GetLogger(string name);
+    /// <summary>
+    /// Returns all the currently defined loggers as an Array.
+    /// </summary>
+    /// <returns>All the defined loggers</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns all the currently defined loggers as an Array.
+    /// </para>
+    /// </remarks>
+    ILogger[] GetCurrentLoggers();
 
-		/// <summary>Shutdown the repository</summary>
-		/// <remarks>
-		/// <para>
-		/// Shutting down a repository will <i>safely</i> close and remove
-		/// all appenders in all loggers including the root logger.
-		/// </para>
-		/// <para>
-		/// Some appenders need to be closed before the
-		/// application exists. Otherwise, pending logging events might be
-		/// lost.
-		/// </para>
-		/// <para>
-		/// The <see cref="M:Shutdown()"/> method is careful to close nested
-		/// appenders before closing regular appenders. This is allows
-		/// configurations where a regular appender is attached to a logger
-		/// and again to a nested appender.
-		/// </para>
-		/// </remarks>
-		void Shutdown();
+    /// <summary>
+    /// Returns a named logger instance
+    /// </summary>
+    /// <param name="name">The name of the logger to retrieve</param>
+    /// <returns>The logger object with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns a named logger instance.
+    /// </para>
+    /// <para>
+    /// If a logger of that name already exists, then it will be
+    /// returned.  Otherwise, a new logger will be instantiated and
+    /// then linked with its existing ancestors as well as children.
+    /// </para>
+    /// </remarks>
+    ILogger GetLogger(string name);
 
-		/// <summary>
-		/// Reset the repositories configuration to a default state
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Reset all values contained in this instance to their
-		/// default state.
-		/// </para>
-		/// <para>
-		/// Existing loggers are not removed. They are just reset.
-		/// </para>
-		/// <para>
-		/// This method should be used sparingly and with care as it will
-		/// block all logging until it is completed.
-		/// </para>
-		/// </remarks>
-		void ResetConfiguration();
+    /// <summary>Shutdown the repository</summary>
+    /// <remarks>
+    /// <para>
+    /// Shutting down a repository will <i>safely</i> close and remove
+    /// all appenders in all loggers including the root logger.
+    /// </para>
+    /// <para>
+    /// Some appenders need to be closed before the
+    /// application exists. Otherwise, pending logging events might be
+    /// lost.
+    /// </para>
+    /// <para>
+    /// The <see cref="M:Shutdown()"/> method is careful to close nested
+    /// appenders before closing regular appenders. This is allows
+    /// configurations where a regular appender is attached to a logger
+    /// and again to a nested appender.
+    /// </para>
+    /// </remarks>
+    void Shutdown();
 
-		/// <summary>
-		/// Log the <see cref="LoggingEvent"/> through this repository.
-		/// </summary>
-		/// <param name="logEvent">the event to log</param>
-		/// <remarks>
-		/// <para>
-		/// This method should not normally be used to log.
-		/// The <see cref="ILog"/> interface should be used 
-		/// for routine logging. This interface can be obtained
-		/// using the <see cref="M:log4net.LogManager.GetLogger(string)"/> method.
-		/// </para>
-		/// <para>
-		/// The <c>logEvent</c> is delivered to the appropriate logger and
-		/// that logger is then responsible for logging the event.
-		/// </para>
-		/// </remarks>
-		void Log(LoggingEvent logEvent);
+    /// <summary>
+    /// Reset the repositories configuration to a default state
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Reset all values contained in this instance to their
+    /// default state.
+    /// </para>
+    /// <para>
+    /// Existing loggers are not removed. They are just reset.
+    /// </para>
+    /// <para>
+    /// This method should be used sparingly and with care as it will
+    /// block all logging until it is completed.
+    /// </para>
+    /// </remarks>
+    void ResetConfiguration();
 
-		/// <summary>
-		/// Flag indicates if this repository has been configured.
-		/// </summary>
-		/// <value>
-		/// Flag indicates if this repository has been configured.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Flag indicates if this repository has been configured.
-		/// </para>
-		/// </remarks>
-		bool Configured { get; set; }
+    /// <summary>
+    /// Log the <see cref="LoggingEvent"/> through this repository.
+    /// </summary>
+    /// <param name="logEvent">the event to log</param>
+    /// <remarks>
+    /// <para>
+    /// This method should not normally be used to log.
+    /// The <see cref="ILog"/> interface should be used 
+    /// for routine logging. This interface can be obtained
+    /// using the <see cref="M:log4net.LogManager.GetLogger(string)"/> method.
+    /// </para>
+    /// <para>
+    /// The <c>logEvent</c> is delivered to the appropriate logger and
+    /// that logger is then responsible for logging the event.
+    /// </para>
+    /// </remarks>
+    void Log(LoggingEvent logEvent);
 
-        /// <summary>
-        /// Collection of internal messages captured during the most 
-        /// recent configuration process.
-        /// </summary>
-        ICollection ConfigurationMessages { get; set; }
+    /// <summary>
+    /// Flag indicates if this repository has been configured.
+    /// </summary>
+    /// <value>
+    /// Flag indicates if this repository has been configured.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Flag indicates if this repository has been configured.
+    /// </para>
+    /// </remarks>
+    bool Configured { get; set; }
 
-		/// <summary>
-		/// Event to notify that the repository has been shutdown.
-		/// </summary>
-		/// <value>
-		/// Event to notify that the repository has been shutdown.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when the repository has been shutdown.
-		/// </para>
-		/// </remarks>
-		event LoggerRepositoryShutdownEventHandler ShutdownEvent;
+    /// <summary>
+    /// Collection of internal messages captured during the most 
+    /// recent configuration process.
+    /// </summary>
+    ICollection ConfigurationMessages { get; set; }
 
-		/// <summary>
-		/// Event to notify that the repository has had its configuration reset.
-		/// </summary>
-		/// <value>
-		/// Event to notify that the repository has had its configuration reset.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when the repository's configuration has been
-		/// reset to default.
-		/// </para>
-		/// </remarks>
-		event LoggerRepositoryConfigurationResetEventHandler ConfigurationReset;
+    /// <summary>
+    /// Event to notify that the repository has been shutdown.
+    /// </summary>
+    /// <value>
+    /// Event to notify that the repository has been shutdown.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when the repository has been shutdown.
+    /// </para>
+    /// </remarks>
+    event LoggerRepositoryShutdownEventHandler ShutdownEvent;
 
-		/// <summary>
-		/// Event to notify that the repository has had its configuration changed.
-		/// </summary>
-		/// <value>
-		/// Event to notify that the repository has had its configuration changed.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when the repository's configuration has been changed.
-		/// </para>
-		/// </remarks>
-		event LoggerRepositoryConfigurationChangedEventHandler ConfigurationChanged;
+    /// <summary>
+    /// Event to notify that the repository has had its configuration reset.
+    /// </summary>
+    /// <value>
+    /// Event to notify that the repository has had its configuration reset.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when the repository's configuration has been
+    /// reset to default.
+    /// </para>
+    /// </remarks>
+    event LoggerRepositoryConfigurationResetEventHandler ConfigurationReset;
 
-		/// <summary>
-		/// Repository specific properties
-		/// </summary>
-		/// <value>
-		/// Repository specific properties
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// These properties can be specified on a repository specific basis.
-		/// </para>
-		/// </remarks>
-		PropertiesDictionary Properties { get; }
+    /// <summary>
+    /// Event to notify that the repository has had its configuration changed.
+    /// </summary>
+    /// <value>
+    /// Event to notify that the repository has had its configuration changed.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when the repository's configuration has been changed.
+    /// </para>
+    /// </remarks>
+    event LoggerRepositoryConfigurationChangedEventHandler ConfigurationChanged;
 
-		/// <summary>
-		/// Returns all the Appenders that are configured as an Array.
-		/// </summary>
-		/// <returns>All the Appenders</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns all the Appenders that are configured as an Array.
-		/// </para>
-		/// </remarks>
-		log4net.Appender.IAppender[] GetAppenders();
-	}
+    /// <summary>
+    /// Repository specific properties
+    /// </summary>
+    /// <value>
+    /// Repository specific properties
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// These properties can be specified on a repository specific basis.
+    /// </para>
+    /// </remarks>
+    PropertiesDictionary Properties { get; }
+
+    /// <summary>
+    /// Returns all the Appenders that are configured as an Array.
+    /// </summary>
+    /// <returns>All the Appenders</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns all the Appenders that are configured as an Array.
+    /// </para>
+    /// </remarks>
+    log4net.Appender.IAppender[] GetAppenders();
+  }
 }
diff --git a/src/log4net/Repository/IXmlRepositoryConfigurator.cs b/src/log4net/Repository/IXmlRepositoryConfigurator.cs
index 6fd657c..ad16471 100644
--- a/src/log4net/Repository/IXmlRepositoryConfigurator.cs
+++ b/src/log4net/Repository/IXmlRepositoryConfigurator.cs
@@ -23,32 +23,32 @@
 
 namespace log4net.Repository
 {
-	/// <summary>
-	/// Configure repository using XML
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Interface used by Xml configurator to configure a <see cref="ILoggerRepository"/>.
-	/// </para>
-	/// <para>
-	/// A <see cref="ILoggerRepository"/> should implement this interface to support
-	/// configuration by the <see cref="log4net.Config.XmlConfigurator"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IXmlRepositoryConfigurator
-	{
-		/// <summary>
-		/// Initialize the repository using the specified config
-		/// </summary>
-		/// <param name="element">the element containing the root of the config</param>
-		/// <remarks>
-		/// <para>
-		/// The schema for the XML configuration data is defined by
-		/// the implementation.
-		/// </para>
-		/// </remarks>
-		void Configure(System.Xml.XmlElement element);
-	}
+  /// <summary>
+  /// Configure repository using XML
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Interface used by Xml configurator to configure a <see cref="ILoggerRepository"/>.
+  /// </para>
+  /// <para>
+  /// A <see cref="ILoggerRepository"/> should implement this interface to support
+  /// configuration by the <see cref="log4net.Config.XmlConfigurator"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IXmlRepositoryConfigurator
+  {
+    /// <summary>
+    /// Initialize the repository using the specified config
+    /// </summary>
+    /// <param name="element">the element containing the root of the config</param>
+    /// <remarks>
+    /// <para>
+    /// The schema for the XML configuration data is defined by
+    /// the implementation.
+    /// </para>
+    /// </remarks>
+    void Configure(System.Xml.XmlElement element);
+  }
 }
diff --git a/src/log4net/Repository/LoggerRepositorySkeleton.cs b/src/log4net/Repository/LoggerRepositorySkeleton.cs
index 9a2a69c..11afa00 100644
--- a/src/log4net/Repository/LoggerRepositorySkeleton.cs
+++ b/src/log4net/Repository/LoggerRepositorySkeleton.cs
@@ -27,606 +27,606 @@
 
 namespace log4net.Repository
 {
-	/// <summary>
-	/// Base implementation of <see cref="ILoggerRepository"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Default abstract implementation of the <see cref="ILoggerRepository"/> interface.
-	/// </para>
-	/// <para>
-	/// Skeleton implementation of the <see cref="ILoggerRepository"/> interface.
-	/// All <see cref="ILoggerRepository"/> types can extend this type.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class LoggerRepositorySkeleton : ILoggerRepository, Appender.IFlushable
-	{
-		#region Member Variables
+  /// <summary>
+  /// Base implementation of <see cref="ILoggerRepository"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Default abstract implementation of the <see cref="ILoggerRepository"/> interface.
+  /// </para>
+  /// <para>
+  /// Skeleton implementation of the <see cref="ILoggerRepository"/> interface.
+  /// All <see cref="ILoggerRepository"/> types can extend this type.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class LoggerRepositorySkeleton : ILoggerRepository, Appender.IFlushable
+  {
+    #region Member Variables
 
-		private string m_name;
-		private RendererMap m_rendererMap;
-		private PluginMap m_pluginMap;
-		private LevelMap m_levelMap;
-		private Level m_threshold;
-		private bool m_configured;
-        private ICollection m_configurationMessages;
-		private event LoggerRepositoryShutdownEventHandler m_shutdownEvent;
-		private event LoggerRepositoryConfigurationResetEventHandler m_configurationResetEvent;
-		private event LoggerRepositoryConfigurationChangedEventHandler m_configurationChangedEvent;
-		private PropertiesDictionary m_properties;
+    private string m_name;
+    private RendererMap m_rendererMap;
+    private PluginMap m_pluginMap;
+    private LevelMap m_levelMap;
+    private Level m_threshold;
+    private bool m_configured;
+    private ICollection m_configurationMessages;
+    private event LoggerRepositoryShutdownEventHandler m_shutdownEvent;
+    private event LoggerRepositoryConfigurationResetEventHandler m_configurationResetEvent;
+    private event LoggerRepositoryConfigurationChangedEventHandler m_configurationChangedEvent;
+    private PropertiesDictionary m_properties;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes the repository with default (empty) properties.
-		/// </para>
-		/// </remarks>
-		protected LoggerRepositorySkeleton() : this(new PropertiesDictionary())
-		{
-		}
+    /// <summary>
+    /// Default Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes the repository with default (empty) properties.
+    /// </para>
+    /// </remarks>
+    protected LoggerRepositorySkeleton() : this(new PropertiesDictionary())
+    {
+    }
 
-		/// <summary>
-		/// Construct the repository using specific properties
-		/// </summary>
-		/// <param name="properties">the properties to set for this repository</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes the repository with specified properties.
-		/// </para>
-		/// </remarks>
-		protected LoggerRepositorySkeleton(PropertiesDictionary properties)
-		{
-			m_properties = properties;
-			m_rendererMap = new RendererMap();
-			m_pluginMap = new PluginMap(this);
-			m_levelMap = new LevelMap();
-            m_configurationMessages = EmptyCollection.Instance;
-			m_configured = false;
+    /// <summary>
+    /// Construct the repository using specific properties
+    /// </summary>
+    /// <param name="properties">the properties to set for this repository</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes the repository with specified properties.
+    /// </para>
+    /// </remarks>
+    protected LoggerRepositorySkeleton(PropertiesDictionary properties)
+    {
+      m_properties = properties;
+      m_rendererMap = new RendererMap();
+      m_pluginMap = new PluginMap(this);
+      m_levelMap = new LevelMap();
+      m_configurationMessages = EmptyCollection.Instance;
+      m_configured = false;
 
-			AddBuiltinLevels();
+      AddBuiltinLevels();
 
-			// Don't disable any levels by default.
-			m_threshold = Level.All;
-		}
+      // Don't disable any levels by default.
+      m_threshold = Level.All;
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of ILoggerRepository
+    #region Implementation of ILoggerRepository
 
-		/// <summary>
-		/// The name of the repository
-		/// </summary>
-		/// <value>
-		/// The string name of the repository
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The name of this repository. The name is
-		/// used to store and lookup the repositories 
-		/// stored by the <see cref="IRepositorySelector"/>.
-		/// </para>
-		/// </remarks>
-		public virtual string Name
-		{
-			get { return m_name; }
-			set { m_name = value; }
-		}
+    /// <summary>
+    /// The name of the repository
+    /// </summary>
+    /// <value>
+    /// The string name of the repository
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The name of this repository. The name is
+    /// used to store and lookup the repositories 
+    /// stored by the <see cref="IRepositorySelector"/>.
+    /// </para>
+    /// </remarks>
+    public virtual string Name
+    {
+      get { return m_name; }
+      set { m_name = value; }
+    }
 
-		/// <summary>
-		/// The threshold for all events in this repository
-		/// </summary>
-		/// <value>
-		/// The threshold for all events in this repository
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The threshold for all events in this repository
-		/// </para>
-		/// </remarks>
-		public virtual Level Threshold
-		{
-			get { return m_threshold; }
-			set
-			{ 
-				if (value != null)
-				{
-					m_threshold = value; 
-				}
-				else
-				{
-					// Must not set threshold to null
-					LogLog.Warn(declaringType, "LoggerRepositorySkeleton: Threshold cannot be set to null. Setting to ALL");
-					m_threshold = Level.All;
-				}
-			}
-		}
-
-		/// <summary>
-		/// RendererMap accesses the object renderer map for this repository.
-		/// </summary>
-		/// <value>
-		/// RendererMap accesses the object renderer map for this repository.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// RendererMap accesses the object renderer map for this repository.
-		/// </para>
-		/// <para>
-		/// The RendererMap holds a mapping between types and
-		/// <see cref="IObjectRenderer"/> objects.
-		/// </para>
-		/// </remarks>
-		public virtual RendererMap RendererMap
-		{
-			get { return m_rendererMap; }
-		}
-
-		/// <summary>
-		/// The plugin map for this repository.
-		/// </summary>
-		/// <value>
-		/// The plugin map for this repository.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The plugin map holds the <see cref="IPlugin"/> instances
-		/// that have been attached to this repository.
-		/// </para>
-		/// </remarks>
-		public virtual PluginMap PluginMap
-		{
-			get { return m_pluginMap; }
-		}
-
-		/// <summary>
-		/// Get the level map for the Repository.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Get the level map for the Repository.
-		/// </para>
-		/// <para>
-		/// The level map defines the mappings between
-		/// level names and <see cref="Level"/> objects in
-		/// this repository.
-		/// </para>
-		/// </remarks>
-		public virtual LevelMap LevelMap
-		{
-			get { return m_levelMap; }
-		}
-
-		/// <summary>
-		/// Test if logger exists
-		/// </summary>
-		/// <param name="name">The name of the logger to lookup</param>
-		/// <returns>The Logger object with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Check if the named logger exists in the repository. If so return
-		/// its reference, otherwise returns <c>null</c>.
-		/// </para>
-		/// </remarks>
-		public abstract ILogger Exists(string name);
-
-		/// <summary>
-		/// Returns all the currently defined loggers in the repository
-		/// </summary>
-		/// <returns>All the defined loggers</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns all the currently defined loggers in the repository as an Array.
-		/// </para>
-		/// </remarks>
-		public abstract ILogger[] GetCurrentLoggers();
-
-		/// <summary>
-		/// Return a new logger instance
-		/// </summary>
-		/// <param name="name">The name of the logger to retrieve</param>
-		/// <returns>The logger object with the name specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Return a new logger instance.
-		/// </para>
-		/// <para>
-		/// If a logger of that name already exists, then it will be
-		/// returned. Otherwise, a new logger will be instantiated and
-		/// then linked with its existing ancestors as well as children.
-		/// </para>
-		/// </remarks>
-		public abstract ILogger GetLogger(string name);
-
-		/// <summary>
-		/// Shutdown the repository
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Shutdown the repository. Can be overridden in a subclass.
-		/// This base class implementation notifies the <see cref="ShutdownEvent"/>
-		/// listeners and all attached plugins of the shutdown event.
-		/// </para>
-		/// </remarks>
-		public virtual void Shutdown() 
-		{
-			// Shutdown attached plugins
-			foreach(IPlugin plugin in PluginMap.AllPlugins)
-			{
-				plugin.Shutdown();
-			}
-
-			// Notify listeners
-			OnShutdown(null);
-		}
-
-		/// <summary>
-		/// Reset the repositories configuration to a default state
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Reset all values contained in this instance to their
-		/// default state.
-		/// </para>
-		/// <para>
-		/// Existing loggers are not removed. They are just reset.
-		/// </para>
-		/// <para>
-		/// This method should be used sparingly and with care as it will
-		/// block all logging until it is completed.
-		/// </para>
-		/// </remarks>
-		public virtual void ResetConfiguration() 
-		{
-			// Clear internal data structures
-			m_rendererMap.Clear();
-			m_levelMap.Clear();
-            m_configurationMessages = EmptyCollection.Instance;
-
-			// Add the predefined levels to the map
-			AddBuiltinLevels();
-
-			Configured = false;
-
-			// Notify listeners
-			OnConfigurationReset(null);
-		}
-
-		/// <summary>
-		/// Log the logEvent through this repository.
-		/// </summary>
-		/// <param name="logEvent">the event to log</param>
-		/// <remarks>
-		/// <para>
-		/// This method should not normally be used to log.
-		/// The <see cref="ILog"/> interface should be used 
-		/// for routine logging. This interface can be obtained
-		/// using the <see cref="M:log4net.LogManager.GetLogger(string)"/> method.
-		/// </para>
-		/// <para>
-		/// The <c>logEvent</c> is delivered to the appropriate logger and
-		/// that logger is then responsible for logging the event.
-		/// </para>
-		/// </remarks>
-		public abstract void Log(LoggingEvent logEvent);
-
-		/// <summary>
-		/// Flag indicates if this repository has been configured.
-		/// </summary>
-		/// <value>
-		/// Flag indicates if this repository has been configured.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Flag indicates if this repository has been configured.
-		/// </para>
-		/// </remarks>
-		public virtual bool Configured 
-		{ 
-			get { return m_configured; }
-			set { m_configured = value; }
-		}
-
-        /// <summary>
-        /// Contains a list of internal messages captures during the 
-        /// last configuration.
-        /// </summary>
-	    public virtual ICollection ConfigurationMessages
-	    {
-            get { return m_configurationMessages; }
-            set { m_configurationMessages = value; }
-	    }
-
-	    /// <summary>
-		/// Event to notify that the repository has been shutdown.
-		/// </summary>
-		/// <value>
-		/// Event to notify that the repository has been shutdown.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when the repository has been shutdown.
-		/// </para>
-		/// </remarks>
-		public event LoggerRepositoryShutdownEventHandler ShutdownEvent
-		{
-			add { m_shutdownEvent += value; }
-			remove { m_shutdownEvent -= value; }
-		}
-
-		/// <summary>
-		/// Event to notify that the repository has had its configuration reset.
-		/// </summary>
-		/// <value>
-		/// Event to notify that the repository has had its configuration reset.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when the repository's configuration has been
-		/// reset to default.
-		/// </para>
-		/// </remarks>
-		public event LoggerRepositoryConfigurationResetEventHandler ConfigurationReset
-		{
-			add { m_configurationResetEvent += value; }
-			remove { m_configurationResetEvent -= value; }
-		}
-
-		/// <summary>
-		/// Event to notify that the repository has had its configuration changed.
-		/// </summary>
-		/// <value>
-		/// Event to notify that the repository has had its configuration changed.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Event raised when the repository's configuration has been changed.
-		/// </para>
-		/// </remarks>
-		public event LoggerRepositoryConfigurationChangedEventHandler ConfigurationChanged
-		{
-			add { m_configurationChangedEvent += value; }
-			remove { m_configurationChangedEvent -= value; }
-		}
-
-		/// <summary>
-		/// Repository specific properties
-		/// </summary>
-		/// <value>
-		/// Repository specific properties
-		/// </value>
-		/// <remarks>
-		/// These properties can be specified on a repository specific basis
-		/// </remarks>
-		public PropertiesDictionary Properties 
-		{ 
-			get { return m_properties; } 
-		}
-
-		/// <summary>
-		/// Returns all the Appenders that are configured as an Array.
-		/// </summary>
-		/// <returns>All the Appenders</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns all the Appenders that are configured as an Array.
-		/// </para>
-		/// </remarks>
-		public abstract log4net.Appender.IAppender[] GetAppenders();
-
-		#endregion
-
-	    #region Private Static Fields
-
-	    /// <summary>
-	    /// The fully qualified type of the LoggerRepositorySkeleton class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(LoggerRepositorySkeleton);
-
-	    #endregion Private Static Fields
-
-		private void AddBuiltinLevels()
-		{
-			// Add the predefined levels to the map
-			m_levelMap.Add(Level.Off);
-
-			// Unrecoverable errors
-			m_levelMap.Add(Level.Emergency);
-			m_levelMap.Add(Level.Fatal);
-			m_levelMap.Add(Level.Alert); 
-
-			// Recoverable errors
-			m_levelMap.Add(Level.Critical); 
-			m_levelMap.Add(Level.Severe); 
-			m_levelMap.Add(Level.Error); 
-			m_levelMap.Add(Level.Warn);
-
-			// Information
-			m_levelMap.Add(Level.Notice); 
-			m_levelMap.Add(Level.Info); 
-
-			// Debug
-			m_levelMap.Add(Level.Debug);
-			m_levelMap.Add(Level.Fine);
-			m_levelMap.Add(Level.Trace);
-			m_levelMap.Add(Level.Finer);
-			m_levelMap.Add(Level.Verbose);
-			m_levelMap.Add(Level.Finest);
-
-			m_levelMap.Add(Level.All);
-		}
-
-		/// <summary>
-		/// Adds an object renderer for a specific class. 
-		/// </summary>
-		/// <param name="typeToRender">The type that will be rendered by the renderer supplied.</param>
-		/// <param name="rendererInstance">The object renderer used to render the object.</param>
-		/// <remarks>
-		/// <para>
-		/// Adds an object renderer for a specific class. 
-		/// </para>
-		/// </remarks>
-		public virtual void AddRenderer(Type typeToRender, IObjectRenderer rendererInstance) 
-		{
-			if (typeToRender == null)
-			{
-				throw new ArgumentNullException("typeToRender");
-			}
-			if (rendererInstance == null)
-			{
-				throw new ArgumentNullException("rendererInstance");
-			}
-
-			m_rendererMap.Put(typeToRender, rendererInstance);
-		}
-
-		/// <summary>
-		/// Notify the registered listeners that the repository is shutting down
-		/// </summary>
-		/// <param name="e">Empty EventArgs</param>
-		/// <remarks>
-		/// <para>
-		/// Notify any listeners that this repository is shutting down.
-		/// </para>
-		/// </remarks>
-		protected virtual void OnShutdown(EventArgs e)
-		{
-			if (e == null)
-			{
-				e = EventArgs.Empty;
-			}
-
-			LoggerRepositoryShutdownEventHandler handler = m_shutdownEvent;
-			if (handler != null)
-			{
-				handler(this, e);
-			}
-		}
-
-		/// <summary>
-		/// Notify the registered listeners that the repository has had its configuration reset
-		/// </summary>
-		/// <param name="e">Empty EventArgs</param>
-		/// <remarks>
-		/// <para>
-		/// Notify any listeners that this repository's configuration has been reset.
-		/// </para>
-		/// </remarks>
-		protected virtual void OnConfigurationReset(EventArgs e)
-		{
-			if (e == null)
-			{
-				e = EventArgs.Empty;
-			}
-
-			LoggerRepositoryConfigurationResetEventHandler handler = m_configurationResetEvent;
-			if (handler != null)
-			{
-				handler(this, e);
-			}
-		}
-
-		/// <summary>
-		/// Notify the registered listeners that the repository has had its configuration changed
-		/// </summary>
-		/// <param name="e">Empty EventArgs</param>
-		/// <remarks>
-		/// <para>
-		/// Notify any listeners that this repository's configuration has changed.
-		/// </para>
-		/// </remarks>
-		protected virtual void OnConfigurationChanged(EventArgs e)
-		{
-			if (e == null)
-			{
-				e = EventArgs.Empty;
-			}
-
-			LoggerRepositoryConfigurationChangedEventHandler handler = m_configurationChangedEvent;
-			if (handler != null)
-			{
-				handler(this, e);
-			}
-		}
-
-		/// <summary>
-		/// Raise a configuration changed event on this repository
-		/// </summary>
-		/// <param name="e">EventArgs.Empty</param>
-		/// <remarks>
-		/// <para>
-		/// Applications that programmatically change the configuration of the repository should
-		/// raise this event notification to notify listeners.
-		/// </para>
-		/// </remarks>
-		public void RaiseConfigurationChanged(EventArgs e)
-		{
-			OnConfigurationChanged(e);
-		}
-
-        private static int GetWaitTime(DateTime startTimeUtc, int millisecondsTimeout)
+    /// <summary>
+    /// The threshold for all events in this repository
+    /// </summary>
+    /// <value>
+    /// The threshold for all events in this repository
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The threshold for all events in this repository
+    /// </para>
+    /// </remarks>
+    public virtual Level Threshold
+    {
+      get { return m_threshold; }
+      set
+      {
+        if (value != null)
         {
-            if (millisecondsTimeout == Timeout.Infinite) return Timeout.Infinite;
-            if (millisecondsTimeout == 0) return 0;
-
-            int elapsedMilliseconds = (int)(DateTime.UtcNow - startTimeUtc).TotalMilliseconds;
-            int timeout = millisecondsTimeout - elapsedMilliseconds;
-            if (timeout < 0) timeout = 0;
-            return timeout;
+          m_threshold = value;
         }
-
-        /// <summary>
-        /// Flushes all configured Appenders that implement <see cref="log4net.Appender.IFlushable"/>.
-        /// </summary>
-        /// <param name="millisecondsTimeout">The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed,
-        /// or <see cref="Timeout.Infinite"/> to wait indefinitely.</param>
-        /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
-        public bool Flush(int millisecondsTimeout)
+        else
         {
-            if (millisecondsTimeout < -1) throw new ArgumentOutOfRangeException("millisecondsTimeout", "Timeout must be -1 (Timeout.Infinite) or non-negative");
-
-            // Assume success until one of the appenders fails
-            bool result = true;
-
-            // Use DateTime.UtcNow rather than a System.Diagnostics.Stopwatch for compatibility with .NET 1.x
-            DateTime startTimeUtc = DateTime.UtcNow;
-
-            // Do buffering appenders first.  These may be forwarding to other appenders
-            foreach(log4net.Appender.IAppender appender in GetAppenders())
-            {
-                log4net.Appender.IFlushable flushable = appender as log4net.Appender.IFlushable;
-                if (flushable == null) continue;
-                if (appender is Appender.BufferingAppenderSkeleton)
-                {
-                    int timeout = GetWaitTime(startTimeUtc, millisecondsTimeout);
-                    if (!flushable.Flush(timeout)) result = false;
-                }
-            }
-
-            // Do non-buffering appenders.
-            foreach (log4net.Appender.IAppender appender in GetAppenders())
-            {
-                log4net.Appender.IFlushable flushable = appender as log4net.Appender.IFlushable;
-                if (flushable == null) continue;
-                if (!(appender is Appender.BufferingAppenderSkeleton))
-                {
-                    int timeout = GetWaitTime(startTimeUtc, millisecondsTimeout);
-                    if (!flushable.Flush(timeout)) result = false;
-                }
-            }
-
-            return result;
+          // Must not set threshold to null
+          LogLog.Warn(declaringType, "LoggerRepositorySkeleton: Threshold cannot be set to null. Setting to ALL");
+          m_threshold = Level.All;
         }
-	}
+      }
+    }
+
+    /// <summary>
+    /// RendererMap accesses the object renderer map for this repository.
+    /// </summary>
+    /// <value>
+    /// RendererMap accesses the object renderer map for this repository.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// RendererMap accesses the object renderer map for this repository.
+    /// </para>
+    /// <para>
+    /// The RendererMap holds a mapping between types and
+    /// <see cref="IObjectRenderer"/> objects.
+    /// </para>
+    /// </remarks>
+    public virtual RendererMap RendererMap
+    {
+      get { return m_rendererMap; }
+    }
+
+    /// <summary>
+    /// The plugin map for this repository.
+    /// </summary>
+    /// <value>
+    /// The plugin map for this repository.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The plugin map holds the <see cref="IPlugin"/> instances
+    /// that have been attached to this repository.
+    /// </para>
+    /// </remarks>
+    public virtual PluginMap PluginMap
+    {
+      get { return m_pluginMap; }
+    }
+
+    /// <summary>
+    /// Get the level map for the Repository.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Get the level map for the Repository.
+    /// </para>
+    /// <para>
+    /// The level map defines the mappings between
+    /// level names and <see cref="Level"/> objects in
+    /// this repository.
+    /// </para>
+    /// </remarks>
+    public virtual LevelMap LevelMap
+    {
+      get { return m_levelMap; }
+    }
+
+    /// <summary>
+    /// Test if logger exists
+    /// </summary>
+    /// <param name="name">The name of the logger to lookup</param>
+    /// <returns>The Logger object with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Check if the named logger exists in the repository. If so return
+    /// its reference, otherwise returns <c>null</c>.
+    /// </para>
+    /// </remarks>
+    public abstract ILogger Exists(string name);
+
+    /// <summary>
+    /// Returns all the currently defined loggers in the repository
+    /// </summary>
+    /// <returns>All the defined loggers</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns all the currently defined loggers in the repository as an Array.
+    /// </para>
+    /// </remarks>
+    public abstract ILogger[] GetCurrentLoggers();
+
+    /// <summary>
+    /// Return a new logger instance
+    /// </summary>
+    /// <param name="name">The name of the logger to retrieve</param>
+    /// <returns>The logger object with the name specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Return a new logger instance.
+    /// </para>
+    /// <para>
+    /// If a logger of that name already exists, then it will be
+    /// returned. Otherwise, a new logger will be instantiated and
+    /// then linked with its existing ancestors as well as children.
+    /// </para>
+    /// </remarks>
+    public abstract ILogger GetLogger(string name);
+
+    /// <summary>
+    /// Shutdown the repository
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Shutdown the repository. Can be overridden in a subclass.
+    /// This base class implementation notifies the <see cref="ShutdownEvent"/>
+    /// listeners and all attached plugins of the shutdown event.
+    /// </para>
+    /// </remarks>
+    public virtual void Shutdown()
+    {
+      // Shutdown attached plugins
+      foreach (IPlugin plugin in PluginMap.AllPlugins)
+      {
+        plugin.Shutdown();
+      }
+
+      // Notify listeners
+      OnShutdown(null);
+    }
+
+    /// <summary>
+    /// Reset the repositories configuration to a default state
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Reset all values contained in this instance to their
+    /// default state.
+    /// </para>
+    /// <para>
+    /// Existing loggers are not removed. They are just reset.
+    /// </para>
+    /// <para>
+    /// This method should be used sparingly and with care as it will
+    /// block all logging until it is completed.
+    /// </para>
+    /// </remarks>
+    public virtual void ResetConfiguration()
+    {
+      // Clear internal data structures
+      m_rendererMap.Clear();
+      m_levelMap.Clear();
+      m_configurationMessages = EmptyCollection.Instance;
+
+      // Add the predefined levels to the map
+      AddBuiltinLevels();
+
+      Configured = false;
+
+      // Notify listeners
+      OnConfigurationReset(null);
+    }
+
+    /// <summary>
+    /// Log the logEvent through this repository.
+    /// </summary>
+    /// <param name="logEvent">the event to log</param>
+    /// <remarks>
+    /// <para>
+    /// This method should not normally be used to log.
+    /// The <see cref="ILog"/> interface should be used 
+    /// for routine logging. This interface can be obtained
+    /// using the <see cref="M:log4net.LogManager.GetLogger(string)"/> method.
+    /// </para>
+    /// <para>
+    /// The <c>logEvent</c> is delivered to the appropriate logger and
+    /// that logger is then responsible for logging the event.
+    /// </para>
+    /// </remarks>
+    public abstract void Log(LoggingEvent logEvent);
+
+    /// <summary>
+    /// Flag indicates if this repository has been configured.
+    /// </summary>
+    /// <value>
+    /// Flag indicates if this repository has been configured.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Flag indicates if this repository has been configured.
+    /// </para>
+    /// </remarks>
+    public virtual bool Configured
+    {
+      get { return m_configured; }
+      set { m_configured = value; }
+    }
+
+    /// <summary>
+    /// Contains a list of internal messages captures during the 
+    /// last configuration.
+    /// </summary>
+    public virtual ICollection ConfigurationMessages
+    {
+      get { return m_configurationMessages; }
+      set { m_configurationMessages = value; }
+    }
+
+    /// <summary>
+    /// Event to notify that the repository has been shutdown.
+    /// </summary>
+    /// <value>
+    /// Event to notify that the repository has been shutdown.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when the repository has been shutdown.
+    /// </para>
+    /// </remarks>
+    public event LoggerRepositoryShutdownEventHandler ShutdownEvent
+    {
+      add { m_shutdownEvent += value; }
+      remove { m_shutdownEvent -= value; }
+    }
+
+    /// <summary>
+    /// Event to notify that the repository has had its configuration reset.
+    /// </summary>
+    /// <value>
+    /// Event to notify that the repository has had its configuration reset.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when the repository's configuration has been
+    /// reset to default.
+    /// </para>
+    /// </remarks>
+    public event LoggerRepositoryConfigurationResetEventHandler ConfigurationReset
+    {
+      add { m_configurationResetEvent += value; }
+      remove { m_configurationResetEvent -= value; }
+    }
+
+    /// <summary>
+    /// Event to notify that the repository has had its configuration changed.
+    /// </summary>
+    /// <value>
+    /// Event to notify that the repository has had its configuration changed.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Event raised when the repository's configuration has been changed.
+    /// </para>
+    /// </remarks>
+    public event LoggerRepositoryConfigurationChangedEventHandler ConfigurationChanged
+    {
+      add { m_configurationChangedEvent += value; }
+      remove { m_configurationChangedEvent -= value; }
+    }
+
+    /// <summary>
+    /// Repository specific properties
+    /// </summary>
+    /// <value>
+    /// Repository specific properties
+    /// </value>
+    /// <remarks>
+    /// These properties can be specified on a repository specific basis
+    /// </remarks>
+    public PropertiesDictionary Properties
+    {
+      get { return m_properties; }
+    }
+
+    /// <summary>
+    /// Returns all the Appenders that are configured as an Array.
+    /// </summary>
+    /// <returns>All the Appenders</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns all the Appenders that are configured as an Array.
+    /// </para>
+    /// </remarks>
+    public abstract log4net.Appender.IAppender[] GetAppenders();
+
+    #endregion
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the LoggerRepositorySkeleton class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(LoggerRepositorySkeleton);
+
+    #endregion Private Static Fields
+
+    private void AddBuiltinLevels()
+    {
+      // Add the predefined levels to the map
+      m_levelMap.Add(Level.Off);
+
+      // Unrecoverable errors
+      m_levelMap.Add(Level.Emergency);
+      m_levelMap.Add(Level.Fatal);
+      m_levelMap.Add(Level.Alert);
+
+      // Recoverable errors
+      m_levelMap.Add(Level.Critical);
+      m_levelMap.Add(Level.Severe);
+      m_levelMap.Add(Level.Error);
+      m_levelMap.Add(Level.Warn);
+
+      // Information
+      m_levelMap.Add(Level.Notice);
+      m_levelMap.Add(Level.Info);
+
+      // Debug
+      m_levelMap.Add(Level.Debug);
+      m_levelMap.Add(Level.Fine);
+      m_levelMap.Add(Level.Trace);
+      m_levelMap.Add(Level.Finer);
+      m_levelMap.Add(Level.Verbose);
+      m_levelMap.Add(Level.Finest);
+
+      m_levelMap.Add(Level.All);
+    }
+
+    /// <summary>
+    /// Adds an object renderer for a specific class. 
+    /// </summary>
+    /// <param name="typeToRender">The type that will be rendered by the renderer supplied.</param>
+    /// <param name="rendererInstance">The object renderer used to render the object.</param>
+    /// <remarks>
+    /// <para>
+    /// Adds an object renderer for a specific class. 
+    /// </para>
+    /// </remarks>
+    public virtual void AddRenderer(Type typeToRender, IObjectRenderer rendererInstance)
+    {
+      if (typeToRender == null)
+      {
+        throw new ArgumentNullException("typeToRender");
+      }
+      if (rendererInstance == null)
+      {
+        throw new ArgumentNullException("rendererInstance");
+      }
+
+      m_rendererMap.Put(typeToRender, rendererInstance);
+    }
+
+    /// <summary>
+    /// Notify the registered listeners that the repository is shutting down
+    /// </summary>
+    /// <param name="e">Empty EventArgs</param>
+    /// <remarks>
+    /// <para>
+    /// Notify any listeners that this repository is shutting down.
+    /// </para>
+    /// </remarks>
+    protected virtual void OnShutdown(EventArgs e)
+    {
+      if (e == null)
+      {
+        e = EventArgs.Empty;
+      }
+
+      LoggerRepositoryShutdownEventHandler handler = m_shutdownEvent;
+      if (handler != null)
+      {
+        handler(this, e);
+      }
+    }
+
+    /// <summary>
+    /// Notify the registered listeners that the repository has had its configuration reset
+    /// </summary>
+    /// <param name="e">Empty EventArgs</param>
+    /// <remarks>
+    /// <para>
+    /// Notify any listeners that this repository's configuration has been reset.
+    /// </para>
+    /// </remarks>
+    protected virtual void OnConfigurationReset(EventArgs e)
+    {
+      if (e == null)
+      {
+        e = EventArgs.Empty;
+      }
+
+      LoggerRepositoryConfigurationResetEventHandler handler = m_configurationResetEvent;
+      if (handler != null)
+      {
+        handler(this, e);
+      }
+    }
+
+    /// <summary>
+    /// Notify the registered listeners that the repository has had its configuration changed
+    /// </summary>
+    /// <param name="e">Empty EventArgs</param>
+    /// <remarks>
+    /// <para>
+    /// Notify any listeners that this repository's configuration has changed.
+    /// </para>
+    /// </remarks>
+    protected virtual void OnConfigurationChanged(EventArgs e)
+    {
+      if (e == null)
+      {
+        e = EventArgs.Empty;
+      }
+
+      LoggerRepositoryConfigurationChangedEventHandler handler = m_configurationChangedEvent;
+      if (handler != null)
+      {
+        handler(this, e);
+      }
+    }
+
+    /// <summary>
+    /// Raise a configuration changed event on this repository
+    /// </summary>
+    /// <param name="e">EventArgs.Empty</param>
+    /// <remarks>
+    /// <para>
+    /// Applications that programmatically change the configuration of the repository should
+    /// raise this event notification to notify listeners.
+    /// </para>
+    /// </remarks>
+    public void RaiseConfigurationChanged(EventArgs e)
+    {
+      OnConfigurationChanged(e);
+    }
+
+    private static int GetWaitTime(DateTime startTimeUtc, int millisecondsTimeout)
+    {
+      if (millisecondsTimeout == Timeout.Infinite) return Timeout.Infinite;
+      if (millisecondsTimeout == 0) return 0;
+
+      int elapsedMilliseconds = (int)(DateTime.UtcNow - startTimeUtc).TotalMilliseconds;
+      int timeout = millisecondsTimeout - elapsedMilliseconds;
+      if (timeout < 0) timeout = 0;
+      return timeout;
+    }
+
+    /// <summary>
+    /// Flushes all configured Appenders that implement <see cref="log4net.Appender.IFlushable"/>.
+    /// </summary>
+    /// <param name="millisecondsTimeout">The maximum time in milliseconds to wait for logging events from asycnhronous appenders to be flushed,
+    /// or <see cref="Timeout.Infinite"/> to wait indefinitely.</param>
+    /// <returns><c>True</c> if all logging events were flushed successfully, else <c>false</c>.</returns>
+    public bool Flush(int millisecondsTimeout)
+    {
+      if (millisecondsTimeout < -1) throw new ArgumentOutOfRangeException("millisecondsTimeout", "Timeout must be -1 (Timeout.Infinite) or non-negative");
+
+      // Assume success until one of the appenders fails
+      bool result = true;
+
+      // Use DateTime.UtcNow rather than a System.Diagnostics.Stopwatch for compatibility with .NET 1.x
+      DateTime startTimeUtc = DateTime.UtcNow;
+
+      // Do buffering appenders first.  These may be forwarding to other appenders
+      foreach (log4net.Appender.IAppender appender in GetAppenders())
+      {
+        log4net.Appender.IFlushable flushable = appender as log4net.Appender.IFlushable;
+        if (flushable == null) continue;
+        if (appender is Appender.BufferingAppenderSkeleton)
+        {
+          int timeout = GetWaitTime(startTimeUtc, millisecondsTimeout);
+          if (!flushable.Flush(timeout)) result = false;
+        }
+      }
+
+      // Do non-buffering appenders.
+      foreach (log4net.Appender.IAppender appender in GetAppenders())
+      {
+        log4net.Appender.IFlushable flushable = appender as log4net.Appender.IFlushable;
+        if (flushable == null) continue;
+        if (!(appender is Appender.BufferingAppenderSkeleton))
+        {
+          int timeout = GetWaitTime(startTimeUtc, millisecondsTimeout);
+          if (!flushable.Flush(timeout)) result = false;
+        }
+      }
+
+      return result;
+    }
+  }
 }
diff --git a/src/log4net/ThreadContext.cs b/src/log4net/ThreadContext.cs
index 4da972c..e84dba5 100644
--- a/src/log4net/ThreadContext.cs
+++ b/src/log4net/ThreadContext.cs
@@ -24,116 +24,116 @@
 
 namespace log4net
 {
-	/// <summary>
-	/// The log4net Thread Context.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <c>ThreadContext</c> provides a location for thread specific debugging 
-	/// information to be stored.
-	/// The <c>ThreadContext</c> properties override any <see cref="GlobalContext"/>
-	/// properties with the same name.
-	/// </para>
-	/// <para>
-	/// The thread context has a properties map and a stack.
-	/// The properties and stack can 
-	/// be included in the output of log messages. The <see cref="log4net.Layout.PatternLayout"/>
-	/// supports selecting and outputting these properties.
-	/// </para>
-	/// <para>
-	/// The Thread Context provides a diagnostic context for the current thread. 
-	/// This is an instrument for distinguishing interleaved log
-	/// output from different sources. Log output is typically interleaved
-	/// when a server handles multiple clients near-simultaneously.
-	/// </para>
-	/// <para>
-	/// The Thread Context is managed on a per thread basis.
-	/// </para>
-	/// </remarks>
-	/// <example>Example of using the thread context properties to store a username.
-	/// <code lang="C#">
-	/// ThreadContext.Properties["user"] = userName;
-	///	log.Info("This log message has a ThreadContext Property called 'user'");
-	/// </code>
-	/// </example>
-	/// <example>Example of how to push a message into the context stack
-	/// <code lang="C#">
-	///	using(ThreadContext.Stacks["NDC"].Push("my context message"))
-	///	{
-	///		log.Info("This log message has a ThreadContext Stack message that includes 'my context message'");
-	///	
-	///	} // at the end of the using block the message is automatically popped 
-	/// </code>
-	/// </example>
-	/// <threadsafety static="true" instance="true" />
-	/// <author>Nicko Cadell</author>
-	public sealed class ThreadContext
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// The log4net Thread Context.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <c>ThreadContext</c> provides a location for thread specific debugging 
+  /// information to be stored.
+  /// The <c>ThreadContext</c> properties override any <see cref="GlobalContext"/>
+  /// properties with the same name.
+  /// </para>
+  /// <para>
+  /// The thread context has a properties map and a stack.
+  /// The properties and stack can 
+  /// be included in the output of log messages. The <see cref="log4net.Layout.PatternLayout"/>
+  /// supports selecting and outputting these properties.
+  /// </para>
+  /// <para>
+  /// The Thread Context provides a diagnostic context for the current thread. 
+  /// This is an instrument for distinguishing interleaved log
+  /// output from different sources. Log output is typically interleaved
+  /// when a server handles multiple clients near-simultaneously.
+  /// </para>
+  /// <para>
+  /// The Thread Context is managed on a per thread basis.
+  /// </para>
+  /// </remarks>
+  /// <example>Example of using the thread context properties to store a username.
+  /// <code lang="C#">
+  /// ThreadContext.Properties["user"] = userName;
+  ///  log.Info("This log message has a ThreadContext Property called 'user'");
+  /// </code>
+  /// </example>
+  /// <example>Example of how to push a message into the context stack
+  /// <code lang="C#">
+  ///  using(ThreadContext.Stacks["NDC"].Push("my context message"))
+  ///  {
+  ///    log.Info("This log message has a ThreadContext Stack message that includes 'my context message'");
+  ///  
+  ///  } // at the end of the using block the message is automatically popped 
+  /// </code>
+  /// </example>
+  /// <threadsafety static="true" instance="true" />
+  /// <author>Nicko Cadell</author>
+  public sealed class ThreadContext
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private Constructor. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </para>
-		/// </remarks>
-		private ThreadContext()
-		{
-		}
+    /// <summary>
+    /// Private Constructor. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </para>
+    /// </remarks>
+    private ThreadContext()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Properties
+    #region Public Static Properties
 
-		/// <summary>
-		/// The thread properties map
-		/// </summary>
-		/// <value>
-		/// The thread properties map
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <c>ThreadContext</c> properties override any <see cref="GlobalContext"/>
-		/// properties with the same name.
-		/// </para>
-		/// </remarks>
-		public static ThreadContextProperties Properties
-		{
-			get { return s_properties; }
-		}
+    /// <summary>
+    /// The thread properties map
+    /// </summary>
+    /// <value>
+    /// The thread properties map
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <c>ThreadContext</c> properties override any <see cref="GlobalContext"/>
+    /// properties with the same name.
+    /// </para>
+    /// </remarks>
+    public static ThreadContextProperties Properties
+    {
+      get { return s_properties; }
+    }
 
-		/// <summary>
-		/// The thread stacks
-		/// </summary>
-		/// <value>
-		/// stack map
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The thread local stacks.
-		/// </para>
-		/// </remarks>
-		public static ThreadContextStacks Stacks
-		{
-			get { return s_stacks; }
-		}
+    /// <summary>
+    /// The thread stacks
+    /// </summary>
+    /// <value>
+    /// stack map
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The thread local stacks.
+    /// </para>
+    /// </remarks>
+    public static ThreadContextStacks Stacks
+    {
+      get { return s_stacks; }
+    }
 
-		#endregion Public Static Properties
+    #endregion Public Static Properties
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The thread context properties instance
-		/// </summary>
-		private static readonly ThreadContextProperties s_properties = new ThreadContextProperties();
+    /// <summary>
+    /// The thread context properties instance
+    /// </summary>
+    private static readonly ThreadContextProperties s_properties = new ThreadContextProperties();
 
-		/// <summary>
-		/// The thread context stacks instance
-		/// </summary>
-		private static readonly ThreadContextStacks s_stacks = new ThreadContextStacks(s_properties);
+    /// <summary>
+    /// The thread context stacks instance
+    /// </summary>
+    private static readonly ThreadContextStacks s_stacks = new ThreadContextStacks(s_properties);
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/AppenderAttachedImpl.cs b/src/log4net/Util/AppenderAttachedImpl.cs
index 3508048..f638f2b 100644
--- a/src/log4net/Util/AppenderAttachedImpl.cs
+++ b/src/log4net/Util/AppenderAttachedImpl.cs
@@ -24,353 +24,353 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// A straightforward implementation of the <see cref="IAppenderAttachable"/> interface.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This is the default implementation of the <see cref="IAppenderAttachable"/>
-	/// interface. Implementors of the <see cref="IAppenderAttachable"/> interface
-	/// should aggregate an instance of this type.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class AppenderAttachedImpl : IAppenderAttachable
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// A straightforward implementation of the <see cref="IAppenderAttachable"/> interface.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This is the default implementation of the <see cref="IAppenderAttachable"/>
+  /// interface. Implementors of the <see cref="IAppenderAttachable"/> interface
+  /// should aggregate an instance of this type.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class AppenderAttachedImpl : IAppenderAttachable
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="AppenderAttachedImpl"/> class.
-		/// </para>
-		/// </remarks>
-		public AppenderAttachedImpl()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="AppenderAttachedImpl"/> class.
+    /// </para>
+    /// </remarks>
+    public AppenderAttachedImpl()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Append on on all attached appenders.
-		/// </summary>
-		/// <param name="loggingEvent">The event being logged.</param>
-		/// <returns>The number of appenders called.</returns>
-		/// <remarks>
-		/// <para>
-		/// Calls the <see cref="IAppender.DoAppend" /> method on all 
-		/// attached appenders.
-		/// </para>
-		/// </remarks>
-		public int AppendLoopOnAppenders(LoggingEvent loggingEvent) 
-		{
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    /// <summary>
+    /// Append on on all attached appenders.
+    /// </summary>
+    /// <param name="loggingEvent">The event being logged.</param>
+    /// <returns>The number of appenders called.</returns>
+    /// <remarks>
+    /// <para>
+    /// Calls the <see cref="IAppender.DoAppend" /> method on all 
+    /// attached appenders.
+    /// </para>
+    /// </remarks>
+    public int AppendLoopOnAppenders(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-			// m_appenderList is null when empty
-			if (m_appenderList == null) 
-			{
-				return 0;
-			}
+      // m_appenderList is null when empty
+      if (m_appenderList == null)
+      {
+        return 0;
+      }
 
-			if (m_appenderArray == null)
-			{
-				m_appenderArray = m_appenderList.ToArray();
-			}
+      if (m_appenderArray == null)
+      {
+        m_appenderArray = m_appenderList.ToArray();
+      }
 
-			foreach(IAppender appender in m_appenderArray)
-			{
-				try
-				{
-					appender.DoAppend(loggingEvent);
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Failed to append to appender [" + appender.Name + "]", ex);
-				}
-			}
-			return m_appenderList.Count;
-		}
-
-		/// <summary>
-		/// Append on on all attached appenders.
-		/// </summary>
-		/// <param name="loggingEvents">The array of events being logged.</param>
-		/// <returns>The number of appenders called.</returns>
-		/// <remarks>
-		/// <para>
-		/// Calls the <see cref="IAppender.DoAppend" /> method on all 
-		/// attached appenders.
-		/// </para>
-		/// </remarks>
-		public int AppendLoopOnAppenders(LoggingEvent[] loggingEvents) 
-		{
-			if (loggingEvents == null)
-			{
-				throw new ArgumentNullException("loggingEvents");
-			}
-			if (loggingEvents.Length == 0)
-			{
-				throw new ArgumentException("loggingEvents array must not be empty", "loggingEvents");
-			}
-			if (loggingEvents.Length == 1)
-			{
-				// Fall back to single event path
-				return AppendLoopOnAppenders(loggingEvents[0]);
-			}
-
-			// m_appenderList is null when empty
-			if (m_appenderList == null) 
-			{
-				return 0;
-			}
-
-			if (m_appenderArray == null)
-			{
-				m_appenderArray = m_appenderList.ToArray();
-			}
-
-			foreach(IAppender appender in m_appenderArray)
-			{
-				try
-				{
-					CallAppend(appender, loggingEvents);
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Failed to append to appender [" + appender.Name + "]", ex);
-				}
-			}
-			return m_appenderList.Count;
-		}
-
-		#endregion Public Instance Methods
-
-        #region Private Static Methods
-
-        /// <summary>
-		/// Calls the DoAppende method on the <see cref="IAppender"/> with 
-		/// the <see cref="LoggingEvent"/> objects supplied.
-		/// </summary>
-		/// <param name="appender">The appender</param>
-		/// <param name="loggingEvents">The events</param>
-		/// <remarks>
-		/// <para>
-		/// If the <paramref name="appender" /> supports the <see cref="IBulkAppender"/>
-		/// interface then the <paramref name="loggingEvents" /> will be passed 
-		/// through using that interface. Otherwise the <see cref="LoggingEvent"/>
-		/// objects in the array will be passed one at a time.
-		/// </para>
-		/// </remarks>
-		private static void CallAppend(IAppender appender, LoggingEvent[] loggingEvents)
-		{
-			IBulkAppender bulkAppender = appender as IBulkAppender;
-			if (bulkAppender != null)
-			{
-				bulkAppender.DoAppend(loggingEvents);
-			}
-			else
-			{
-				foreach(LoggingEvent loggingEvent in loggingEvents)
-				{
-					appender.DoAppend(loggingEvent);
-				}
-			}
+      foreach (IAppender appender in m_appenderArray)
+      {
+        try
+        {
+          appender.DoAppend(loggingEvent);
         }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Failed to append to appender [" + appender.Name + "]", ex);
+        }
+      }
+      return m_appenderList.Count;
+    }
 
-        #endregion
+    /// <summary>
+    /// Append on on all attached appenders.
+    /// </summary>
+    /// <param name="loggingEvents">The array of events being logged.</param>
+    /// <returns>The number of appenders called.</returns>
+    /// <remarks>
+    /// <para>
+    /// Calls the <see cref="IAppender.DoAppend" /> method on all 
+    /// attached appenders.
+    /// </para>
+    /// </remarks>
+    public int AppendLoopOnAppenders(LoggingEvent[] loggingEvents)
+    {
+      if (loggingEvents == null)
+      {
+        throw new ArgumentNullException("loggingEvents");
+      }
+      if (loggingEvents.Length == 0)
+      {
+        throw new ArgumentException("loggingEvents array must not be empty", "loggingEvents");
+      }
+      if (loggingEvents.Length == 1)
+      {
+        // Fall back to single event path
+        return AppendLoopOnAppenders(loggingEvents[0]);
+      }
 
-        #region Implementation of IAppenderAttachable
+      // m_appenderList is null when empty
+      if (m_appenderList == null)
+      {
+        return 0;
+      }
 
-        /// <summary>
-		/// Attaches an appender.
-		/// </summary>
-		/// <param name="newAppender">The appender to add.</param>
-		/// <remarks>
-		/// <para>
-		/// If the appender is already in the list it won't be added again.
-		/// </para>
-		/// </remarks>
-		public void AddAppender(IAppender newAppender) 
-		{
-			// Null values for newAppender parameter are strictly forbidden.
-			if (newAppender == null)
-			{
-				throw new ArgumentNullException("newAppender");
-			}
-	
-			m_appenderArray = null;
-			if (m_appenderList == null) 
-			{
-				m_appenderList = new AppenderCollection(1);
-			}
-			if (!m_appenderList.Contains(newAppender))
-			{
-				m_appenderList.Add(newAppender);
-			}
-		}
+      if (m_appenderArray == null)
+      {
+        m_appenderArray = m_appenderList.ToArray();
+      }
 
-		/// <summary>
-		/// Gets all attached appenders.
-		/// </summary>
-		/// <returns>
-		/// A collection of attached appenders, or <c>null</c> if there
-		/// are no attached appenders.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// The read only collection of all currently attached appenders.
-		/// </para>
-		/// </remarks>
-		public AppenderCollection Appenders 
-		{
-			get
-			{
-				if (m_appenderList == null)
-				{
-					// We must always return a valid collection
-					return AppenderCollection.EmptyCollection;
-				}
-				else 
-				{
-					return AppenderCollection.ReadOnly(m_appenderList);
-				}
-			}
-		}
+      foreach (IAppender appender in m_appenderArray)
+      {
+        try
+        {
+          CallAppend(appender, loggingEvents);
+        }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Failed to append to appender [" + appender.Name + "]", ex);
+        }
+      }
+      return m_appenderList.Count;
+    }
 
-		/// <summary>
-		/// Gets an attached appender with the specified name.
-		/// </summary>
-		/// <param name="name">The name of the appender to get.</param>
-		/// <returns>
-		/// The appender with the name specified, or <c>null</c> if no appender with the
-		/// specified name is found.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Lookup an attached appender by name.
-		/// </para>
-		/// </remarks>
-		public IAppender GetAppender(string name) 
-		{
-			if (m_appenderList != null && name != null)
-			{
-				foreach(IAppender appender in m_appenderList)
-				{
-					if (name == appender.Name)
-					{
-						return appender;
-					}
-				}
-			}
-			return null;   
-		}
+    #endregion Public Instance Methods
 
-		/// <summary>
-		/// Removes all attached appenders.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Removes and closes all attached appenders
-		/// </para>
-		/// </remarks>
-		public void RemoveAllAppenders() 
-		{
-			if (m_appenderList != null) 
-			{
-				foreach(IAppender appender in m_appenderList)
-				{
-					try
-					{
-						appender.Close();
-					}
-					catch(Exception ex)
-					{
-						LogLog.Error(declaringType, "Failed to Close appender ["+appender.Name+"]", ex);
-					}
-				}
-				m_appenderList = null;	  
-				m_appenderArray = null;
-			}
-		}
+    #region Private Static Methods
 
-		/// <summary>
-		/// Removes the specified appender from the list of attached appenders.
-		/// </summary>
-		/// <param name="appender">The appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// <para>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </para>
-		/// </remarks>
-		public IAppender RemoveAppender(IAppender appender) 
-		{
-			if (appender != null && m_appenderList != null) 
-			{
-				m_appenderList.Remove(appender);
-				if (m_appenderList.Count == 0)
-				{
-					m_appenderList = null;
-				}
-				m_appenderArray = null;
-			}
-			return appender;
-		}
+    /// <summary>
+    /// Calls the DoAppende method on the <see cref="IAppender"/> with 
+    /// the <see cref="LoggingEvent"/> objects supplied.
+    /// </summary>
+    /// <param name="appender">The appender</param>
+    /// <param name="loggingEvents">The events</param>
+    /// <remarks>
+    /// <para>
+    /// If the <paramref name="appender" /> supports the <see cref="IBulkAppender"/>
+    /// interface then the <paramref name="loggingEvents" /> will be passed 
+    /// through using that interface. Otherwise the <see cref="LoggingEvent"/>
+    /// objects in the array will be passed one at a time.
+    /// </para>
+    /// </remarks>
+    private static void CallAppend(IAppender appender, LoggingEvent[] loggingEvents)
+    {
+      IBulkAppender bulkAppender = appender as IBulkAppender;
+      if (bulkAppender != null)
+      {
+        bulkAppender.DoAppend(loggingEvents);
+      }
+      else
+      {
+        foreach (LoggingEvent loggingEvent in loggingEvents)
+        {
+          appender.DoAppend(loggingEvent);
+        }
+      }
+    }
 
-		/// <summary>
-		/// Removes the appender with the specified name from the list of appenders.
-		/// </summary>
-		/// <param name="name">The name of the appender to remove.</param>
-		/// <returns>The appender removed from the list</returns>
-		/// <remarks>
-		/// <para>
-		/// The appender removed is not closed.
-		/// If you are discarding the appender you must call
-		/// <see cref="IAppender.Close"/> on the appender removed.
-		/// </para>
-		/// </remarks>
-		public IAppender RemoveAppender(string name) 
-		{
-			return RemoveAppender(GetAppender(name));
-		}
+    #endregion
 
-		#endregion
+    #region Implementation of IAppenderAttachable
 
-		#region Private Instance Fields
+    /// <summary>
+    /// Attaches an appender.
+    /// </summary>
+    /// <param name="newAppender">The appender to add.</param>
+    /// <remarks>
+    /// <para>
+    /// If the appender is already in the list it won't be added again.
+    /// </para>
+    /// </remarks>
+    public void AddAppender(IAppender newAppender)
+    {
+      // Null values for newAppender parameter are strictly forbidden.
+      if (newAppender == null)
+      {
+        throw new ArgumentNullException("newAppender");
+      }
 
-		/// <summary>
-		/// List of appenders
-		/// </summary>
-		private AppenderCollection m_appenderList;
+      m_appenderArray = null;
+      if (m_appenderList == null)
+      {
+        m_appenderList = new AppenderCollection(1);
+      }
+      if (!m_appenderList.Contains(newAppender))
+      {
+        m_appenderList.Add(newAppender);
+      }
+    }
 
-		/// <summary>
-		/// Array of appenders, used to cache the m_appenderList
-		/// </summary>
-		private IAppender[] m_appenderArray;
+    /// <summary>
+    /// Gets all attached appenders.
+    /// </summary>
+    /// <returns>
+    /// A collection of attached appenders, or <c>null</c> if there
+    /// are no attached appenders.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// The read only collection of all currently attached appenders.
+    /// </para>
+    /// </remarks>
+    public AppenderCollection Appenders
+    {
+      get
+      {
+        if (m_appenderList == null)
+        {
+          // We must always return a valid collection
+          return AppenderCollection.EmptyCollection;
+        }
+        else
+        {
+          return AppenderCollection.ReadOnly(m_appenderList);
+        }
+      }
+    }
 
-		#endregion Private Instance Fields
+    /// <summary>
+    /// Gets an attached appender with the specified name.
+    /// </summary>
+    /// <param name="name">The name of the appender to get.</param>
+    /// <returns>
+    /// The appender with the name specified, or <c>null</c> if no appender with the
+    /// specified name is found.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Lookup an attached appender by name.
+    /// </para>
+    /// </remarks>
+    public IAppender GetAppender(string name)
+    {
+      if (m_appenderList != null && name != null)
+      {
+        foreach (IAppender appender in m_appenderList)
+        {
+          if (name == appender.Name)
+          {
+            return appender;
+          }
+        }
+      }
+      return null;
+    }
 
-	    #region Private Static Fields
+    /// <summary>
+    /// Removes all attached appenders.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Removes and closes all attached appenders
+    /// </para>
+    /// </remarks>
+    public void RemoveAllAppenders()
+    {
+      if (m_appenderList != null)
+      {
+        foreach (IAppender appender in m_appenderList)
+        {
+          try
+          {
+            appender.Close();
+          }
+          catch (Exception ex)
+          {
+            LogLog.Error(declaringType, "Failed to Close appender [" + appender.Name + "]", ex);
+          }
+        }
+        m_appenderList = null;
+        m_appenderArray = null;
+      }
+    }
 
-	    /// <summary>
-	    /// The fully qualified type of the AppenderAttachedImpl class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(AppenderAttachedImpl);
+    /// <summary>
+    /// Removes the specified appender from the list of attached appenders.
+    /// </summary>
+    /// <param name="appender">The appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// <para>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </para>
+    /// </remarks>
+    public IAppender RemoveAppender(IAppender appender)
+    {
+      if (appender != null && m_appenderList != null)
+      {
+        m_appenderList.Remove(appender);
+        if (m_appenderList.Count == 0)
+        {
+          m_appenderList = null;
+        }
+        m_appenderArray = null;
+      }
+      return appender;
+    }
 
-	    #endregion Private Static Fields
-	}
+    /// <summary>
+    /// Removes the appender with the specified name from the list of appenders.
+    /// </summary>
+    /// <param name="name">The name of the appender to remove.</param>
+    /// <returns>The appender removed from the list</returns>
+    /// <remarks>
+    /// <para>
+    /// The appender removed is not closed.
+    /// If you are discarding the appender you must call
+    /// <see cref="IAppender.Close"/> on the appender removed.
+    /// </para>
+    /// </remarks>
+    public IAppender RemoveAppender(string name)
+    {
+      return RemoveAppender(GetAppender(name));
+    }
+
+    #endregion
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// List of appenders
+    /// </summary>
+    private AppenderCollection m_appenderList;
+
+    /// <summary>
+    /// Array of appenders, used to cache the m_appenderList
+    /// </summary>
+    private IAppender[] m_appenderArray;
+
+    #endregion Private Instance Fields
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the AppenderAttachedImpl class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(AppenderAttachedImpl);
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/CompositeProperties.cs b/src/log4net/Util/CompositeProperties.cs
index b491197..66ac7b7 100644
--- a/src/log4net/Util/CompositeProperties.cs
+++ b/src/log4net/Util/CompositeProperties.cs
@@ -22,134 +22,134 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// This class aggregates several PropertiesDictionary collections together.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Provides a dictionary style lookup over an ordered list of
-	/// <see cref="PropertiesDictionary"/> collections.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class CompositeProperties
-	{
-		#region Private Instance Fields
+  /// <summary>
+  /// This class aggregates several PropertiesDictionary collections together.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Provides a dictionary style lookup over an ordered list of
+  /// <see cref="PropertiesDictionary"/> collections.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class CompositeProperties
+  {
+    #region Private Instance Fields
 
-		private PropertiesDictionary m_flattened = null;
-		private ArrayList m_nestedProperties = new ArrayList();
+    private PropertiesDictionary m_flattened = null;
+    private ArrayList m_nestedProperties = new ArrayList();
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="CompositeProperties" /> class.
-		/// </para>
-		/// </remarks>
-		internal CompositeProperties()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="CompositeProperties" /> class.
+    /// </para>
+    /// </remarks>
+    internal CompositeProperties()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the value of a property
-		/// </summary>
-		/// <value>
-		/// The value for the property with the specified key
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Looks up the value for the <paramref name="key" /> specified.
-		/// The <see cref="PropertiesDictionary"/> collections are searched
-		/// in the order in which they were added to this collection. The value
-		/// returned is the value held by the first collection that contains
-		/// the specified key.
-		/// </para>
-		/// <para>
-		/// If none of the collections contain the specified key then
-		/// <c>null</c> is returned.
-		/// </para>
-		/// </remarks>
-		public object this[string key]
-		{
-			get 
-			{
-				// Look in the flattened properties first
-				if (m_flattened != null)
-				{
-					return m_flattened[key];
-				}
+    /// <summary>
+    /// Gets the value of a property
+    /// </summary>
+    /// <value>
+    /// The value for the property with the specified key
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Looks up the value for the <paramref name="key" /> specified.
+    /// The <see cref="PropertiesDictionary"/> collections are searched
+    /// in the order in which they were added to this collection. The value
+    /// returned is the value held by the first collection that contains
+    /// the specified key.
+    /// </para>
+    /// <para>
+    /// If none of the collections contain the specified key then
+    /// <c>null</c> is returned.
+    /// </para>
+    /// </remarks>
+    public object this[string key]
+    {
+      get
+      {
+        // Look in the flattened properties first
+        if (m_flattened != null)
+        {
+          return m_flattened[key];
+        }
 
-				// Look for the key in all the nested properties
-				foreach(ReadOnlyPropertiesDictionary cur in m_nestedProperties)
-				{
-					if (cur.Contains(key))
-					{
-						return cur[key];
-					}
-				}
-				return null;
-			}
-		}
+        // Look for the key in all the nested properties
+        foreach (ReadOnlyPropertiesDictionary cur in m_nestedProperties)
+        {
+          if (cur.Contains(key))
+          {
+            return cur[key];
+          }
+        }
+        return null;
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Add a Properties Dictionary to this composite collection
-		/// </summary>
-		/// <param name="properties">the properties to add</param>
-		/// <remarks>
-		/// <para>
-		/// Properties dictionaries added first take precedence over dictionaries added
-		/// later.
-		/// </para>
-		/// </remarks>
-		public void Add(ReadOnlyPropertiesDictionary properties)
-		{
-			m_flattened = null;
-			m_nestedProperties.Add(properties);
-		}
+    /// <summary>
+    /// Add a Properties Dictionary to this composite collection
+    /// </summary>
+    /// <param name="properties">the properties to add</param>
+    /// <remarks>
+    /// <para>
+    /// Properties dictionaries added first take precedence over dictionaries added
+    /// later.
+    /// </para>
+    /// </remarks>
+    public void Add(ReadOnlyPropertiesDictionary properties)
+    {
+      m_flattened = null;
+      m_nestedProperties.Add(properties);
+    }
 
-		/// <summary>
-		/// Flatten this composite collection into a single properties dictionary
-		/// </summary>
-		/// <returns>the flattened dictionary</returns>
-		/// <remarks>
-		/// <para>
-		/// Reduces the collection of ordered dictionaries to a single dictionary
-		/// containing the resultant values for the keys.
-		/// </para>
-		/// </remarks>
-		public PropertiesDictionary Flatten()
-		{
-			if (m_flattened == null)
-			{
-				m_flattened = new PropertiesDictionary();
+    /// <summary>
+    /// Flatten this composite collection into a single properties dictionary
+    /// </summary>
+    /// <returns>the flattened dictionary</returns>
+    /// <remarks>
+    /// <para>
+    /// Reduces the collection of ordered dictionaries to a single dictionary
+    /// containing the resultant values for the keys.
+    /// </para>
+    /// </remarks>
+    public PropertiesDictionary Flatten()
+    {
+      if (m_flattened == null)
+      {
+        m_flattened = new PropertiesDictionary();
 
-				for(int i=m_nestedProperties.Count; --i>=0; )
-				{
-					ReadOnlyPropertiesDictionary cur = (ReadOnlyPropertiesDictionary)m_nestedProperties[i];
+        for (int i = m_nestedProperties.Count; --i >= 0;)
+        {
+          ReadOnlyPropertiesDictionary cur = (ReadOnlyPropertiesDictionary)m_nestedProperties[i];
 
-					foreach(DictionaryEntry entry in cur)
-					{
-						m_flattened[(string)entry.Key] = entry.Value;
-					}
-				}
-			}
-			return m_flattened;
-		}
+          foreach (DictionaryEntry entry in cur)
+          {
+            m_flattened[(string)entry.Key] = entry.Value;
+          }
+        }
+      }
+      return m_flattened;
+    }
 
-		#endregion Public Instance Methods
-	}
+    #endregion Public Instance Methods
+  }
 }
 
diff --git a/src/log4net/Util/ContextPropertiesBase.cs b/src/log4net/Util/ContextPropertiesBase.cs
index 9d79fee..4727461 100644
--- a/src/log4net/Util/ContextPropertiesBase.cs
+++ b/src/log4net/Util/ContextPropertiesBase.cs
@@ -22,29 +22,29 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Base class for Context Properties implementations
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class defines a basic property get set accessor
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public abstract class ContextPropertiesBase
-	{
-		/// <summary>
-		/// Gets or sets the value of a property
-		/// </summary>
-		/// <value>
-		/// The value for the property with the specified key
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the value of a property
-		/// </para>
-		/// </remarks>
-		public abstract object this[string key] { get; set; }
-	}
+  /// <summary>
+  /// Base class for Context Properties implementations
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class defines a basic property get set accessor
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public abstract class ContextPropertiesBase
+  {
+    /// <summary>
+    /// Gets or sets the value of a property
+    /// </summary>
+    /// <value>
+    /// The value for the property with the specified key
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the value of a property
+    /// </para>
+    /// </remarks>
+    public abstract object this[string key] { get; set; }
+  }
 }
 
diff --git a/src/log4net/Util/ConverterInfo.cs b/src/log4net/Util/ConverterInfo.cs
index b64edc9..31b189e 100644
--- a/src/log4net/Util/ConverterInfo.cs
+++ b/src/log4net/Util/ConverterInfo.cs
@@ -23,72 +23,72 @@
 
 namespace log4net.Util
 {
+  /// <summary>
+  /// Wrapper class used to map converter names to converter types
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Pattern converter info class used during configuration by custom
+  /// PatternString and PatternLayer converters.
+  /// </para>
+  /// </remarks>
+  public sealed class ConverterInfo
+  {
+    private string m_name;
+    private Type m_type;
+    private readonly PropertiesDictionary properties = new PropertiesDictionary();
+
     /// <summary>
-    /// Wrapper class used to map converter names to converter types
+    /// default constructor
+    /// </summary>
+    public ConverterInfo()
+    {
+    }
+
+    /// <summary>
+    /// Gets or sets the name of the conversion pattern
     /// </summary>
     /// <remarks>
     /// <para>
-    /// Pattern converter info class used during configuration by custom
-    /// PatternString and PatternLayer converters.
+    /// The name of the pattern in the format string
     /// </para>
     /// </remarks>
-    public sealed class ConverterInfo
+    public string Name
     {
-        private string m_name;
-        private Type m_type;
-        private readonly PropertiesDictionary properties = new PropertiesDictionary();
-
-        /// <summary>
-        /// default constructor
-        /// </summary>
-        public ConverterInfo()
-        {
-        }
-
-        /// <summary>
-        /// Gets or sets the name of the conversion pattern
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The name of the pattern in the format string
-        /// </para>
-        /// </remarks>
-        public string Name
-        {
-            get { return m_name; }
-            set { m_name = value; }
-        }
-
-        /// <summary>
-        /// Gets or sets the type of the converter
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// The value specified must extend the 
-        /// <see cref="PatternConverter"/> type.
-        /// </para>
-        /// </remarks>
-        public Type Type
-        {
-            get { return m_type; }
-            set { m_type = value; }
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="entry"></param>
-        public void AddProperty(PropertyEntry entry)
-        {
-            properties[entry.Key] = entry.Value;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public PropertiesDictionary Properties
-        {
-            get { return properties; }
-        }
+      get { return m_name; }
+      set { m_name = value; }
     }
+
+    /// <summary>
+    /// Gets or sets the type of the converter
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The value specified must extend the 
+    /// <see cref="PatternConverter"/> type.
+    /// </para>
+    /// </remarks>
+    public Type Type
+    {
+      get { return m_type; }
+      set { m_type = value; }
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="entry"></param>
+    public void AddProperty(PropertyEntry entry)
+    {
+      properties[entry.Key] = entry.Value;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public PropertiesDictionary Properties
+    {
+      get { return properties; }
+    }
+  }
 }
diff --git a/src/log4net/Util/CountingQuietTextWriter.cs b/src/log4net/Util/CountingQuietTextWriter.cs
index e0c2925..97bdaa4 100644
--- a/src/log4net/Util/CountingQuietTextWriter.cs
+++ b/src/log4net/Util/CountingQuietTextWriter.cs
@@ -24,157 +24,157 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Subclass of <see cref="QuietTextWriter"/> that maintains a count of 
-	/// the number of bytes written.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This writer counts the number of bytes written.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class CountingQuietTextWriter : QuietTextWriter 
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Subclass of <see cref="QuietTextWriter"/> that maintains a count of 
+  /// the number of bytes written.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This writer counts the number of bytes written.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class CountingQuietTextWriter : QuietTextWriter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="writer">The <see cref="TextWriter" /> to actually write to.</param>
-		/// <param name="errorHandler">The <see cref="IErrorHandler" /> to report errors to.</param>
-		/// <remarks>
-		/// <para>
-		/// Creates a new instance of the <see cref="CountingQuietTextWriter" /> class 
-		/// with the specified <see cref="TextWriter" /> and <see cref="IErrorHandler" />.
-		/// </para>
-		/// </remarks>
-		public CountingQuietTextWriter(TextWriter writer, IErrorHandler errorHandler) : base(writer, errorHandler)
-		{
-			m_countBytes = 0;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="writer">The <see cref="TextWriter" /> to actually write to.</param>
+    /// <param name="errorHandler">The <see cref="IErrorHandler" /> to report errors to.</param>
+    /// <remarks>
+    /// <para>
+    /// Creates a new instance of the <see cref="CountingQuietTextWriter" /> class 
+    /// with the specified <see cref="TextWriter" /> and <see cref="IErrorHandler" />.
+    /// </para>
+    /// </remarks>
+    public CountingQuietTextWriter(TextWriter writer, IErrorHandler errorHandler) : base(writer, errorHandler)
+    {
+      m_countBytes = 0;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Override implementation of QuietTextWriter
-  
-		/// <summary>
-		/// Writes a character to the underlying writer and counts the number of bytes written.
-		/// </summary>
-		/// <param name="value">the char to write</param>
-		/// <remarks>
-		/// <para>
-		/// Overrides implementation of <see cref="QuietTextWriter"/>. Counts
-		/// the number of bytes written.
-		/// </para>
-		/// </remarks>
-		public override void Write(char value) 
-		{
-			try 
-			{
-				base.Write(value);
+    #region Override implementation of QuietTextWriter
 
-				// get the number of bytes needed to represent the 
-				// char using the supplied encoding.
-				m_countBytes += this.Encoding.GetByteCount(new char[] { value });
-			} 
-			catch(Exception e) 
-			{
-				this.ErrorHandler.Error("Failed to write [" + value + "].", e, ErrorCode.WriteFailure);
-			}
-		}
-    
-		/// <summary>
-		/// Writes a buffer to the underlying writer and counts the number of bytes written.
-		/// </summary>
-		/// <param name="buffer">the buffer to write</param>
-		/// <param name="index">the start index to write from</param>
-		/// <param name="count">the number of characters to write</param>
-		/// <remarks>
-		/// <para>
-		/// Overrides implementation of <see cref="QuietTextWriter"/>. Counts
-		/// the number of bytes written.
-		/// </para>
-		/// </remarks>
-		public override void Write(char[] buffer, int index, int count) 
-		{
-			if (count > 0)
-			{
-				try 
-				{
-					base.Write(buffer, index, count);
+    /// <summary>
+    /// Writes a character to the underlying writer and counts the number of bytes written.
+    /// </summary>
+    /// <param name="value">the char to write</param>
+    /// <remarks>
+    /// <para>
+    /// Overrides implementation of <see cref="QuietTextWriter"/>. Counts
+    /// the number of bytes written.
+    /// </para>
+    /// </remarks>
+    public override void Write(char value)
+    {
+      try
+      {
+        base.Write(value);
 
-					// get the number of bytes needed to represent the 
-					// char array using the supplied encoding.
-					m_countBytes += this.Encoding.GetByteCount(buffer, index, count);
-				} 
-				catch(Exception e) 
-				{
-					this.ErrorHandler.Error("Failed to write buffer.", e, ErrorCode.WriteFailure);
-				}
-			}
-		}
+        // get the number of bytes needed to represent the 
+        // char using the supplied encoding.
+        m_countBytes += this.Encoding.GetByteCount(new char[] { value });
+      }
+      catch (Exception e)
+      {
+        this.ErrorHandler.Error("Failed to write [" + value + "].", e, ErrorCode.WriteFailure);
+      }
+    }
 
-		/// <summary>
-		/// Writes a string to the output and counts the number of bytes written.
-		/// </summary>
-		/// <param name="str">The string data to write to the output.</param>
-		/// <remarks>
-		/// <para>
-		/// Overrides implementation of <see cref="QuietTextWriter"/>. Counts
-		/// the number of bytes written.
-		/// </para>
-		/// </remarks>
-		public override void Write(string str) 
-		{
-			if (str != null && str.Length > 0)
-			{
-				try 
-				{
-					base.Write(str);
+    /// <summary>
+    /// Writes a buffer to the underlying writer and counts the number of bytes written.
+    /// </summary>
+    /// <param name="buffer">the buffer to write</param>
+    /// <param name="index">the start index to write from</param>
+    /// <param name="count">the number of characters to write</param>
+    /// <remarks>
+    /// <para>
+    /// Overrides implementation of <see cref="QuietTextWriter"/>. Counts
+    /// the number of bytes written.
+    /// </para>
+    /// </remarks>
+    public override void Write(char[] buffer, int index, int count)
+    {
+      if (count > 0)
+      {
+        try
+        {
+          base.Write(buffer, index, count);
 
-					// get the number of bytes needed to represent the 
-					// string using the supplied encoding.
-					m_countBytes += this.Encoding.GetByteCount(str);
-				}
-				catch(Exception e) 
-				{
-					this.ErrorHandler.Error("Failed to write [" + str + "].", e, ErrorCode.WriteFailure);
-				}
-			}
-		}
-		
-		#endregion Override implementation of QuietTextWriter
+          // get the number of bytes needed to represent the 
+          // char array using the supplied encoding.
+          m_countBytes += this.Encoding.GetByteCount(buffer, index, count);
+        }
+        catch (Exception e)
+        {
+          this.ErrorHandler.Error("Failed to write buffer.", e, ErrorCode.WriteFailure);
+        }
+      }
+    }
 
-		#region Public Instance Properties
+    /// <summary>
+    /// Writes a string to the output and counts the number of bytes written.
+    /// </summary>
+    /// <param name="str">The string data to write to the output.</param>
+    /// <remarks>
+    /// <para>
+    /// Overrides implementation of <see cref="QuietTextWriter"/>. Counts
+    /// the number of bytes written.
+    /// </para>
+    /// </remarks>
+    public override void Write(string str)
+    {
+      if (str != null && str.Length > 0)
+      {
+        try
+        {
+          base.Write(str);
 
-		/// <summary>
-		/// Gets or sets the total number of bytes written.
-		/// </summary>
-		/// <value>
-		/// The total number of bytes written.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the total number of bytes written.
-		/// </para>
-		/// </remarks>
-		public long Count 
-		{
-			get { return m_countBytes; }
-			set { m_countBytes = value; }
-		}
+          // get the number of bytes needed to represent the 
+          // string using the supplied encoding.
+          m_countBytes += this.Encoding.GetByteCount(str);
+        }
+        catch (Exception e)
+        {
+          this.ErrorHandler.Error("Failed to write [" + str + "].", e, ErrorCode.WriteFailure);
+        }
+      }
+    }
 
-		#endregion Public Instance Properties
-  
-		#region Private Instance Fields
+    #endregion Override implementation of QuietTextWriter
 
-		/// <summary>
-		/// Total number of bytes written.
-		/// </summary>
-		private long m_countBytes;
+    #region Public Instance Properties
 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// Gets or sets the total number of bytes written.
+    /// </summary>
+    /// <value>
+    /// The total number of bytes written.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the total number of bytes written.
+    /// </para>
+    /// </remarks>
+    public long Count
+    {
+      get { return m_countBytes; }
+      set { m_countBytes = value; }
+    }
+
+    #endregion Public Instance Properties
+
+    #region Private Instance Fields
+
+    /// <summary>
+    /// Total number of bytes written.
+    /// </summary>
+    private long m_countBytes;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Util/CyclicBuffer.cs b/src/log4net/Util/CyclicBuffer.cs
index bc8c902..f99fb48 100644
--- a/src/log4net/Util/CyclicBuffer.cs
+++ b/src/log4net/Util/CyclicBuffer.cs
@@ -23,333 +23,333 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// A fixed size rolling buffer of logging events.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// An array backed fixed size leaky bucket.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class CyclicBuffer
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// A fixed size rolling buffer of logging events.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// An array backed fixed size leaky bucket.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class CyclicBuffer
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="maxSize">The maximum number of logging events in the buffer.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="CyclicBuffer" /> class with 
-		/// the specified maximum number of buffered logging events.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentOutOfRangeException">The <paramref name="maxSize"/> argument is not a positive integer.</exception>
-		public CyclicBuffer(int maxSize) 
-		{
-			if (maxSize < 1) 
-			{
-				throw SystemInfo.CreateArgumentOutOfRangeException("maxSize", (object)maxSize, "Parameter: maxSize, Value: [" + maxSize + "] out of range. Non zero positive integer required");
-			}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="maxSize">The maximum number of logging events in the buffer.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="CyclicBuffer" /> class with 
+    /// the specified maximum number of buffered logging events.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentOutOfRangeException">The <paramref name="maxSize"/> argument is not a positive integer.</exception>
+    public CyclicBuffer(int maxSize)
+    {
+      if (maxSize < 1)
+      {
+        throw SystemInfo.CreateArgumentOutOfRangeException("maxSize", (object)maxSize, "Parameter: maxSize, Value: [" + maxSize + "] out of range. Non zero positive integer required");
+      }
 
-			m_maxSize = maxSize;
-			m_events = new LoggingEvent[maxSize];
-			m_first = 0;
-			m_last = 0;
-			m_numElems = 0;
-		}
+      m_maxSize = maxSize;
+      m_events = new LoggingEvent[maxSize];
+      m_first = 0;
+      m_last = 0;
+      m_numElems = 0;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Methods
-	
-		/// <summary>
-		/// Appends a <paramref name="loggingEvent"/> to the buffer.
-		/// </summary>
-		/// <param name="loggingEvent">The event to append to the buffer.</param>
-		/// <returns>The event discarded from the buffer, if the buffer is full, otherwise <c>null</c>.</returns>
-		/// <remarks>
-		/// <para>
-		/// Append an event to the buffer. If the buffer still contains free space then
-		/// <c>null</c> is returned. If the buffer is full then an event will be dropped
-		/// to make space for the new event, the event dropped is returned.
-		/// </para>
-		/// </remarks>
-		public LoggingEvent Append(LoggingEvent loggingEvent)
-		{	
-			if (loggingEvent == null)
-			{
-				throw new ArgumentNullException("loggingEvent");
-			}
+    #region Public Instance Methods
 
-			lock(this)
-			{
-				// save the discarded event
-				LoggingEvent discardedLoggingEvent = m_events[m_last];
+    /// <summary>
+    /// Appends a <paramref name="loggingEvent"/> to the buffer.
+    /// </summary>
+    /// <param name="loggingEvent">The event to append to the buffer.</param>
+    /// <returns>The event discarded from the buffer, if the buffer is full, otherwise <c>null</c>.</returns>
+    /// <remarks>
+    /// <para>
+    /// Append an event to the buffer. If the buffer still contains free space then
+    /// <c>null</c> is returned. If the buffer is full then an event will be dropped
+    /// to make space for the new event, the event dropped is returned.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent Append(LoggingEvent loggingEvent)
+    {
+      if (loggingEvent == null)
+      {
+        throw new ArgumentNullException("loggingEvent");
+      }
 
-				// overwrite the last event position
-				m_events[m_last] = loggingEvent;	
-				if (++m_last == m_maxSize)
-				{
-					m_last = 0;
-				}
+      lock (this)
+      {
+        // save the discarded event
+        LoggingEvent discardedLoggingEvent = m_events[m_last];
 
-				if (m_numElems < m_maxSize)
-				{
-					m_numElems++;
-				}
-				else if (++m_first == m_maxSize)
-				{
-					m_first = 0;
-				}
+        // overwrite the last event position
+        m_events[m_last] = loggingEvent;
+        if (++m_last == m_maxSize)
+        {
+          m_last = 0;
+        }
 
-				if (m_numElems < m_maxSize)
-				{
-					// Space remaining
-					return null;
-				}
-				else
-				{
-					// Buffer is full and discarding an event
-					return discardedLoggingEvent;
-				}
-			}
-		}
+        if (m_numElems < m_maxSize)
+        {
+          m_numElems++;
+        }
+        else if (++m_first == m_maxSize)
+        {
+          m_first = 0;
+        }
 
-		/// <summary>
-		/// Get and remove the oldest event in the buffer.
-		/// </summary>
-		/// <returns>The oldest logging event in the buffer</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the oldest (first) logging event in the buffer and removes it 
-		/// from the buffer.
-		/// </para>
-		/// </remarks>
-		public LoggingEvent PopOldest() 
-		{
-			lock(this)
-			{
-				LoggingEvent ret = null;
-				if (m_numElems > 0) 
-				{
-					m_numElems--;
-					ret = m_events[m_first];
-					m_events[m_first] = null;
-					if (++m_first == m_maxSize)
-					{
-						m_first = 0;
-					}
-				} 
-				return ret;
-			}
-		}
+        if (m_numElems < m_maxSize)
+        {
+          // Space remaining
+          return null;
+        }
+        else
+        {
+          // Buffer is full and discarding an event
+          return discardedLoggingEvent;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Pops all the logging events from the buffer into an array.
-		/// </summary>
-		/// <returns>An array of all the logging events in the buffer.</returns>
-		/// <remarks>
-		/// <para>
-		/// Get all the events in the buffer and clear the buffer.
-		/// </para>
-		/// </remarks>
-		public LoggingEvent[] PopAll()
-		{
-			lock(this)
-			{
-				LoggingEvent[] ret = new LoggingEvent[m_numElems];
+    /// <summary>
+    /// Get and remove the oldest event in the buffer.
+    /// </summary>
+    /// <returns>The oldest logging event in the buffer</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the oldest (first) logging event in the buffer and removes it 
+    /// from the buffer.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent PopOldest()
+    {
+      lock (this)
+      {
+        LoggingEvent ret = null;
+        if (m_numElems > 0)
+        {
+          m_numElems--;
+          ret = m_events[m_first];
+          m_events[m_first] = null;
+          if (++m_first == m_maxSize)
+          {
+            m_first = 0;
+          }
+        }
+        return ret;
+      }
+    }
 
-				if (m_numElems > 0)
-				{
-					if (m_first < m_last)
-					{
-						Array.Copy(m_events, m_first, ret, 0, m_numElems);
-					}
-					else
-					{
-						Array.Copy(m_events, m_first, ret, 0, m_maxSize - m_first);
-						Array.Copy(m_events, 0, ret, m_maxSize - m_first, m_last);
-					}
-				}
+    /// <summary>
+    /// Pops all the logging events from the buffer into an array.
+    /// </summary>
+    /// <returns>An array of all the logging events in the buffer.</returns>
+    /// <remarks>
+    /// <para>
+    /// Get all the events in the buffer and clear the buffer.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent[] PopAll()
+    {
+      lock (this)
+      {
+        LoggingEvent[] ret = new LoggingEvent[m_numElems];
 
-				Clear();
+        if (m_numElems > 0)
+        {
+          if (m_first < m_last)
+          {
+            Array.Copy(m_events, m_first, ret, 0, m_numElems);
+          }
+          else
+          {
+            Array.Copy(m_events, m_first, ret, 0, m_maxSize - m_first);
+            Array.Copy(m_events, 0, ret, m_maxSize - m_first, m_last);
+          }
+        }
 
-				return ret;
-			}
-		}
+        Clear();
 
-		/// <summary>
-		/// Clear the buffer
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clear the buffer of all events. The events in the buffer are lost.
-		/// </para>
-		/// </remarks>
-		public void Clear()
-		{
-			lock(this)
-			{
-				// Set all the elements to null
-				Array.Clear(m_events, 0, m_events.Length);
+        return ret;
+      }
+    }
 
-				m_first = 0;
-				m_last = 0;
-				m_numElems = 0;
-			}
-		}
+    /// <summary>
+    /// Clear the buffer
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clear the buffer of all events. The events in the buffer are lost.
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      lock (this)
+      {
+        // Set all the elements to null
+        Array.Clear(m_events, 0, m_events.Length);
+
+        m_first = 0;
+        m_last = 0;
+        m_numElems = 0;
+      }
+    }
 
 #if RESIZABLE_CYCLIC_BUFFER
-		/// <summary>
-		/// Resizes the cyclic buffer to <paramref name="newSize"/>.
-		/// </summary>
-		/// <param name="newSize">The new size of the buffer.</param>
-		/// <remarks>
-		/// <para>
-		/// Resize the cyclic buffer. Events in the buffer are copied into
-		/// the newly sized buffer. If the buffer is shrunk and there are
-		/// more events currently in the buffer than the new size of the
-		/// buffer then the newest events will be dropped from the buffer.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentOutOfRangeException">The <paramref name="newSize"/> argument is not a positive integer.</exception>
-		public void Resize(int newSize) 
-		{
-			lock(this)
-			{
-				if (newSize < 0) 
-				{
-					throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("newSize", (object)newSize, "Parameter: newSize, Value: [" + newSize + "] out of range. Non zero positive integer required");
-				}
-				if (newSize == m_numElems)
-				{
-					return; // nothing to do
-				}
-	
-				LoggingEvent[] temp = new  LoggingEvent[newSize];
+    /// <summary>
+    /// Resizes the cyclic buffer to <paramref name="newSize"/>.
+    /// </summary>
+    /// <param name="newSize">The new size of the buffer.</param>
+    /// <remarks>
+    /// <para>
+    /// Resize the cyclic buffer. Events in the buffer are copied into
+    /// the newly sized buffer. If the buffer is shrunk and there are
+    /// more events currently in the buffer than the new size of the
+    /// buffer then the newest events will be dropped from the buffer.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentOutOfRangeException">The <paramref name="newSize"/> argument is not a positive integer.</exception>
+    public void Resize(int newSize) 
+    {
+      lock(this)
+      {
+        if (newSize < 0) 
+        {
+          throw log4net.Util.SystemInfo.CreateArgumentOutOfRangeException("newSize", (object)newSize, "Parameter: newSize, Value: [" + newSize + "] out of range. Non zero positive integer required");
+        }
+        if (newSize == m_numElems)
+        {
+          return; // nothing to do
+        }
+  
+        LoggingEvent[] temp = new  LoggingEvent[newSize];
 
-				int loopLen = (newSize < m_numElems) ? newSize : m_numElems;
-	
-				for(int i = 0; i < loopLen; i++) 
-				{
-					temp[i] = m_events[m_first];
-					m_events[m_first] = null;
+        int loopLen = (newSize < m_numElems) ? newSize : m_numElems;
+  
+        for(int i = 0; i < loopLen; i++) 
+        {
+          temp[i] = m_events[m_first];
+          m_events[m_first] = null;
 
-					if (++m_first == m_numElems) 
-					{
-						m_first = 0;
-					}
-				}
+          if (++m_first == m_numElems) 
+          {
+            m_first = 0;
+          }
+        }
 
-				m_events = temp;
-				m_first = 0;
-				m_numElems = loopLen;
-				m_maxSize = newSize;
+        m_events = temp;
+        m_first = 0;
+        m_numElems = loopLen;
+        m_maxSize = newSize;
 
-				if (loopLen == newSize) 
-				{
-					m_last = 0;
-				} 
-				else 
-				{
-					m_last = loopLen;
-				}
-			}
-		}
+        if (loopLen == newSize) 
+        {
+          m_last = 0;
+        } 
+        else 
+        {
+          m_last = loopLen;
+        }
+      }
+    }
 #endif
 
-		#endregion Public Instance Methods
+    #endregion Public Instance Methods
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the <paramref name="i"/>th oldest event currently in the buffer.
-		/// </summary>
-		/// <value>The <paramref name="i"/>th oldest event currently in the buffer.</value>
-		/// <remarks>
-		/// <para>
-		/// If <paramref name="i"/> is outside the range 0 to the number of events
-		/// currently in the buffer, then <c>null</c> is returned.
-		/// </para>
-		/// </remarks>
-		public LoggingEvent this[int i] 
-		{
-			get
-			{
-				lock(this)
-				{
-					if (i < 0 || i >= m_numElems)
-					{
-						return null;
-					}
+    /// <summary>
+    /// Gets the <paramref name="i"/>th oldest event currently in the buffer.
+    /// </summary>
+    /// <value>The <paramref name="i"/>th oldest event currently in the buffer.</value>
+    /// <remarks>
+    /// <para>
+    /// If <paramref name="i"/> is outside the range 0 to the number of events
+    /// currently in the buffer, then <c>null</c> is returned.
+    /// </para>
+    /// </remarks>
+    public LoggingEvent this[int i]
+    {
+      get
+      {
+        lock (this)
+        {
+          if (i < 0 || i >= m_numElems)
+          {
+            return null;
+          }
 
-					return m_events[(m_first + i) % m_maxSize];
-				}
-			}
-		}
+          return m_events[(m_first + i) % m_maxSize];
+        }
+      }
+    }
 
-		/// <summary>
-		/// Gets the maximum size of the buffer.
-		/// </summary>
-		/// <value>The maximum size of the buffer.</value>
-		/// <remarks>
-		/// <para>
-		/// Gets the maximum size of the buffer
-		/// </para>
-		/// </remarks>
-		public int MaxSize 
-		{
-			get 
-			{ 
-				lock(this)
-				{
-					return m_maxSize; 
-				}
-			}
+    /// <summary>
+    /// Gets the maximum size of the buffer.
+    /// </summary>
+    /// <value>The maximum size of the buffer.</value>
+    /// <remarks>
+    /// <para>
+    /// Gets the maximum size of the buffer
+    /// </para>
+    /// </remarks>
+    public int MaxSize
+    {
+      get
+      {
+        lock (this)
+        {
+          return m_maxSize;
+        }
+      }
 #if RESIZABLE_CYCLIC_BUFFER
-			set 
-			{ 
-				/// Setting the MaxSize will cause the buffer to resize.
-				Resize(value); 
-			}
+      set 
+      { 
+        /// Setting the MaxSize will cause the buffer to resize.
+        Resize(value); 
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Gets the number of logging events in the buffer.
-		/// </summary>
-		/// <value>The number of logging events in the buffer.</value>
-		/// <remarks>
-		/// <para>
-		/// This number is guaranteed to be in the range 0 to <see cref="MaxSize"/>
-		/// (inclusive).
-		/// </para>
-		/// </remarks>
-		public int Length
-		{
-			get 
-			{ 
-				lock(this) 
-				{ 
-					return m_numElems; 
-				}
-			}									
-		}
+    /// <summary>
+    /// Gets the number of logging events in the buffer.
+    /// </summary>
+    /// <value>The number of logging events in the buffer.</value>
+    /// <remarks>
+    /// <para>
+    /// This number is guaranteed to be in the range 0 to <see cref="MaxSize"/>
+    /// (inclusive).
+    /// </para>
+    /// </remarks>
+    public int Length
+    {
+      get
+      {
+        lock (this)
+        {
+          return m_numElems;
+        }
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private LoggingEvent[] m_events;
-		private int m_first; 
-		private int m_last; 
-		private int m_numElems;
-		private int m_maxSize;
+    private LoggingEvent[] m_events;
+    private int m_first;
+    private int m_last;
+    private int m_numElems;
+    private int m_maxSize;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Util/EmptyCollection.cs b/src/log4net/Util/EmptyCollection.cs
index 1222587..ab36d94 100644
--- a/src/log4net/Util/EmptyCollection.cs
+++ b/src/log4net/Util/EmptyCollection.cs
@@ -22,157 +22,157 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// An always empty <see cref="ICollection"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A singleton implementation of the <see cref="ICollection"/>
-	/// interface that always represents an empty collection.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// An always empty <see cref="ICollection"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A singleton implementation of the <see cref="ICollection"/>
+  /// interface that always represents an empty collection.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
-	public sealed class EmptyCollection : ICollection
-	{
-		#region Private Instance Constructors
+  public sealed class EmptyCollection : ICollection
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="EmptyCollection" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to enforce the singleton pattern.
-		/// </para>
-		/// </remarks>
-		private EmptyCollection()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="EmptyCollection" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to enforce the singleton pattern.
+    /// </para>
+    /// </remarks>
+    private EmptyCollection()
+    {
+    }
 
-		#endregion Private Instance Constructors
-  
-		#region Public Static Properties
+    #endregion Private Instance Constructors
 
-		/// <summary>
-		/// Gets the singleton instance of the empty collection.
-		/// </summary>
-		/// <returns>The singleton instance of the empty collection.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the singleton instance of the empty collection.
-		/// </para>
-		/// </remarks>
-		public static EmptyCollection Instance
-		{
-			get { return s_instance; }
-		}
+    #region Public Static Properties
 
-		#endregion Public Static Properties
+    /// <summary>
+    /// Gets the singleton instance of the empty collection.
+    /// </summary>
+    /// <returns>The singleton instance of the empty collection.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the singleton instance of the empty collection.
+    /// </para>
+    /// </remarks>
+    public static EmptyCollection Instance
+    {
+      get { return s_instance; }
+    }
 
-		#region Implementation of ICollection
+    #endregion Public Static Properties
 
-		/// <summary>
-		/// Copies the elements of the <see cref="ICollection"/> to an 
-		/// <see cref="Array"/>, starting at a particular Array index.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="Array"/> 
-		/// that is the destination of the elements copied from 
-		/// <see cref="ICollection"/>. The Array must have zero-based 
-		/// indexing.</param>
-		/// <param name="index">The zero-based index in array at which 
-		/// copying begins.</param>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty no values are copied into the array.
-		/// </para>
-		/// </remarks>
-		public void CopyTo(System.Array array, int index)
-		{
-			// copy nothing
-		}
+    #region Implementation of ICollection
 
-		/// <summary>
-		/// Gets a value indicating if access to the <see cref="ICollection"/> is synchronized (thread-safe).
-		/// </summary>
-		/// <value>
-		/// <b>true</b> if access to the <see cref="ICollection"/> is synchronized (thread-safe); otherwise, <b>false</b>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// For the <see cref="EmptyCollection"/> this property is always <c>true</c>.
-		/// </para>
-		/// </remarks>
-		public bool IsSynchronized
-		{
-			get	{ return true; }
-		}
+    /// <summary>
+    /// Copies the elements of the <see cref="ICollection"/> to an 
+    /// <see cref="Array"/>, starting at a particular Array index.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="Array"/> 
+    /// that is the destination of the elements copied from 
+    /// <see cref="ICollection"/>. The Array must have zero-based 
+    /// indexing.</param>
+    /// <param name="index">The zero-based index in array at which 
+    /// copying begins.</param>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty no values are copied into the array.
+    /// </para>
+    /// </remarks>
+    public void CopyTo(System.Array array, int index)
+    {
+      // copy nothing
+    }
 
-		/// <summary>
-		/// Gets the number of elements contained in the <see cref="ICollection"/>.
-		/// </summary>
-		/// <value>
-		/// The number of elements contained in the <see cref="ICollection"/>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty the <see cref="Count"/> is always <c>0</c>.
-		/// </para>
-		/// </remarks>
-		public int Count
-		{
-			get { return 0; }
-		}
+    /// <summary>
+    /// Gets a value indicating if access to the <see cref="ICollection"/> is synchronized (thread-safe).
+    /// </summary>
+    /// <value>
+    /// <b>true</b> if access to the <see cref="ICollection"/> is synchronized (thread-safe); otherwise, <b>false</b>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// For the <see cref="EmptyCollection"/> this property is always <c>true</c>.
+    /// </para>
+    /// </remarks>
+    public bool IsSynchronized
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Gets an object that can be used to synchronize access to the <see cref="ICollection"/>.
-		/// </summary>
-		/// <value>
-		/// An object that can be used to synchronize access to the <see cref="ICollection"/>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty and thread safe and synchronized this instance is also
-		/// the <see cref="SyncRoot"/> object.
-		/// </para>
-		/// </remarks>
-		public object SyncRoot
-		{
-			get { return this; }
-		}
+    /// <summary>
+    /// Gets the number of elements contained in the <see cref="ICollection"/>.
+    /// </summary>
+    /// <value>
+    /// The number of elements contained in the <see cref="ICollection"/>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty the <see cref="Count"/> is always <c>0</c>.
+    /// </para>
+    /// </remarks>
+    public int Count
+    {
+      get { return 0; }
+    }
 
-		#endregion Implementation of ICollection
+    /// <summary>
+    /// Gets an object that can be used to synchronize access to the <see cref="ICollection"/>.
+    /// </summary>
+    /// <value>
+    /// An object that can be used to synchronize access to the <see cref="ICollection"/>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty and thread safe and synchronized this instance is also
+    /// the <see cref="SyncRoot"/> object.
+    /// </para>
+    /// </remarks>
+    public object SyncRoot
+    {
+      get { return this; }
+    }
 
-		#region Implementation of IEnumerable
+    #endregion Implementation of ICollection
 
-		/// <summary>
-		/// Returns an enumerator that can iterate through a collection.
-		/// </summary>
-		/// <returns>
-		/// An <see cref="IEnumerator"/> that can be used to 
-		/// iterate through the collection.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty a <see cref="NullEnumerator"/> is returned.
-		/// </para>
-		/// </remarks>
-		public IEnumerator GetEnumerator()
-		{
-			return NullEnumerator.Instance;
-		}
+    #region Implementation of IEnumerable
 
-		#endregion Implementation of IEnumerable
+    /// <summary>
+    /// Returns an enumerator that can iterate through a collection.
+    /// </summary>
+    /// <returns>
+    /// An <see cref="IEnumerator"/> that can be used to 
+    /// iterate through the collection.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty a <see cref="NullEnumerator"/> is returned.
+    /// </para>
+    /// </remarks>
+    public IEnumerator GetEnumerator()
+    {
+      return NullEnumerator.Instance;
+    }
 
-		#region Private Static Fields
+    #endregion Implementation of IEnumerable
 
-		/// <summary>
-		/// The singleton instance of the empty collection.
-		/// </summary>
-		private static readonly EmptyCollection s_instance = new EmptyCollection();
-  
-		#endregion Private Static Fields
-	}
+    #region Private Static Fields
+
+    /// <summary>
+    /// The singleton instance of the empty collection.
+    /// </summary>
+    private static readonly EmptyCollection s_instance = new EmptyCollection();
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/EmptyDictionary.cs b/src/log4net/Util/EmptyDictionary.cs
index 792a781..a35d3f9 100644
--- a/src/log4net/Util/EmptyDictionary.cs
+++ b/src/log4net/Util/EmptyDictionary.cs
@@ -22,318 +22,318 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// An always empty <see cref="IDictionary"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A singleton implementation of the <see cref="IDictionary"/>
-	/// interface that always represents an empty collection.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// An always empty <see cref="IDictionary"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A singleton implementation of the <see cref="IDictionary"/>
+  /// interface that always represents an empty collection.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
-	public sealed class EmptyDictionary : IDictionary
-	{
-		#region Private Instance Constructors
+  public sealed class EmptyDictionary : IDictionary
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="EmptyDictionary" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to enforce the singleton pattern.
-		/// </para>
-		/// </remarks>
-		private EmptyDictionary()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="EmptyDictionary" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to enforce the singleton pattern.
+    /// </para>
+    /// </remarks>
+    private EmptyDictionary()
+    {
+    }
 
-		#endregion Private Instance Constructors
-  
-		#region Public Static Properties
+    #endregion Private Instance Constructors
 
-		/// <summary>
-		/// Gets the singleton instance of the <see cref="EmptyDictionary" />.
-		/// </summary>
-		/// <returns>The singleton instance of the <see cref="EmptyDictionary" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the singleton instance of the <see cref="EmptyDictionary" />.
-		/// </para>
-		/// </remarks>
-		public static EmptyDictionary Instance
-		{
-			get { return s_instance; }
-		}
+    #region Public Static Properties
 
-		#endregion Public Static Properties
+    /// <summary>
+    /// Gets the singleton instance of the <see cref="EmptyDictionary" />.
+    /// </summary>
+    /// <returns>The singleton instance of the <see cref="EmptyDictionary" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the singleton instance of the <see cref="EmptyDictionary" />.
+    /// </para>
+    /// </remarks>
+    public static EmptyDictionary Instance
+    {
+      get { return s_instance; }
+    }
 
-		#region Implementation of ICollection
+    #endregion Public Static Properties
 
-		/// <summary>
-		/// Copies the elements of the <see cref="ICollection"/> to an 
-		/// <see cref="Array"/>, starting at a particular Array index.
-		/// </summary>
-		/// <param name="array">The one-dimensional <see cref="Array"/> 
-		/// that is the destination of the elements copied from 
-		/// <see cref="ICollection"/>. The Array must have zero-based 
-		/// indexing.</param>
-		/// <param name="index">The zero-based index in array at which 
-		/// copying begins.</param>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty no values are copied into the array.
-		/// </para>
-		/// </remarks>
-		public void CopyTo(System.Array array, int index)
-		{
-			// copy nothing
-		}
+    #region Implementation of ICollection
 
-		/// <summary>
-		/// Gets a value indicating if access to the <see cref="ICollection"/> is synchronized (thread-safe).
-		/// </summary>
-		/// <value>
-		/// <b>true</b> if access to the <see cref="ICollection"/> is synchronized (thread-safe); otherwise, <b>false</b>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// For the <see cref="EmptyCollection"/> this property is always <b>true</b>.
-		/// </para>
-		/// </remarks>
-		public bool IsSynchronized
-		{
-			get	{ return true; }
-		}
+    /// <summary>
+    /// Copies the elements of the <see cref="ICollection"/> to an 
+    /// <see cref="Array"/>, starting at a particular Array index.
+    /// </summary>
+    /// <param name="array">The one-dimensional <see cref="Array"/> 
+    /// that is the destination of the elements copied from 
+    /// <see cref="ICollection"/>. The Array must have zero-based 
+    /// indexing.</param>
+    /// <param name="index">The zero-based index in array at which 
+    /// copying begins.</param>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty no values are copied into the array.
+    /// </para>
+    /// </remarks>
+    public void CopyTo(System.Array array, int index)
+    {
+      // copy nothing
+    }
 
-		/// <summary>
-		/// Gets the number of elements contained in the <see cref="ICollection"/>
-		/// </summary>
-		/// <value>
-		/// The number of elements contained in the <see cref="ICollection"/>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty the <see cref="Count"/> is always <c>0</c>.
-		/// </para>
-		/// </remarks>
-		public int Count
-		{
-			get { return 0; }
-		}
+    /// <summary>
+    /// Gets a value indicating if access to the <see cref="ICollection"/> is synchronized (thread-safe).
+    /// </summary>
+    /// <value>
+    /// <b>true</b> if access to the <see cref="ICollection"/> is synchronized (thread-safe); otherwise, <b>false</b>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// For the <see cref="EmptyCollection"/> this property is always <b>true</b>.
+    /// </para>
+    /// </remarks>
+    public bool IsSynchronized
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Gets an object that can be used to synchronize access to the <see cref="ICollection"/>.
-		/// </summary>
-		/// <value>
-		/// An object that can be used to synchronize access to the <see cref="ICollection"/>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty and thread safe and synchronized this instance is also
-		/// the <see cref="SyncRoot"/> object.
-		/// </para>
-		/// </remarks>
-		public object SyncRoot
-		{
-			get { return this; }
-		}
+    /// <summary>
+    /// Gets the number of elements contained in the <see cref="ICollection"/>
+    /// </summary>
+    /// <value>
+    /// The number of elements contained in the <see cref="ICollection"/>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty the <see cref="Count"/> is always <c>0</c>.
+    /// </para>
+    /// </remarks>
+    public int Count
+    {
+      get { return 0; }
+    }
 
-		#endregion Implementation of ICollection
+    /// <summary>
+    /// Gets an object that can be used to synchronize access to the <see cref="ICollection"/>.
+    /// </summary>
+    /// <value>
+    /// An object that can be used to synchronize access to the <see cref="ICollection"/>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty and thread safe and synchronized this instance is also
+    /// the <see cref="SyncRoot"/> object.
+    /// </para>
+    /// </remarks>
+    public object SyncRoot
+    {
+      get { return this; }
+    }
 
-		#region Implementation of IEnumerable
+    #endregion Implementation of ICollection
 
-		/// <summary>
-		/// Returns an enumerator that can iterate through a collection.
-		/// </summary>
-		/// <returns>
-		/// An <see cref="IEnumerator"/> that can be used to 
-		/// iterate through the collection.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty a <see cref="NullEnumerator"/> is returned.
-		/// </para>
-		/// </remarks>
-		IEnumerator IEnumerable.GetEnumerator()
-		{
-			return NullEnumerator.Instance;
-		}
+    #region Implementation of IEnumerable
 
-		#endregion Implementation of IEnumerable
+    /// <summary>
+    /// Returns an enumerator that can iterate through a collection.
+    /// </summary>
+    /// <returns>
+    /// An <see cref="IEnumerator"/> that can be used to 
+    /// iterate through the collection.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty a <see cref="NullEnumerator"/> is returned.
+    /// </para>
+    /// </remarks>
+    IEnumerator IEnumerable.GetEnumerator()
+    {
+      return NullEnumerator.Instance;
+    }
 
-		#region Implementation of IDictionary
+    #endregion Implementation of IEnumerable
 
-		/// <summary>
-		/// Adds an element with the provided key and value to the 
-		/// <see cref="EmptyDictionary" />.
-		/// </summary>
-		/// <param name="key">The <see cref="object" /> to use as the key of the element to add.</param>
-		/// <param name="value">The <see cref="object" /> to use as the value of the element to add.</param>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty no new values can be added. A <see cref="InvalidOperationException"/>
-		/// is thrown if this method is called.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
-		public void Add(object key, object value)
-		{
-			throw new InvalidOperationException();
-		}
+    #region Implementation of IDictionary
 
-		/// <summary>
-		/// Removes all elements from the <see cref="EmptyDictionary" />.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty no values can be removed. A <see cref="InvalidOperationException"/>
-		/// is thrown if this method is called.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
-		public void Clear()
-		{
-			throw new InvalidOperationException();
-		}
+    /// <summary>
+    /// Adds an element with the provided key and value to the 
+    /// <see cref="EmptyDictionary" />.
+    /// </summary>
+    /// <param name="key">The <see cref="object" /> to use as the key of the element to add.</param>
+    /// <param name="value">The <see cref="object" /> to use as the value of the element to add.</param>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty no new values can be added. A <see cref="InvalidOperationException"/>
+    /// is thrown if this method is called.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+    public void Add(object key, object value)
+    {
+      throw new InvalidOperationException();
+    }
 
-		/// <summary>
-		/// Determines whether the <see cref="EmptyDictionary" /> contains an element 
-		/// with the specified key.
-		/// </summary>
-		/// <param name="key">The key to locate in the <see cref="EmptyDictionary" />.</param>
-		/// <returns><c>false</c></returns>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty the <see cref="Contains"/> method always returns <c>false</c>.
-		/// </para>
-		/// </remarks>
-		public bool Contains(object key)
-		{
-			return false;
-		}
+    /// <summary>
+    /// Removes all elements from the <see cref="EmptyDictionary" />.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty no values can be removed. A <see cref="InvalidOperationException"/>
+    /// is thrown if this method is called.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+    public void Clear()
+    {
+      throw new InvalidOperationException();
+    }
 
-		/// <summary>
-		/// Returns an enumerator that can iterate through a collection.
-		/// </summary>
-		/// <returns>
-		/// An <see cref="IEnumerator"/> that can be used to 
-		/// iterate through the collection.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty a <see cref="NullEnumerator"/> is returned.
-		/// </para>
-		/// </remarks>
-		public IDictionaryEnumerator GetEnumerator()
-		{
-			return NullDictionaryEnumerator.Instance;
-		}
+    /// <summary>
+    /// Determines whether the <see cref="EmptyDictionary" /> contains an element 
+    /// with the specified key.
+    /// </summary>
+    /// <param name="key">The key to locate in the <see cref="EmptyDictionary" />.</param>
+    /// <returns><c>false</c></returns>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty the <see cref="Contains"/> method always returns <c>false</c>.
+    /// </para>
+    /// </remarks>
+    public bool Contains(object key)
+    {
+      return false;
+    }
 
-		/// <summary>
-		/// Removes the element with the specified key from the <see cref="EmptyDictionary" />.
-		/// </summary>
-		/// <param name="key">The key of the element to remove.</param>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty no values can be removed. A <see cref="InvalidOperationException"/>
-		/// is thrown if this method is called.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
-		public void Remove(object key)
-		{
-			throw new InvalidOperationException();
-		}
+    /// <summary>
+    /// Returns an enumerator that can iterate through a collection.
+    /// </summary>
+    /// <returns>
+    /// An <see cref="IEnumerator"/> that can be used to 
+    /// iterate through the collection.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty a <see cref="NullEnumerator"/> is returned.
+    /// </para>
+    /// </remarks>
+    public IDictionaryEnumerator GetEnumerator()
+    {
+      return NullDictionaryEnumerator.Instance;
+    }
 
-		/// <summary>
-		/// Gets a value indicating whether the <see cref="EmptyDictionary" /> has a fixed size.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty <see cref="IsFixedSize"/> always returns <c>true</c>.
-		/// </para>
-		/// </remarks>
-		public bool IsFixedSize
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// Removes the element with the specified key from the <see cref="EmptyDictionary" />.
+    /// </summary>
+    /// <param name="key">The key of the element to remove.</param>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty no values can be removed. A <see cref="InvalidOperationException"/>
+    /// is thrown if this method is called.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+    public void Remove(object key)
+    {
+      throw new InvalidOperationException();
+    }
 
-		/// <summary>
-		/// Gets a value indicating whether the <see cref="EmptyDictionary" /> is read-only.
-		/// </summary>
-		/// <value><c>true</c></value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty <see cref="IsReadOnly"/> always returns <c>true</c>.
-		/// </para>
-		/// </remarks>
-		public bool IsReadOnly
-		{
-			get	{ return true; }
-		}
+    /// <summary>
+    /// Gets a value indicating whether the <see cref="EmptyDictionary" /> has a fixed size.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty <see cref="IsFixedSize"/> always returns <c>true</c>.
+    /// </para>
+    /// </remarks>
+    public bool IsFixedSize
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Gets an <see cref="ICollection" /> containing the keys of the <see cref="EmptyDictionary" />.
-		/// </summary>
-		/// <value>An <see cref="ICollection" /> containing the keys of the <see cref="EmptyDictionary" />.</value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty a <see cref="EmptyCollection"/> is returned.
-		/// </para>
-		/// </remarks>
-		public System.Collections.ICollection Keys
-		{
-			get { return EmptyCollection.Instance; }
-		}
+    /// <summary>
+    /// Gets a value indicating whether the <see cref="EmptyDictionary" /> is read-only.
+    /// </summary>
+    /// <value><c>true</c></value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty <see cref="IsReadOnly"/> always returns <c>true</c>.
+    /// </para>
+    /// </remarks>
+    public bool IsReadOnly
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// Gets an <see cref="ICollection" /> containing the values of the <see cref="EmptyDictionary" />.
-		/// </summary>
-		/// <value>An <see cref="ICollection" /> containing the values of the <see cref="EmptyDictionary" />.</value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty a <see cref="EmptyCollection"/> is returned.
-		/// </para>
-		/// </remarks>
-		public System.Collections.ICollection Values
-		{
-			get { return EmptyCollection.Instance; }
-		}
+    /// <summary>
+    /// Gets an <see cref="ICollection" /> containing the keys of the <see cref="EmptyDictionary" />.
+    /// </summary>
+    /// <value>An <see cref="ICollection" /> containing the keys of the <see cref="EmptyDictionary" />.</value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty a <see cref="EmptyCollection"/> is returned.
+    /// </para>
+    /// </remarks>
+    public System.Collections.ICollection Keys
+    {
+      get { return EmptyCollection.Instance; }
+    }
 
-		/// <summary>
-		/// Gets or sets the element with the specified key.
-		/// </summary>
-		/// <param name="key">The key of the element to get or set.</param>
-		/// <value><c>null</c></value>
-		/// <remarks>
-		/// <para>
-		/// As the collection is empty no values can be looked up or stored. 
-		/// If the index getter is called then <c>null</c> is returned.
-		/// A <see cref="InvalidOperationException"/> is thrown if the setter is called.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
-		public object this[object key]
-		{
-			get { return null; }
-			set { throw new InvalidOperationException(); }
-		}
+    /// <summary>
+    /// Gets an <see cref="ICollection" /> containing the values of the <see cref="EmptyDictionary" />.
+    /// </summary>
+    /// <value>An <see cref="ICollection" /> containing the values of the <see cref="EmptyDictionary" />.</value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty a <see cref="EmptyCollection"/> is returned.
+    /// </para>
+    /// </remarks>
+    public System.Collections.ICollection Values
+    {
+      get { return EmptyCollection.Instance; }
+    }
 
-		#endregion Implementation of IDictionary
+    /// <summary>
+    /// Gets or sets the element with the specified key.
+    /// </summary>
+    /// <param name="key">The key of the element to get or set.</param>
+    /// <value><c>null</c></value>
+    /// <remarks>
+    /// <para>
+    /// As the collection is empty no values can be looked up or stored. 
+    /// If the index getter is called then <c>null</c> is returned.
+    /// A <see cref="InvalidOperationException"/> is thrown if the setter is called.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">This dictionary is always empty and cannot be modified.</exception>
+    public object this[object key]
+    {
+      get { return null; }
+      set { throw new InvalidOperationException(); }
+    }
 
-		#region Private Static Fields
+    #endregion Implementation of IDictionary
 
-		/// <summary>
-		/// The singleton instance of the empty dictionary.
-		/// </summary>
-		private static readonly EmptyDictionary s_instance = new EmptyDictionary();
-  
-		#endregion Private Static Fields
-	}
+    #region Private Static Fields
+
+    /// <summary>
+    /// The singleton instance of the empty dictionary.
+    /// </summary>
+    private static readonly EmptyDictionary s_instance = new EmptyDictionary();
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/FormattingInfo.cs b/src/log4net/Util/FormattingInfo.cs
index 4a6c9bb..6a6be4d 100644
--- a/src/log4net/Util/FormattingInfo.cs
+++ b/src/log4net/Util/FormattingInfo.cs
@@ -22,115 +22,115 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Contain the information obtained when parsing formatting modifiers 
-	/// in conversion modifiers.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Holds the formatting information extracted from the format string by
-	/// the <see cref="PatternParser"/>. This is used by the <see cref="PatternConverter"/>
-	/// objects when rendering the output.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class FormattingInfo
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Contain the information obtained when parsing formatting modifiers 
+  /// in conversion modifiers.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Holds the formatting information extracted from the format string by
+  /// the <see cref="PatternParser"/>. This is used by the <see cref="PatternConverter"/>
+  /// objects when rendering the output.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class FormattingInfo
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Defaut Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="FormattingInfo" /> class.
-		/// </para>
-		/// </remarks>
-		public FormattingInfo() 
-		{
-		}
+    /// <summary>
+    /// Defaut Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="FormattingInfo" /> class.
+    /// </para>
+    /// </remarks>
+    public FormattingInfo()
+    {
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="FormattingInfo" /> class
-		/// with the specified parameters.
-		/// </para>
-		/// </remarks>
-		public FormattingInfo(int min, int max, bool leftAlign) 
-		{
-			m_min = min;
-			m_max = max;
-			m_leftAlign = leftAlign;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="FormattingInfo" /> class
+    /// with the specified parameters.
+    /// </para>
+    /// </remarks>
+    public FormattingInfo(int min, int max, bool leftAlign)
+    {
+      m_min = min;
+      m_max = max;
+      m_leftAlign = leftAlign;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the minimum value.
-		/// </summary>
-		/// <value>
-		/// The minimum value.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the minimum value.
-		/// </para>
-		/// </remarks>
-		public int Min
-		{
-			get { return m_min; }
-			set { m_min = value; }
-		}
+    /// <summary>
+    /// Gets or sets the minimum value.
+    /// </summary>
+    /// <value>
+    /// The minimum value.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the minimum value.
+    /// </para>
+    /// </remarks>
+    public int Min
+    {
+      get { return m_min; }
+      set { m_min = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the maximum value.
-		/// </summary>
-		/// <value>
-		/// The maximum value.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the maximum value.
-		/// </para>
-		/// </remarks>
-		public int Max
-		{
-			get { return m_max; }
-			set { m_max = value; }
-		}
+    /// <summary>
+    /// Gets or sets the maximum value.
+    /// </summary>
+    /// <value>
+    /// The maximum value.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the maximum value.
+    /// </para>
+    /// </remarks>
+    public int Max
+    {
+      get { return m_max; }
+      set { m_max = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets a flag indicating whether left align is enabled
-		/// or not.
-		/// </summary>
-		/// <value>
-		/// A flag indicating whether left align is enabled or not.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets a flag indicating whether left align is enabled or not.
-		/// </para>
-		/// </remarks>
-		public bool LeftAlign
-		{
-			get { return m_leftAlign; }
-			set { m_leftAlign = value; }
-		}
+    /// <summary>
+    /// Gets or sets a flag indicating whether left align is enabled
+    /// or not.
+    /// </summary>
+    /// <value>
+    /// A flag indicating whether left align is enabled or not.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets a flag indicating whether left align is enabled or not.
+    /// </para>
+    /// </remarks>
+    public bool LeftAlign
+    {
+      get { return m_leftAlign; }
+      set { m_leftAlign = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private int m_min = -1;
-		private int m_max = int.MaxValue;
-		private bool m_leftAlign = false;
+    private int m_min = -1;
+    private int m_max = int.MaxValue;
+    private bool m_leftAlign = false;
 
-		#endregion Private Instance Fields
-	}
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Util/GlobalContextProperties.cs b/src/log4net/Util/GlobalContextProperties.cs
index 0c19995..cfebd22 100644
--- a/src/log4net/Util/GlobalContextProperties.cs
+++ b/src/log4net/Util/GlobalContextProperties.cs
@@ -22,156 +22,156 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implementation of Properties collection for the <see cref="log4net.GlobalContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class implements a properties collection that is thread safe and supports both
-	/// storing properties and capturing a read only copy of the current propertied.
-	/// </para>
-	/// <para>
-	/// This class is optimized to the scenario where the properties are read frequently
-	/// and are modified infrequently.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class GlobalContextProperties : ContextPropertiesBase
-	{
-		#region Private Instance Fields
+  /// <summary>
+  /// Implementation of Properties collection for the <see cref="log4net.GlobalContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class implements a properties collection that is thread safe and supports both
+  /// storing properties and capturing a read only copy of the current propertied.
+  /// </para>
+  /// <para>
+  /// This class is optimized to the scenario where the properties are read frequently
+  /// and are modified infrequently.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class GlobalContextProperties : ContextPropertiesBase
+  {
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The read only copy of the properties.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This variable is declared <c>volatile</c> to prevent the compiler and JIT from
-		/// reordering reads and writes of this thread performed on different threads.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// The read only copy of the properties.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This variable is declared <c>volatile</c> to prevent the compiler and JIT from
+    /// reordering reads and writes of this thread performed on different threads.
+    /// </para>
+    /// </remarks>
 #if NETCF
-		private ReadOnlyPropertiesDictionary m_readOnlyProperties = new ReadOnlyPropertiesDictionary();
+    private ReadOnlyPropertiesDictionary m_readOnlyProperties = new ReadOnlyPropertiesDictionary();
 #else
-		private volatile ReadOnlyPropertiesDictionary m_readOnlyProperties = new ReadOnlyPropertiesDictionary();
+    private volatile ReadOnlyPropertiesDictionary m_readOnlyProperties = new ReadOnlyPropertiesDictionary();
 #endif
 
-		/// <summary>
-		/// Lock object used to synchronize updates within this instance
-		/// </summary>
-		private readonly object m_syncRoot = new object();
+    /// <summary>
+    /// Lock object used to synchronize updates within this instance
+    /// </summary>
+    private readonly object m_syncRoot = new object();
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="GlobalContextProperties" /> class.
-		/// </para>
-		/// </remarks>
-		internal GlobalContextProperties()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="GlobalContextProperties" /> class.
+    /// </para>
+    /// </remarks>
+    internal GlobalContextProperties()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the value of a property
-		/// </summary>
-		/// <value>
-		/// The value for the property with the specified key
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Reading the value for a key is faster than setting the value.
-		/// When the value is written a new read only copy of 
-		/// the properties is created.
-		/// </para>
-		/// </remarks>
-		public override object this[string key]
-		{
-			get 
-			{ 
-				return m_readOnlyProperties[key];
-			}
-			set
-			{
-				lock(m_syncRoot)
-				{
-					PropertiesDictionary mutableProps = new PropertiesDictionary(m_readOnlyProperties);
+    /// <summary>
+    /// Gets or sets the value of a property
+    /// </summary>
+    /// <value>
+    /// The value for the property with the specified key
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Reading the value for a key is faster than setting the value.
+    /// When the value is written a new read only copy of 
+    /// the properties is created.
+    /// </para>
+    /// </remarks>
+    public override object this[string key]
+    {
+      get
+      {
+        return m_readOnlyProperties[key];
+      }
+      set
+      {
+        lock (m_syncRoot)
+        {
+          PropertiesDictionary mutableProps = new PropertiesDictionary(m_readOnlyProperties);
 
-					mutableProps[key] = value;
+          mutableProps[key] = value;
 
-					m_readOnlyProperties = new ReadOnlyPropertiesDictionary(mutableProps);
-				}
-			}
-		}
+          m_readOnlyProperties = new ReadOnlyPropertiesDictionary(mutableProps);
+        }
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Remove a property from the global context
-		/// </summary>
-		/// <param name="key">the key for the entry to remove</param>
-		/// <remarks>
-		/// <para>
-		/// Removing an entry from the global context properties is relatively expensive compared
-		/// with reading a value. 
-		/// </para>
-		/// </remarks>
-		public void Remove(string key)
-		{
-			lock(m_syncRoot)
-			{
-				if (m_readOnlyProperties.Contains(key))
-				{
-					PropertiesDictionary mutableProps = new PropertiesDictionary(m_readOnlyProperties);
+    /// <summary>
+    /// Remove a property from the global context
+    /// </summary>
+    /// <param name="key">the key for the entry to remove</param>
+    /// <remarks>
+    /// <para>
+    /// Removing an entry from the global context properties is relatively expensive compared
+    /// with reading a value. 
+    /// </para>
+    /// </remarks>
+    public void Remove(string key)
+    {
+      lock (m_syncRoot)
+      {
+        if (m_readOnlyProperties.Contains(key))
+        {
+          PropertiesDictionary mutableProps = new PropertiesDictionary(m_readOnlyProperties);
 
-					mutableProps.Remove(key);
+          mutableProps.Remove(key);
 
-					m_readOnlyProperties = new ReadOnlyPropertiesDictionary(mutableProps);
-				}
-			}
-		}
+          m_readOnlyProperties = new ReadOnlyPropertiesDictionary(mutableProps);
+        }
+      }
+    }
 
-		/// <summary>
-		/// Clear the global context properties
-		/// </summary>
-		public void Clear()
-		{
-			lock(m_syncRoot)
-			{
-				m_readOnlyProperties = new ReadOnlyPropertiesDictionary();
-			}
-		}
+    /// <summary>
+    /// Clear the global context properties
+    /// </summary>
+    public void Clear()
+    {
+      lock (m_syncRoot)
+      {
+        m_readOnlyProperties = new ReadOnlyPropertiesDictionary();
+      }
+    }
 
-		#endregion Public Instance Methods
+    #endregion Public Instance Methods
 
-		#region Internal Instance Methods
+    #region Internal Instance Methods
 
-		/// <summary>
-		/// Get a readonly immutable copy of the properties
-		/// </summary>
-		/// <returns>the current global context properties</returns>
-		/// <remarks>
-		/// <para>
-		/// This implementation is fast because the GlobalContextProperties class
-		/// stores a readonly copy of the properties.
-		/// </para>
-		/// </remarks>
-		internal ReadOnlyPropertiesDictionary GetReadOnlyProperties()
-		{
-			return m_readOnlyProperties;
-		}
+    /// <summary>
+    /// Get a readonly immutable copy of the properties
+    /// </summary>
+    /// <returns>the current global context properties</returns>
+    /// <remarks>
+    /// <para>
+    /// This implementation is fast because the GlobalContextProperties class
+    /// stores a readonly copy of the properties.
+    /// </para>
+    /// </remarks>
+    internal ReadOnlyPropertiesDictionary GetReadOnlyProperties()
+    {
+      return m_readOnlyProperties;
+    }
 
-		#endregion Internal Instance Methods
-	}
+    #endregion Internal Instance Methods
+  }
 }
 
diff --git a/src/log4net/Util/ILogExtensions.cs b/src/log4net/Util/ILogExtensions.cs
index fa52c28..0d13e04 100644
--- a/src/log4net/Util/ILogExtensions.cs
+++ b/src/log4net/Util/ILogExtensions.cs
@@ -25,1717 +25,1717 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// The static class ILogExtensions contains a set of widely used
-	/// methods that ease the interaction with the ILog interface implementations.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This class contains methods for logging at different levels and checks the
-	/// properties for determining if those logging levels are enabled in the current
-	/// configuration.
-	/// </para>
-	/// </remarks>
-	/// <example>Simple example of logging messages
-	/// <code lang="C#">
-	/// using log4net.Util;
-	/// 
-	/// ILog log = LogManager.GetLogger("application-log");
-	/// 
-	/// log.InfoExt("Application Start");
-	/// log.DebugExt("This is a debug message");
-	/// </code>
-	/// </example>
-	public static class ILogExtensions
-	{
-		#region Private Static Fields
+  /// <summary>
+  /// The static class ILogExtensions contains a set of widely used
+  /// methods that ease the interaction with the ILog interface implementations.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This class contains methods for logging at different levels and checks the
+  /// properties for determining if those logging levels are enabled in the current
+  /// configuration.
+  /// </para>
+  /// </remarks>
+  /// <example>Simple example of logging messages
+  /// <code lang="C#">
+  /// using log4net.Util;
+  /// 
+  /// ILog log = LogManager.GetLogger("application-log");
+  /// 
+  /// log.InfoExt("Application Start");
+  /// log.DebugExt("This is a debug message");
+  /// </code>
+  /// </example>
+  public static class ILogExtensions
+  {
+    #region Private Static Fields
 
-		/// <summary>
-		/// The fully qualified type of the Logger class.
-		/// </summary>
-		private static readonly Type declaringType = typeof(ILogExtensions);
+    /// <summary>
+    /// The fully qualified type of the Logger class.
+    /// </summary>
+    private static readonly Type declaringType = typeof(ILogExtensions);
 
-		#endregion //Private Static Fields
+    #endregion //Private Static Fields
 
-		#region debug extensions
+    #region debug extensions
 
-		#region debug extensions that uses log message lambda expression
+    #region debug extensions that uses log message lambda expression
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>INFO</c>
-		/// enabled by reading the value <seealso cref="ILog.IsDebugEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation.  If this logger is <c>INFO</c> enabled, then it converts 
-		/// the message object (retrieved by invocation of the provided callback) to a 
-		/// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
-		/// It then proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="DebugExt(ILog,Func{object},Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugExt(this ILog logger, Func<object> callback)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>INFO</c>
+    /// enabled by reading the value <seealso cref="ILog.IsDebugEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation.  If this logger is <c>INFO</c> enabled, then it converts 
+    /// the message object (retrieved by invocation of the provided callback) to a 
+    /// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
+    /// It then proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="DebugExt(ILog,Func{object},Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugExt(this ILog logger, Func<object> callback)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.Debug(callback());
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Debug(callback());
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Debug"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="DebugExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugExt(this ILog logger, Func<object> callback, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Debug"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="DebugExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugExt(this ILog logger, Func<object> callback, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.Debug(callback(), exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Debug(callback(), exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region debug extension that use the formatter
+    #region debug extension that use the formatter
 
-		/// <overloads>Log a message object with the <see cref="Level.Debug"/> level.</overloads> //TODO
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>INFO</c>
-		/// enabled by reading the value <seealso cref="ILog.IsDebugEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation. If this logger is <c>INFO</c> enabled, then it converts 
-		/// the message object (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="DebugExt(ILog,object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugExt(this ILog logger, object message)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <overloads>Log a message object with the <see cref="Level.Debug"/> level.</overloads> //TODO
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>INFO</c>
+    /// enabled by reading the value <seealso cref="ILog.IsDebugEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation. If this logger is <c>INFO</c> enabled, then it converts 
+    /// the message object (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="DebugExt(ILog,object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugExt(this ILog logger, object message)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.Debug(message);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Debug(message);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Debug"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="DebugExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugExt(this ILog logger, object message, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Debug"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="DebugExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugExt(this ILog logger, object message, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.Debug(message, exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Debug(message, exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region debug extension that use string format
+    #region debug extension that use string format
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugFormatExt(this ILog logger, string format, object arg0)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugFormatExt(this ILog logger, string format, object arg0)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.DebugFormat(format, arg0);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.DebugFormat(format, arg0);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugFormatExt(this ILog logger, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugFormatExt(this ILog logger, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.DebugFormat(format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.DebugFormat(format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.DebugFormat(provider, format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.DebugFormat(provider, format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugFormatExt(this ILog logger, string format, object arg0, object arg1)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugFormatExt(this ILog logger, string format, object arg0, object arg1)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.DebugFormat(format, arg0, arg1);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.DebugFormat(format, arg0, arg1);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Debug"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Debug(object)"/>
-		/// <seealso cref="ILog.IsDebugEnabled"/>
-		public static void DebugFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
-		{
-			try
-			{
-				if (!logger.IsDebugEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Debug"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="DebugExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Debug(object)"/>
+    /// <seealso cref="ILog.IsDebugEnabled"/>
+    public static void DebugFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
+    {
+      try
+      {
+        if (!logger.IsDebugEnabled)
+          return;
 
-				logger.DebugFormat(format, arg0, arg1, arg2);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.DebugFormat(format, arg0, arg1, arg2);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#endregion
+    #endregion
 
-		#region info extensions
+    #region info extensions
 
-		#region info extensions that uses log message lambda expression
+    #region info extensions that uses log message lambda expression
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>INFO</c>
-		/// enabled by reading the value <seealso cref="ILog.IsInfoEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation.  If this logger is <c>INFO</c> enabled, then it converts 
-		/// the message object (retrieved by invocation of the provided callback) to a 
-		/// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
-		/// It then proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="InfoExt(ILog,Func{object},Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoExt(this ILog logger, Func<object> callback)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>INFO</c>
+    /// enabled by reading the value <seealso cref="ILog.IsInfoEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation.  If this logger is <c>INFO</c> enabled, then it converts 
+    /// the message object (retrieved by invocation of the provided callback) to a 
+    /// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
+    /// It then proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="InfoExt(ILog,Func{object},Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoExt(this ILog logger, Func<object> callback)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.Info(callback());
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Info(callback());
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Info"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="InfoExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoExt(this ILog logger, Func<object> callback, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Info"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="InfoExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoExt(this ILog logger, Func<object> callback, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.Info(callback(), exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Info(callback(), exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region info extension that use the formatter
+    #region info extension that use the formatter
 
-		/// <overloads>Log a message object with the <see cref="Level.Info"/> level.</overloads> //TODO
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>INFO</c>
-		/// enabled by reading the value <seealso cref="ILog.IsInfoEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation. If this logger is <c>INFO</c> enabled, then it converts 
-		/// the message object (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="InfoExt(ILog,object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoExt(this ILog logger, object message)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <overloads>Log a message object with the <see cref="Level.Info"/> level.</overloads> //TODO
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>INFO</c>
+    /// enabled by reading the value <seealso cref="ILog.IsInfoEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation. If this logger is <c>INFO</c> enabled, then it converts 
+    /// the message object (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="InfoExt(ILog,object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoExt(this ILog logger, object message)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.Info(message);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Info(message);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Info"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="InfoExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoExt(this ILog logger, object message, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Info"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="InfoExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoExt(this ILog logger, object message, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.Info(message, exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Info(message, exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region info extension that use string format
+    #region info extension that use string format
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoFormatExt(this ILog logger, string format, object arg0)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoFormatExt(this ILog logger, string format, object arg0)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.InfoFormat(format, arg0);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.InfoFormat(format, arg0);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoFormatExt(this ILog logger, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoFormatExt(this ILog logger, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.InfoFormat(format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.InfoFormat(format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.InfoFormat(provider, format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.InfoFormat(provider, format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoFormatExt(this ILog logger, string format, object arg0, object arg1)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoFormatExt(this ILog logger, string format, object arg0, object arg1)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.InfoFormat(format, arg0, arg1);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.InfoFormat(format, arg0, arg1);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Info"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Info(object)"/>
-		/// <seealso cref="ILog.IsInfoEnabled"/>
-		public static void InfoFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
-		{
-			try
-			{
-				if (!logger.IsInfoEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Info"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="InfoExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Info(object)"/>
+    /// <seealso cref="ILog.IsInfoEnabled"/>
+    public static void InfoFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
+    {
+      try
+      {
+        if (!logger.IsInfoEnabled)
+          return;
 
-				logger.InfoFormat(format, arg0, arg1, arg2);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.InfoFormat(format, arg0, arg1, arg2);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#endregion
+    #endregion
 
-		#region warn extensions
+    #region warn extensions
 
-		#region warn extensions that uses log message lambda expression
+    #region warn extensions that uses log message lambda expression
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>WARN</c>
-		/// enabled by reading the value <seealso cref="ILog.IsWarnEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation.  If this logger is <c>WARN</c> enabled, then it converts 
-		/// the message object (retrieved by invocation of the provided callback) to a 
-		/// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
-		/// It then proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="WarnExt(ILog,Func{object},Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnExt(this ILog logger, Func<object> callback)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>WARN</c>
+    /// enabled by reading the value <seealso cref="ILog.IsWarnEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation.  If this logger is <c>WARN</c> enabled, then it converts 
+    /// the message object (retrieved by invocation of the provided callback) to a 
+    /// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
+    /// It then proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="WarnExt(ILog,Func{object},Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnExt(this ILog logger, Func<object> callback)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.Warn(callback());
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Warn(callback());
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Warn"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="WarnExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnExt(this ILog logger, Func<object> callback, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Warn"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="WarnExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnExt(this ILog logger, Func<object> callback, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.Warn(callback(), exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Warn(callback(), exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region warn extension that use the formatter
+    #region warn extension that use the formatter
 
-		/// <overloads>Log a message object with the <see cref="Level.Warn"/> level.</overloads> //TODO
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>WARN</c>
-		/// enabled by reading the value <seealso cref="ILog.IsWarnEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation. If this logger is <c>WARN</c> enabled, then it converts 
-		/// the message object (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="WarnExt(ILog,object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnExt(this ILog logger, object message)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <overloads>Log a message object with the <see cref="Level.Warn"/> level.</overloads> //TODO
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>WARN</c>
+    /// enabled by reading the value <seealso cref="ILog.IsWarnEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation. If this logger is <c>WARN</c> enabled, then it converts 
+    /// the message object (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="WarnExt(ILog,object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnExt(this ILog logger, object message)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.Warn(message);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Warn(message);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Warn"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="WarnExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnExt(this ILog logger, object message, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Warn"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="WarnExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnExt(this ILog logger, object message, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.Warn(message, exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Warn(message, exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region warn extension that use string format
+    #region warn extension that use string format
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnFormatExt(this ILog logger, string format, object arg0)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnFormatExt(this ILog logger, string format, object arg0)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.WarnFormat(format, arg0);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.WarnFormat(format, arg0);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnFormatExt(this ILog logger, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnFormatExt(this ILog logger, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.WarnFormat(format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.WarnFormat(format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.WarnFormat(provider, format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.WarnFormat(provider, format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnFormatExt(this ILog logger, string format, object arg0, object arg1)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnFormatExt(this ILog logger, string format, object arg0, object arg1)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.WarnFormat(format, arg0, arg1);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.WarnFormat(format, arg0, arg1);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Warn"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Warn(object)"/>
-		/// <seealso cref="ILog.IsWarnEnabled"/>
-		public static void WarnFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
-		{
-			try
-			{
-				if (!logger.IsWarnEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Warn"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="WarnExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Warn(object)"/>
+    /// <seealso cref="ILog.IsWarnEnabled"/>
+    public static void WarnFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
+    {
+      try
+      {
+        if (!logger.IsWarnEnabled)
+          return;
 
-				logger.WarnFormat(format, arg0, arg1, arg2);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.WarnFormat(format, arg0, arg1, arg2);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#endregion
+    #endregion
 
-		#region error extensions
+    #region error extensions
 
-		#region error extensions that uses log message lambda expression
+    #region error extensions that uses log message lambda expression
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>ERROR</c>
-		/// enabled by reading the value <seealso cref="ILog.IsErrorEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation.  If this logger is <c>ERROR</c> enabled, then it converts 
-		/// the message object (retrieved by invocation of the provided callback) to a 
-		/// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
-		/// It then proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="ErrorExt(ILog,Func{object},Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorExt(this ILog logger, Func<object> callback)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>ERROR</c>
+    /// enabled by reading the value <seealso cref="ILog.IsErrorEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation.  If this logger is <c>ERROR</c> enabled, then it converts 
+    /// the message object (retrieved by invocation of the provided callback) to a 
+    /// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
+    /// It then proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="ErrorExt(ILog,Func{object},Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorExt(this ILog logger, Func<object> callback)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.Error(callback());
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Error(callback());
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Error"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="ErrorExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorExt(this ILog logger, Func<object> callback, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Error"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="ErrorExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorExt(this ILog logger, Func<object> callback, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.Error(callback(), exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Error(callback(), exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region error extension that use the formatter
+    #region error extension that use the formatter
 
-		/// <overloads>Log a message object with the <see cref="Level.Error"/> level.</overloads> //TODO
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>ERROR</c>
-		/// enabled by reading the value <seealso cref="ILog.IsErrorEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation. If this logger is <c>ERROR</c> enabled, then it converts 
-		/// the message object (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="ErrorExt(ILog,object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorExt(this ILog logger, object message)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <overloads>Log a message object with the <see cref="Level.Error"/> level.</overloads> //TODO
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>ERROR</c>
+    /// enabled by reading the value <seealso cref="ILog.IsErrorEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation. If this logger is <c>ERROR</c> enabled, then it converts 
+    /// the message object (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="ErrorExt(ILog,object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorExt(this ILog logger, object message)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.Error(message);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Error(message);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Error"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="ErrorExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorExt(this ILog logger, object message, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Error"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="ErrorExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorExt(this ILog logger, object message, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.Error(message, exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Error(message, exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region error extension that use string format
+    #region error extension that use string format
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorFormatExt(this ILog logger, string format, object arg0)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorFormatExt(this ILog logger, string format, object arg0)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.ErrorFormat(format, arg0);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.ErrorFormat(format, arg0);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorFormatExt(this ILog logger, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorFormatExt(this ILog logger, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.ErrorFormat(format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.ErrorFormat(format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.ErrorFormat(provider, format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.ErrorFormat(provider, format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorFormatExt(this ILog logger, string format, object arg0, object arg1)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorFormatExt(this ILog logger, string format, object arg0, object arg1)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.ErrorFormat(format, arg0, arg1);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.ErrorFormat(format, arg0, arg1);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Error"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Error(object)"/>
-		/// <seealso cref="ILog.IsErrorEnabled"/>
-		public static void ErrorFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
-		{
-			try
-			{
-				if (!logger.IsErrorEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Error"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="ErrorExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Error(object)"/>
+    /// <seealso cref="ILog.IsErrorEnabled"/>
+    public static void ErrorFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
+    {
+      try
+      {
+        if (!logger.IsErrorEnabled)
+          return;
 
-				logger.ErrorFormat(format, arg0, arg1, arg2);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.ErrorFormat(format, arg0, arg1, arg2);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#endregion
+    #endregion
 
-		#region fatal extensions
+    #region fatal extensions
 
-		#region fatal extensions that uses log message lambda expression
+    #region fatal extensions that uses log message lambda expression
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>FATAL</c>
-		/// enabled by reading the value <seealso cref="ILog.IsFatalEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation.  If this logger is <c>FATAL</c> enabled, then it converts 
-		/// the message object (retrieved by invocation of the provided callback) to a 
-		/// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
-		/// It then proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="FatalExt(ILog,Func{object},Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalExt(this ILog logger, Func<object> callback)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>FATAL</c>
+    /// enabled by reading the value <seealso cref="ILog.IsFatalEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation.  If this logger is <c>FATAL</c> enabled, then it converts 
+    /// the message object (retrieved by invocation of the provided callback) to a 
+    /// string by invoking the appropriate <see cref="log4net.ObjectRenderer.IObjectRenderer"/>.
+    /// It then proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="FatalExt(ILog,Func{object},Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalExt(this ILog logger, Func<object> callback)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.Fatal(callback());
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Fatal(callback());
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Fatal"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="callback">The lambda expression that gets the object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="FatalExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalExt(this ILog logger, Func<object> callback, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Fatal"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="callback">The lambda expression that gets the object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="FatalExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalExt(this ILog logger, Func<object> callback, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.Fatal(callback(), exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Fatal(callback(), exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region fatal extension that use the formatter
+    #region fatal extension that use the formatter
 
-		/// <overloads>Log a message object with the <see cref="Level.Fatal"/> level.</overloads> //TODO
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <remarks>
-		/// <para>
-		/// This method first checks if this logger is <c>FATAL</c>
-		/// enabled by reading the value <seealso cref="ILog.IsFatalEnabled"/> property.
-		/// This check happens always and does not depend on the <seealso cref="ILog"/>
-		/// implementation. If this logger is <c>FATAL</c> enabled, then it converts 
-		/// the message object (passed as parameter) to a string by invoking the appropriate
-		/// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
-		/// proceeds to call all the registered appenders in this logger 
-		/// and also higher in the hierarchy depending on the value of 
-		/// the additivity flag.
-		/// </para>
-		/// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
-		/// to this method will print the name of the <see cref="Exception"/> 
-		/// but no stack trace. To print a stack trace use the 
-		/// <see cref="FatalExt(ILog,object,Exception)"/> form instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalExt(this ILog logger, object message)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <overloads>Log a message object with the <see cref="Level.Fatal"/> level.</overloads> //TODO
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <remarks>
+    /// <para>
+    /// This method first checks if this logger is <c>FATAL</c>
+    /// enabled by reading the value <seealso cref="ILog.IsFatalEnabled"/> property.
+    /// This check happens always and does not depend on the <seealso cref="ILog"/>
+    /// implementation. If this logger is <c>FATAL</c> enabled, then it converts 
+    /// the message object (passed as parameter) to a string by invoking the appropriate
+    /// <see cref="log4net.ObjectRenderer.IObjectRenderer"/>. It then 
+    /// proceeds to call all the registered appenders in this logger 
+    /// and also higher in the hierarchy depending on the value of 
+    /// the additivity flag.
+    /// </para>
+    /// <para><b>WARNING</b> Note that passing an <see cref="Exception"/> 
+    /// to this method will print the name of the <see cref="Exception"/> 
+    /// but no stack trace. To print a stack trace use the 
+    /// <see cref="FatalExt(ILog,object,Exception)"/> form instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalExt(this ILog logger, object message)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.Fatal(message);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Fatal(message);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Log a message object with the <see cref="Level.Fatal"/> level including
-		/// the stack trace of the <see cref="Exception"/> passed
-		/// as a parameter.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="message">The message object to log.</param>
-		/// <param name="exception">The exception to log, including its stack trace.</param>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="FatalExt(ILog, object)"/> form for more detailed information.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalExt(this ILog logger, object message, Exception exception)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Log a message object with the <see cref="Level.Fatal"/> level including
+    /// the stack trace of the <see cref="Exception"/> passed
+    /// as a parameter.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="message">The message object to log.</param>
+    /// <param name="exception">The exception to log, including its stack trace.</param>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="FatalExt(ILog, object)"/> form for more detailed information.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalExt(this ILog logger, object message, Exception exception)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.Fatal(message, exception);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.Fatal(message, exception);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#region fatal extension that use string format
+    #region fatal extension that use string format
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalFormatExt(this ILog logger, string format, object arg0)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalFormatExt(this ILog logger, string format, object arg0)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.FatalFormat(format, arg0);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.FatalFormat(format, arg0);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalFormatExt(this ILog logger, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalFormatExt(this ILog logger, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.FatalFormat(format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.FatalFormat(format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="args">An Object array containing zero or more objects to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="provider">An <see cref="IFormatProvider"/> that supplies culture-specific formatting information</param>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="args">An Object array containing zero or more objects to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalFormatExt(this ILog logger, IFormatProvider provider, string format, params object[] args)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.FatalFormat(provider, format, args);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.FatalFormat(provider, format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalFormatExt(this ILog logger, string format, object arg0, object arg1)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalFormatExt(this ILog logger, string format, object arg0, object arg1)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.FatalFormat(format, arg0, arg1);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.FatalFormat(format, arg0, arg1);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		/// <summary>
-		/// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
-		/// </summary>
-		/// <param name="logger">The logger on which the message is logged.</param>
-		/// <param name="format">A String containing zero or more format items</param>
-		/// <param name="arg0">An Object to format</param>
-		/// <param name="arg1">An Object to format</param>
-		/// <param name="arg2">An Object to format</param>
-		/// <remarks>
-		/// <para>
-		/// The message is formatted using the <c>String.Format</c> method. See
-		/// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
-		/// of the formatting.
-		/// </para>
-		/// <para>
-		/// This method does not take an <see cref="Exception"/> object to include in the
-		/// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
-		/// methods instead.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="ILog.Fatal(object)"/>
-		/// <seealso cref="ILog.IsFatalEnabled"/>
-		public static void FatalFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
-		{
-			try
-			{
-				if (!logger.IsFatalEnabled)
-					return;
+    /// <summary>
+    /// Logs a formatted message string with the <see cref="Level.Fatal"/> level.
+    /// </summary>
+    /// <param name="logger">The logger on which the message is logged.</param>
+    /// <param name="format">A String containing zero or more format items</param>
+    /// <param name="arg0">An Object to format</param>
+    /// <param name="arg1">An Object to format</param>
+    /// <param name="arg2">An Object to format</param>
+    /// <remarks>
+    /// <para>
+    /// The message is formatted using the <c>String.Format</c> method. See
+    /// <see cref="String.Format(string, object[])"/> for details of the syntax of the format string and the behavior
+    /// of the formatting.
+    /// </para>
+    /// <para>
+    /// This method does not take an <see cref="Exception"/> object to include in the
+    /// log event. To pass an <see cref="Exception"/> use one of the <see cref="FatalExt(ILog,object,Exception)"/>
+    /// methods instead.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="ILog.Fatal(object)"/>
+    /// <seealso cref="ILog.IsFatalEnabled"/>
+    public static void FatalFormatExt(this ILog logger, string format, object arg0, object arg1, object arg2)
+    {
+      try
+      {
+        if (!logger.IsFatalEnabled)
+          return;
 
-				logger.FatalFormat(format, arg0, arg1, arg2);
-			}
-			catch (Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
-			}
-		}
+        logger.FatalFormat(format, arg0, arg1, arg2);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "Exception while logging", ex);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		#endregion
-	}
+    #endregion
+  }
 }
 #endif
diff --git a/src/log4net/Util/LevelMapping.cs b/src/log4net/Util/LevelMapping.cs
index a2d4aff..674ec3d 100644
--- a/src/log4net/Util/LevelMapping.cs
+++ b/src/log4net/Util/LevelMapping.cs
@@ -24,127 +24,127 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Manages a mapping from levels to <see cref="LevelMappingEntry"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Manages an ordered mapping from <see cref="Level"/> instances 
-	/// to <see cref="LevelMappingEntry"/> subclasses.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class LevelMapping : IOptionHandler
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Manages a mapping from levels to <see cref="LevelMappingEntry"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Manages an ordered mapping from <see cref="Level"/> instances 
+  /// to <see cref="LevelMappingEntry"/> subclasses.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class LevelMapping : IOptionHandler
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initialise a new instance of <see cref="LevelMapping"/>.
-		/// </para>
-		/// </remarks>
-		public LevelMapping() 
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initialise a new instance of <see cref="LevelMapping"/>.
+    /// </para>
+    /// </remarks>
+    public LevelMapping()
+    {
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Methods
-	
-		/// <summary>
-		/// Add a <see cref="LevelMappingEntry"/> to this mapping
-		/// </summary>
-		/// <param name="entry">the entry to add</param>
-		/// <remarks>
-		/// <para>
-		/// If a <see cref="LevelMappingEntry"/> has previously been added
-		/// for the same <see cref="Level"/> then that entry will be 
-		/// overwritten.
-		/// </para>
-		/// </remarks>
-		public void Add(LevelMappingEntry entry)
-		{
-			if (m_entriesMap.ContainsKey(entry.Level))
-			{
-				m_entriesMap.Remove(entry.Level);
-			}
-			m_entriesMap.Add(entry.Level, entry);
-		}
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Lookup the mapping for the specified level
-		/// </summary>
-		/// <param name="level">the level to lookup</param>
-		/// <returns>the <see cref="LevelMappingEntry"/> for the level or <c>null</c> if no mapping found</returns>
-		/// <remarks>
-		/// <para>
-		/// Lookup the value for the specified level. Finds the nearest
-		/// mapping value for the level that is equal to or less than the
-		/// <paramref name="level"/> specified.
-		/// </para>
-		/// <para>
-		/// If no mapping could be found then <c>null</c> is returned.
-		/// </para>
-		/// </remarks>
-		public LevelMappingEntry Lookup(Level level)
-		{
-			if (m_entries != null)
-			{
-				foreach(LevelMappingEntry entry in m_entries)
-				{
-					if (level >= entry.Level)
-					{
-						return entry;
-					}
-				}
-			}
-			return null;
-		}
+    /// <summary>
+    /// Add a <see cref="LevelMappingEntry"/> to this mapping
+    /// </summary>
+    /// <param name="entry">the entry to add</param>
+    /// <remarks>
+    /// <para>
+    /// If a <see cref="LevelMappingEntry"/> has previously been added
+    /// for the same <see cref="Level"/> then that entry will be 
+    /// overwritten.
+    /// </para>
+    /// </remarks>
+    public void Add(LevelMappingEntry entry)
+    {
+      if (m_entriesMap.ContainsKey(entry.Level))
+      {
+        m_entriesMap.Remove(entry.Level);
+      }
+      m_entriesMap.Add(entry.Level, entry);
+    }
 
-		#endregion // Public Instance Methods
+    /// <summary>
+    /// Lookup the mapping for the specified level
+    /// </summary>
+    /// <param name="level">the level to lookup</param>
+    /// <returns>the <see cref="LevelMappingEntry"/> for the level or <c>null</c> if no mapping found</returns>
+    /// <remarks>
+    /// <para>
+    /// Lookup the value for the specified level. Finds the nearest
+    /// mapping value for the level that is equal to or less than the
+    /// <paramref name="level"/> specified.
+    /// </para>
+    /// <para>
+    /// If no mapping could be found then <c>null</c> is returned.
+    /// </para>
+    /// </remarks>
+    public LevelMappingEntry Lookup(Level level)
+    {
+      if (m_entries != null)
+      {
+        foreach (LevelMappingEntry entry in m_entries)
+        {
+          if (level >= entry.Level)
+          {
+            return entry;
+          }
+        }
+      }
+      return null;
+    }
 
-		#region IOptionHandler Members
+    #endregion // Public Instance Methods
 
-		/// <summary>
-		/// Initialize options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Caches the sorted list of <see cref="LevelMappingEntry"/> in an array
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			Level[] sortKeys = new Level[m_entriesMap.Count];
-			LevelMappingEntry[] sortValues = new LevelMappingEntry[m_entriesMap.Count];
+    #region IOptionHandler Members
 
-			m_entriesMap.Keys.CopyTo(sortKeys, 0);
-			m_entriesMap.Values.CopyTo(sortValues, 0);
+    /// <summary>
+    /// Initialize options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Caches the sorted list of <see cref="LevelMappingEntry"/> in an array
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      Level[] sortKeys = new Level[m_entriesMap.Count];
+      LevelMappingEntry[] sortValues = new LevelMappingEntry[m_entriesMap.Count];
 
-			// Sort in level order
-			Array.Sort(sortKeys, sortValues, 0, sortKeys.Length, null);
+      m_entriesMap.Keys.CopyTo(sortKeys, 0);
+      m_entriesMap.Values.CopyTo(sortValues, 0);
 
-			// Reverse list so that highest level is first
-			Array.Reverse(sortValues, 0, sortValues.Length);
+      // Sort in level order
+      Array.Sort(sortKeys, sortValues, 0, sortKeys.Length, null);
 
-			foreach(LevelMappingEntry entry in sortValues)
-			{
-				entry.ActivateOptions();
-			}
+      // Reverse list so that highest level is first
+      Array.Reverse(sortValues, 0, sortValues.Length);
 
-			 m_entries = sortValues;
-		}
+      foreach (LevelMappingEntry entry in sortValues)
+      {
+        entry.ActivateOptions();
+      }
 
-		#endregion // IOptionHandler Members
+      m_entries = sortValues;
+    }
 
-		#region Private Instance Fields
+    #endregion // IOptionHandler Members
 
-		private Hashtable m_entriesMap = new Hashtable();
-		private LevelMappingEntry[] m_entries = null;
+    #region Private Instance Fields
 
-		#endregion // Private Instance Fields
-	}
+    private Hashtable m_entriesMap = new Hashtable();
+    private LevelMappingEntry[] m_entries = null;
+
+    #endregion // Private Instance Fields
+  }
 }
diff --git a/src/log4net/Util/LevelMappingEntry.cs b/src/log4net/Util/LevelMappingEntry.cs
index 1a3975b..00901a5 100644
--- a/src/log4net/Util/LevelMappingEntry.cs
+++ b/src/log4net/Util/LevelMappingEntry.cs
@@ -24,77 +24,77 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// An entry in the <see cref="LevelMapping"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This is an abstract base class for types that are stored in the
-	/// <see cref="LevelMapping"/> object.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public abstract class LevelMappingEntry : IOptionHandler
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// An entry in the <see cref="LevelMapping"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This is an abstract base class for types that are stored in the
+  /// <see cref="LevelMapping"/> object.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public abstract class LevelMappingEntry : IOptionHandler
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default protected constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default protected constructor
-		/// </para>
-		/// </remarks>
-		protected LevelMappingEntry() 
-		{
-		}
+    /// <summary>
+    /// Default protected constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default protected constructor
+    /// </para>
+    /// </remarks>
+    protected LevelMappingEntry()
+    {
+    }
 
-		#endregion // Public Instance Constructors
+    #endregion // Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// The level that is the key for this mapping 
-		/// </summary>
-		/// <value>
-		/// The <see cref="Level"/> that is the key for this mapping 
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Get or set the <see cref="Level"/> that is the key for this
-		/// mapping subclass.
-		/// </para>
-		/// </remarks>
-		public Level Level
-		{
-			get { return m_level; }
-			set { m_level = value; }
-		}
+    /// <summary>
+    /// The level that is the key for this mapping 
+    /// </summary>
+    /// <value>
+    /// The <see cref="Level"/> that is the key for this mapping 
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Get or set the <see cref="Level"/> that is the key for this
+    /// mapping subclass.
+    /// </para>
+    /// </remarks>
+    public Level Level
+    {
+      get { return m_level; }
+      set { m_level = value; }
+    }
 
-		#endregion // Public Instance Properties
+    #endregion // Public Instance Properties
 
-		#region IOptionHandler Members
+    #region IOptionHandler Members
 
-		/// <summary>
-		/// Initialize any options defined on this entry
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Should be overridden by any classes that need to initialise based on their options
-		/// </para>
-		/// </remarks>
-		public virtual void ActivateOptions()
-		{
-			// default implementation is to do nothing
-		}
+    /// <summary>
+    /// Initialize any options defined on this entry
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Should be overridden by any classes that need to initialise based on their options
+    /// </para>
+    /// </remarks>
+    public virtual void ActivateOptions()
+    {
+      // default implementation is to do nothing
+    }
 
-		#endregion // IOptionHandler Members
+    #endregion // IOptionHandler Members
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private Level m_level; 
+    private Level m_level;
 
-		#endregion // Private Instance Fields
-	}
+    #endregion // Private Instance Fields
+  }
 }
diff --git a/src/log4net/Util/LogLog.cs b/src/log4net/Util/LogLog.cs
index 84f640e..a54f010 100644
--- a/src/log4net/Util/LogLog.cs
+++ b/src/log4net/Util/LogLog.cs
@@ -23,653 +23,653 @@
 
 namespace log4net.Util
 {
+  /// <summary>
+  /// 
+  /// </summary>
+  /// <param name="source"></param>
+  /// <param name="e"></param>
+  public delegate void LogReceivedEventHandler(object source, LogReceivedEventArgs e);
+
+  /// <summary>
+  /// Outputs log statements from within the log4net assembly.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Log4net components cannot make log4net logging calls. However, it is
+  /// sometimes useful for the user to learn about what log4net is
+  /// doing.
+  /// </para>
+  /// <para>
+  /// All log4net internal debug calls go to the standard output stream
+  /// whereas internal error messages are sent to the standard error output 
+  /// stream.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class LogLog
+  {
     /// <summary>
-    /// 
+    /// The event raised when an internal message has been received.
+    /// </summary>
+    public static event LogReceivedEventHandler LogReceived;
+
+    private readonly Type source;
+    private readonly DateTime timeStampUtc;
+    private readonly string prefix;
+    private readonly string message;
+    private readonly Exception exception;
+
+    /// <summary>
+    /// The Type that generated the internal message.
+    /// </summary>
+    public Type Source
+    {
+      get { return source; }
+    }
+
+    /// <summary>
+    /// The DateTime stamp of when the internal message was received.
+    /// </summary>
+    public DateTime TimeStamp
+    {
+      get { return timeStampUtc.ToLocalTime(); }
+    }
+
+    /// <summary>
+    /// The UTC DateTime stamp of when the internal message was received.
+    /// </summary>
+    public DateTime TimeStampUtc
+    {
+      get { return timeStampUtc; }
+    }
+
+    /// <summary>
+    /// A string indicating the severity of the internal message.
+    /// </summary>
+    /// <remarks>
+    /// "log4net: ", 
+    /// "log4net:ERROR ", 
+    /// "log4net:WARN "
+    /// </remarks>
+    public string Prefix
+    {
+      get { return prefix; }
+    }
+
+    /// <summary>
+    /// The internal log message.
+    /// </summary>
+    public string Message
+    {
+      get { return message; }
+    }
+
+    /// <summary>
+    /// The Exception related to the message.
+    /// </summary>
+    /// <remarks>
+    /// Optional. Will be null if no Exception was passed.
+    /// </remarks>
+    public Exception Exception
+    {
+      get { return exception; }
+    }
+
+    /// <summary>
+    /// Formats Prefix, Source, and Message in the same format as the value
+    /// sent to Console.Out and Trace.Write.
+    /// </summary>
+    /// <returns></returns>
+    public override string ToString()
+    {
+      return Prefix + Source.Name + ": " + Message;
+    }
+
+    #region Private Instance Constructors
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="LogLog" /> class. 
     /// </summary>
     /// <param name="source"></param>
-    /// <param name="e"></param>
-    public delegate void LogReceivedEventHandler(object source, LogReceivedEventArgs e);
+    /// <param name="prefix"></param>
+    /// <param name="message"></param>
+    /// <param name="exception"></param>
+    public LogLog(Type source, string prefix, string message, Exception exception)
+    {
+      timeStampUtc = DateTime.UtcNow;
 
-	/// <summary>
-	/// Outputs log statements from within the log4net assembly.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Log4net components cannot make log4net logging calls. However, it is
-	/// sometimes useful for the user to learn about what log4net is
-	/// doing.
-	/// </para>
-	/// <para>
-	/// All log4net internal debug calls go to the standard output stream
-	/// whereas internal error messages are sent to the standard error output 
-	/// stream.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class LogLog
-	{
-        /// <summary>
-        /// The event raised when an internal message has been received.
-        /// </summary>
-        public static event LogReceivedEventHandler LogReceived;
+      this.source = source;
+      this.prefix = prefix;
+      this.message = message;
+      this.exception = exception;
+    }
 
-        private readonly Type source;
-        private readonly DateTime timeStampUtc;
-        private readonly string prefix;
-        private readonly string message;
-        private readonly Exception exception;
+    #endregion Private Instance Constructors
 
-        /// <summary>
-        /// The Type that generated the internal message.
-        /// </summary>
-	    public Type Source
-	    {
-	        get { return source; }
-	    }
+    #region Static Constructor
 
-        /// <summary>
-        /// The DateTime stamp of when the internal message was received.
-        /// </summary>
-	    public DateTime TimeStamp
-	    {
-            get { return timeStampUtc.ToLocalTime(); }
-	    }
-
-        /// <summary>
-        /// The UTC DateTime stamp of when the internal message was received.
-        /// </summary>
-        public DateTime TimeStampUtc
-        {
-            get { return timeStampUtc; }
-	    }
-
-        /// <summary>
-        /// A string indicating the severity of the internal message.
-        /// </summary>
-        /// <remarks>
-        /// "log4net: ", 
-        /// "log4net:ERROR ", 
-        /// "log4net:WARN "
-        /// </remarks>
-	    public string Prefix
-	    {
-	        get { return prefix; }
-	    }
-
-        /// <summary>
-        /// The internal log message.
-        /// </summary>
-	    public string Message
-	    {
-	        get { return message; }
-	    }
-
-        /// <summary>
-        /// The Exception related to the message.
-        /// </summary>
-        /// <remarks>
-        /// Optional. Will be null if no Exception was passed.
-        /// </remarks>
-	    public Exception Exception
-	    {
-	        get { return exception; }
-	    }
-
-        /// <summary>
-        /// Formats Prefix, Source, and Message in the same format as the value
-        /// sent to Console.Out and Trace.Write.
-        /// </summary>
-        /// <returns></returns>
-	    public override string ToString()
-	    {
-            return Prefix + Source.Name + ": " + Message;
-	    }
-
-	    #region Private Instance Constructors
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="LogLog" /> class. 
-        /// </summary>
-        /// <param name="source"></param>
-        /// <param name="prefix"></param>
-        /// <param name="message"></param>
-        /// <param name="exception"></param>
-	    public LogLog(Type source, string prefix, string message, Exception exception)
-	    {
-            timeStampUtc = DateTime.UtcNow;
-	        
-            this.source = source;
-	        this.prefix = prefix;
-	        this.message = message;
-	        this.exception = exception;
-	    }
-
-		#endregion Private Instance Constructors
-
-		#region Static Constructor
-
-		/// <summary>
-		/// Static constructor that initializes logging by reading 
-		/// settings from the application configuration file.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <c>log4net.Internal.Debug</c> application setting
-		/// controls internal debugging. This setting should be set
-		/// to <c>true</c> to enable debugging.
-		/// </para>
-		/// <para>
-		/// The <c>log4net.Internal.Quiet</c> application setting
-		/// suppresses all internal logging including error messages. 
-		/// This setting should be set to <c>true</c> to enable message
-		/// suppression.
-		/// </para>
-		/// </remarks>
-		static LogLog()
-		{
+    /// <summary>
+    /// Static constructor that initializes logging by reading 
+    /// settings from the application configuration file.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <c>log4net.Internal.Debug</c> application setting
+    /// controls internal debugging. This setting should be set
+    /// to <c>true</c> to enable debugging.
+    /// </para>
+    /// <para>
+    /// The <c>log4net.Internal.Quiet</c> application setting
+    /// suppresses all internal logging including error messages. 
+    /// This setting should be set to <c>true</c> to enable message
+    /// suppression.
+    /// </para>
+    /// </remarks>
+    static LogLog()
+    {
 #if !NETCF
-			try
-			{
-				InternalDebugging = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Debug"), false);
-				QuietMode = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Quiet"), false);
-				EmitInternalMessages = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Emit"), true);
-			}
-			catch(Exception ex)
-			{
-				// If an exception is thrown here then it looks like the config file does not
-				// parse correctly.
-				//
-				// We will leave debug OFF and print an Error message
-				Error(typeof(LogLog), "Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex);
-			}
+      try
+      {
+        InternalDebugging = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Debug"), false);
+        QuietMode = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Quiet"), false);
+        EmitInternalMessages = OptionConverter.ToBoolean(SystemInfo.GetAppSetting("log4net.Internal.Emit"), true);
+      }
+      catch (Exception ex)
+      {
+        // If an exception is thrown here then it looks like the config file does not
+        // parse correctly.
+        //
+        // We will leave debug OFF and print an Error message
+        Error(typeof(LogLog), "Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex);
+      }
 #endif
-		}
+    }
 
-		#endregion Static Constructor
+    #endregion Static Constructor
 
-		#region Public Static Properties
+    #region Public Static Properties
 
-		/// <summary>
-		/// Gets or sets a value indicating whether log4net internal logging
-		/// is enabled or disabled.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if log4net internal logging is enabled, otherwise 
-		/// <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// When set to <c>true</c>, internal debug level logging will be 
-		/// displayed.
-		/// </para>
-		/// <para>
-		/// This value can be set by setting the application setting 
-		/// <c>log4net.Internal.Debug</c> in the application configuration
-		/// file.
-		/// </para>
-		/// <para>
-		/// The default value is <c>false</c>, i.e. debugging is
-		/// disabled.
-		/// </para>
-		/// </remarks>
-		/// <example>
-		/// <para>
-		/// The following example enables internal debugging using the 
-		/// application configuration file :
-		/// </para>
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net.Internal.Debug" value="true" />
-		///		</appSettings>
-		/// </configuration>
-		/// </code>
-		/// </example>
-		public static bool InternalDebugging
-		{
-			get { return s_debugEnabled; }
-			set { s_debugEnabled = value; }
-		}
+    /// <summary>
+    /// Gets or sets a value indicating whether log4net internal logging
+    /// is enabled or disabled.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if log4net internal logging is enabled, otherwise 
+    /// <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// When set to <c>true</c>, internal debug level logging will be 
+    /// displayed.
+    /// </para>
+    /// <para>
+    /// This value can be set by setting the application setting 
+    /// <c>log4net.Internal.Debug</c> in the application configuration
+    /// file.
+    /// </para>
+    /// <para>
+    /// The default value is <c>false</c>, i.e. debugging is
+    /// disabled.
+    /// </para>
+    /// </remarks>
+    /// <example>
+    /// <para>
+    /// The following example enables internal debugging using the 
+    /// application configuration file :
+    /// </para>
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net.Internal.Debug" value="true" />
+    ///    </appSettings>
+    /// </configuration>
+    /// </code>
+    /// </example>
+    public static bool InternalDebugging
+    {
+      get { return s_debugEnabled; }
+      set { s_debugEnabled = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets a value indicating whether log4net should generate no output
-		/// from internal logging, not even for errors. 
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if log4net should generate no output at all from internal 
-		/// logging, otherwise <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// When set to <c>true</c> will cause internal logging at all levels to be 
-		/// suppressed. This means that no warning or error reports will be logged. 
-		/// This option overrides the <see cref="InternalDebugging"/> setting and 
-		/// disables all debug also.
-		/// </para>
-		/// <para>This value can be set by setting the application setting
-		/// <c>log4net.Internal.Quiet</c> in the application configuration file.
-		/// </para>
-		/// <para>
-		/// The default value is <c>false</c>, i.e. internal logging is not
-		/// disabled.
-		/// </para>
-		/// </remarks>
-		/// <example>
-		/// The following example disables internal logging using the 
-		/// application configuration file :
-		/// <code lang="XML" escaped="true">
-		/// <configuration>
-		///		<appSettings>
-		///			<add key="log4net.Internal.Quiet" value="true" />
-		///		</appSettings>
-		/// </configuration>
-		/// </code>
-		/// </example>
-		public static bool QuietMode
-		{
-			get { return s_quietMode; }
-			set { s_quietMode = value; }
-		}
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public static bool EmitInternalMessages
-        {
-            get { return s_emitInternalMessages; }
-            set { s_emitInternalMessages = value; }
-        }
-
-		#endregion Public Static Properties
-
-		#region Public Static Methods
-
-        /// <summary>
-        /// Raises the LogReceived event when an internal messages is received.
-        /// </summary>
-        /// <param name="source"></param>
-        /// <param name="prefix"></param>
-        /// <param name="message"></param>
-        /// <param name="exception"></param>
-        public static void OnLogReceived(Type source, string prefix, string message, Exception exception)
-        {
-            if (LogReceived != null)
-            {
-                LogReceived(null, new LogReceivedEventArgs(new LogLog(source, prefix, message, exception)));
-            }
-        }
-
-	    /// <summary>
-		/// Test if LogLog.Debug is enabled for output.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if Debug is enabled
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Test if LogLog.Debug is enabled for output.
-		/// </para>
-		/// </remarks>
-		public static bool IsDebugEnabled
-		{
-			get { return s_debugEnabled && !s_quietMode; }
-		}
-
-		/// <summary>
-		/// Writes log4net internal debug messages to the 
-		/// standard output stream.
-		/// </summary>
-        /// <param name="source"></param>
-		/// <param name="message">The message to log.</param>
-		/// <remarks>
-		/// <para>
-		///	All internal debug messages are prepended with 
-		///	the string "log4net: ".
-		/// </para>
-		/// </remarks>
-		public static void Debug(Type source, string message) 
-		{
-			if (IsDebugEnabled) 
-			{
-                if (EmitInternalMessages)
-                {
-                    EmitOutLine(PREFIX + message);
-                }
-
-                OnLogReceived(source, PREFIX, message, null);
-			}
-		}
-
-		/// <summary>
-		/// Writes log4net internal debug messages to the 
-		/// standard output stream.
-		/// </summary>
-        /// <param name="source">The Type that generated this message.</param>
-		/// <param name="message">The message to log.</param>
-		/// <param name="exception">An exception to log.</param>
-		/// <remarks>
-		/// <para>
-		///	All internal debug messages are prepended with 
-		///	the string "log4net: ".
-		/// </para>
-		/// </remarks>
-		public static void Debug(Type source, string message, Exception exception) 
-		{
-			if (IsDebugEnabled) 
-			{
-                if (EmitInternalMessages)
-                {
-                    EmitOutLine(PREFIX + message);
-                    if (exception != null)
-                    {
-                        EmitOutLine(exception.ToString());
-                    }
-                }
-
-                OnLogReceived(source, PREFIX, message, exception);
-			}
-		}
-  
-		/// <summary>
-		/// Test if LogLog.Warn is enabled for output.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if Warn is enabled
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Test if LogLog.Warn is enabled for output.
-		/// </para>
-		/// </remarks>
-		public static bool IsWarnEnabled
-		{
-			get { return !s_quietMode; }
-		}
-
-		/// <summary>
-		/// Writes log4net internal warning messages to the 
-		/// standard error stream.
-		/// </summary>
-        /// <param name="source">The Type that generated this message.</param>
-		/// <param name="message">The message to log.</param>
-		/// <remarks>
-		/// <para>
-		///	All internal warning messages are prepended with 
-		///	the string "log4net:WARN ".
-		/// </para>
-		/// </remarks>
-		public static void Warn(Type source, string message) 
-		{
-			if (IsWarnEnabled)
-			{
-                if (EmitInternalMessages)
-                {
-                    EmitErrorLine(WARN_PREFIX + message);
-                }
-
-                OnLogReceived(source, WARN_PREFIX, message, null);
-			}
-		}  
-
-		/// <summary>
-		/// Writes log4net internal warning messages to the 
-		/// standard error stream.
-		/// </summary>
-        /// <param name="source">The Type that generated this message.</param>
-		/// <param name="message">The message to log.</param>
-		/// <param name="exception">An exception to log.</param>
-		/// <remarks>
-		/// <para>
-		///	All internal warning messages are prepended with 
-		///	the string "log4net:WARN ".
-		/// </para>
-		/// </remarks>
-		public static void Warn(Type source, string message, Exception exception) 
-		{
-			if (IsWarnEnabled)
-			{
-                if (EmitInternalMessages)
-                {
-                    EmitErrorLine(WARN_PREFIX + message);
-                    if (exception != null)
-                    {
-                        EmitErrorLine(exception.ToString());
-                    }
-                }
-
-                OnLogReceived(source, WARN_PREFIX, message, exception);
-			}
-		} 
-
-		/// <summary>
-		/// Test if LogLog.Error is enabled for output.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if Error is enabled
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Test if LogLog.Error is enabled for output.
-		/// </para>
-		/// </remarks>
-		public static bool IsErrorEnabled
-		{
-			get { return !s_quietMode; }
-		}
-
-		/// <summary>
-		/// Writes log4net internal error messages to the 
-		/// standard error stream.
-		/// </summary>
-        /// <param name="source">The Type that generated this message.</param>
-		/// <param name="message">The message to log.</param>
-		/// <remarks>
-		/// <para>
-		///	All internal error messages are prepended with 
-		///	the string "log4net:ERROR ".
-		/// </para>
-		/// </remarks>
-		public static void Error(Type source, string message) 
-		{
-			if (IsErrorEnabled)
-			{
-                if (EmitInternalMessages)
-                {
-                    EmitErrorLine(ERR_PREFIX + message);
-                }
-
-                OnLogReceived(source, ERR_PREFIX, message, null);
-			}
-		}  
-
-		/// <summary>
-		/// Writes log4net internal error messages to the 
-		/// standard error stream.
-		/// </summary>
-        /// <param name="source">The Type that generated this message.</param>
-		/// <param name="message">The message to log.</param>
-		/// <param name="exception">An exception to log.</param>
-		/// <remarks>
-		/// <para>
-		///	All internal debug messages are prepended with 
-		///	the string "log4net:ERROR ".
-		/// </para>
-		/// </remarks>
-		public static void Error(Type source, string message, Exception exception) 
-		{
-			if (IsErrorEnabled)
-			{
-                if (EmitInternalMessages)
-                {
-                    EmitErrorLine(ERR_PREFIX + message);
-                    if (exception != null)
-                    {
-                        EmitErrorLine(exception.ToString());
-                    }
-                }
-
-                OnLogReceived(source, ERR_PREFIX, message, exception);
-			}
-		}  
-
-		#endregion Public Static Methods
-
-		/// <summary>
-		/// Writes output to the standard output stream.  
-		/// </summary>
-		/// <param name="message">The message to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes to both Console.Out and System.Diagnostics.Trace.
-		/// Note that the System.Diagnostics.Trace is not supported
-		/// on the Compact Framework.
-		/// </para>
-		/// <para>
-		/// If the AppDomain is not configured with a config file then
-		/// the call to System.Diagnostics.Trace may fail. This is only
-		/// an issue if you are programmatically creating your own AppDomains.
-		/// </para>
-		/// </remarks>
-		private static void EmitOutLine(string message)
-		{
-			try
-			{
-#if NETCF
-				Console.WriteLine(message);
-				//System.Diagnostics.Debug.WriteLine(message);
-#else
-				Console.Out.WriteLine(message);
-				Trace.WriteLine(message);
-#endif
-			}
-			catch
-			{
-				// Ignore exception, what else can we do? Not really a good idea to propagate back to the caller
-			}
-		}
-
-		/// <summary>
-		/// Writes output to the standard error stream.  
-		/// </summary>
-		/// <param name="message">The message to log.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes to both Console.Error and System.Diagnostics.Trace.
-		/// Note that the System.Diagnostics.Trace is not supported
-		/// on the Compact Framework.
-		/// </para>
-		/// <para>
-		/// If the AppDomain is not configured with a config file then
-		/// the call to System.Diagnostics.Trace may fail. This is only
-		/// an issue if you are programmatically creating your own AppDomains.
-		/// </para>
-		/// </remarks>
-		private static void EmitErrorLine(string message)
-		{
-			try
-			{
-#if NETCF
-				Console.WriteLine(message);
-				//System.Diagnostics.Debug.WriteLine(message);
-#else
-				Console.Error.WriteLine(message);
-				Trace.WriteLine(message);
-#endif
-			}
-			catch
-			{
-				// Ignore exception, what else can we do? Not really a good idea to propagate back to the caller
-			}
-		}
-
-		#region Private Static Fields
-
-		/// <summary>
-		///  Default debug level
-		/// </summary>
-		private static bool s_debugEnabled = false;
-
-		/// <summary>
-		/// In quietMode not even errors generate any output.
-		/// </summary>
-		private static bool s_quietMode = false;
-
-        private static bool s_emitInternalMessages = true;
-
-		private const string PREFIX			= "log4net: ";
-		private const string ERR_PREFIX		= "log4net:ERROR ";
-		private const string WARN_PREFIX	= "log4net:WARN ";
-
-		#endregion Private Static Fields
-
-        /// <summary>
-        /// Subscribes to the LogLog.LogReceived event and stores messages
-        /// to the supplied IList instance.
-        /// </summary>
-        public class LogReceivedAdapter : IDisposable
-        {
-            private readonly IList items;
-            private readonly LogReceivedEventHandler handler;
-
-            /// <summary>
-            /// 
-            /// </summary>
-            /// <param name="items"></param>
-            public LogReceivedAdapter(IList items)
-            {
-                this.items = items;
-
-                handler = new LogReceivedEventHandler(LogLog_LogReceived);
-
-                LogReceived += handler;
-            }
-
-            void LogLog_LogReceived(object source, LogReceivedEventArgs e)
-            {
-                items.Add(e.LogLog);
-            }
-
-            /// <summary>
-            /// 
-            /// </summary>
-            public IList Items
-            {
-                get { return items; }
-            }
-
-            /// <summary>
-            /// 
-            /// </summary>
-            public void Dispose()
-            {
-                LogReceived -= handler;
-            }
-        }
-	}
+    /// <summary>
+    /// Gets or sets a value indicating whether log4net should generate no output
+    /// from internal logging, not even for errors. 
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if log4net should generate no output at all from internal 
+    /// logging, otherwise <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// When set to <c>true</c> will cause internal logging at all levels to be 
+    /// suppressed. This means that no warning or error reports will be logged. 
+    /// This option overrides the <see cref="InternalDebugging"/> setting and 
+    /// disables all debug also.
+    /// </para>
+    /// <para>This value can be set by setting the application setting
+    /// <c>log4net.Internal.Quiet</c> in the application configuration file.
+    /// </para>
+    /// <para>
+    /// The default value is <c>false</c>, i.e. internal logging is not
+    /// disabled.
+    /// </para>
+    /// </remarks>
+    /// <example>
+    /// The following example disables internal logging using the 
+    /// application configuration file :
+    /// <code lang="XML" escaped="true">
+    /// <configuration>
+    ///    <appSettings>
+    ///      <add key="log4net.Internal.Quiet" value="true" />
+    ///    </appSettings>
+    /// </configuration>
+    /// </code>
+    /// </example>
+    public static bool QuietMode
+    {
+      get { return s_quietMode; }
+      set { s_quietMode = value; }
+    }
 
     /// <summary>
     /// 
     /// </summary>
-    public class LogReceivedEventArgs : EventArgs
+    public static bool EmitInternalMessages
     {
-        private readonly LogLog loglog;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        /// <param name="loglog"></param>
-        public LogReceivedEventArgs(LogLog loglog)
-        {
-            this.loglog = loglog;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public LogLog LogLog
-        {
-            get { return loglog; }
-        }
+      get { return s_emitInternalMessages; }
+      set { s_emitInternalMessages = value; }
     }
+
+    #endregion Public Static Properties
+
+    #region Public Static Methods
+
+    /// <summary>
+    /// Raises the LogReceived event when an internal messages is received.
+    /// </summary>
+    /// <param name="source"></param>
+    /// <param name="prefix"></param>
+    /// <param name="message"></param>
+    /// <param name="exception"></param>
+    public static void OnLogReceived(Type source, string prefix, string message, Exception exception)
+    {
+      if (LogReceived != null)
+      {
+        LogReceived(null, new LogReceivedEventArgs(new LogLog(source, prefix, message, exception)));
+      }
+    }
+
+    /// <summary>
+    /// Test if LogLog.Debug is enabled for output.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if Debug is enabled
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Test if LogLog.Debug is enabled for output.
+    /// </para>
+    /// </remarks>
+    public static bool IsDebugEnabled
+    {
+      get { return s_debugEnabled && !s_quietMode; }
+    }
+
+    /// <summary>
+    /// Writes log4net internal debug messages to the 
+    /// standard output stream.
+    /// </summary>
+    /// <param name="source"></param>
+    /// <param name="message">The message to log.</param>
+    /// <remarks>
+    /// <para>
+    ///  All internal debug messages are prepended with 
+    ///  the string "log4net: ".
+    /// </para>
+    /// </remarks>
+    public static void Debug(Type source, string message)
+    {
+      if (IsDebugEnabled)
+      {
+        if (EmitInternalMessages)
+        {
+          EmitOutLine(PREFIX + message);
+        }
+
+        OnLogReceived(source, PREFIX, message, null);
+      }
+    }
+
+    /// <summary>
+    /// Writes log4net internal debug messages to the 
+    /// standard output stream.
+    /// </summary>
+    /// <param name="source">The Type that generated this message.</param>
+    /// <param name="message">The message to log.</param>
+    /// <param name="exception">An exception to log.</param>
+    /// <remarks>
+    /// <para>
+    ///  All internal debug messages are prepended with 
+    ///  the string "log4net: ".
+    /// </para>
+    /// </remarks>
+    public static void Debug(Type source, string message, Exception exception)
+    {
+      if (IsDebugEnabled)
+      {
+        if (EmitInternalMessages)
+        {
+          EmitOutLine(PREFIX + message);
+          if (exception != null)
+          {
+            EmitOutLine(exception.ToString());
+          }
+        }
+
+        OnLogReceived(source, PREFIX, message, exception);
+      }
+    }
+
+    /// <summary>
+    /// Test if LogLog.Warn is enabled for output.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if Warn is enabled
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Test if LogLog.Warn is enabled for output.
+    /// </para>
+    /// </remarks>
+    public static bool IsWarnEnabled
+    {
+      get { return !s_quietMode; }
+    }
+
+    /// <summary>
+    /// Writes log4net internal warning messages to the 
+    /// standard error stream.
+    /// </summary>
+    /// <param name="source">The Type that generated this message.</param>
+    /// <param name="message">The message to log.</param>
+    /// <remarks>
+    /// <para>
+    ///  All internal warning messages are prepended with 
+    ///  the string "log4net:WARN ".
+    /// </para>
+    /// </remarks>
+    public static void Warn(Type source, string message)
+    {
+      if (IsWarnEnabled)
+      {
+        if (EmitInternalMessages)
+        {
+          EmitErrorLine(WARN_PREFIX + message);
+        }
+
+        OnLogReceived(source, WARN_PREFIX, message, null);
+      }
+    }
+
+    /// <summary>
+    /// Writes log4net internal warning messages to the 
+    /// standard error stream.
+    /// </summary>
+    /// <param name="source">The Type that generated this message.</param>
+    /// <param name="message">The message to log.</param>
+    /// <param name="exception">An exception to log.</param>
+    /// <remarks>
+    /// <para>
+    ///  All internal warning messages are prepended with 
+    ///  the string "log4net:WARN ".
+    /// </para>
+    /// </remarks>
+    public static void Warn(Type source, string message, Exception exception)
+    {
+      if (IsWarnEnabled)
+      {
+        if (EmitInternalMessages)
+        {
+          EmitErrorLine(WARN_PREFIX + message);
+          if (exception != null)
+          {
+            EmitErrorLine(exception.ToString());
+          }
+        }
+
+        OnLogReceived(source, WARN_PREFIX, message, exception);
+      }
+    }
+
+    /// <summary>
+    /// Test if LogLog.Error is enabled for output.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if Error is enabled
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Test if LogLog.Error is enabled for output.
+    /// </para>
+    /// </remarks>
+    public static bool IsErrorEnabled
+    {
+      get { return !s_quietMode; }
+    }
+
+    /// <summary>
+    /// Writes log4net internal error messages to the 
+    /// standard error stream.
+    /// </summary>
+    /// <param name="source">The Type that generated this message.</param>
+    /// <param name="message">The message to log.</param>
+    /// <remarks>
+    /// <para>
+    ///  All internal error messages are prepended with 
+    ///  the string "log4net:ERROR ".
+    /// </para>
+    /// </remarks>
+    public static void Error(Type source, string message)
+    {
+      if (IsErrorEnabled)
+      {
+        if (EmitInternalMessages)
+        {
+          EmitErrorLine(ERR_PREFIX + message);
+        }
+
+        OnLogReceived(source, ERR_PREFIX, message, null);
+      }
+    }
+
+    /// <summary>
+    /// Writes log4net internal error messages to the 
+    /// standard error stream.
+    /// </summary>
+    /// <param name="source">The Type that generated this message.</param>
+    /// <param name="message">The message to log.</param>
+    /// <param name="exception">An exception to log.</param>
+    /// <remarks>
+    /// <para>
+    ///  All internal debug messages are prepended with 
+    ///  the string "log4net:ERROR ".
+    /// </para>
+    /// </remarks>
+    public static void Error(Type source, string message, Exception exception)
+    {
+      if (IsErrorEnabled)
+      {
+        if (EmitInternalMessages)
+        {
+          EmitErrorLine(ERR_PREFIX + message);
+          if (exception != null)
+          {
+            EmitErrorLine(exception.ToString());
+          }
+        }
+
+        OnLogReceived(source, ERR_PREFIX, message, exception);
+      }
+    }
+
+    #endregion Public Static Methods
+
+    /// <summary>
+    /// Writes output to the standard output stream.  
+    /// </summary>
+    /// <param name="message">The message to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes to both Console.Out and System.Diagnostics.Trace.
+    /// Note that the System.Diagnostics.Trace is not supported
+    /// on the Compact Framework.
+    /// </para>
+    /// <para>
+    /// If the AppDomain is not configured with a config file then
+    /// the call to System.Diagnostics.Trace may fail. This is only
+    /// an issue if you are programmatically creating your own AppDomains.
+    /// </para>
+    /// </remarks>
+    private static void EmitOutLine(string message)
+    {
+      try
+      {
+#if NETCF
+        Console.WriteLine(message);
+        //System.Diagnostics.Debug.WriteLine(message);
+#else
+        Console.Out.WriteLine(message);
+        Trace.WriteLine(message);
+#endif
+      }
+      catch
+      {
+        // Ignore exception, what else can we do? Not really a good idea to propagate back to the caller
+      }
+    }
+
+    /// <summary>
+    /// Writes output to the standard error stream.  
+    /// </summary>
+    /// <param name="message">The message to log.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes to both Console.Error and System.Diagnostics.Trace.
+    /// Note that the System.Diagnostics.Trace is not supported
+    /// on the Compact Framework.
+    /// </para>
+    /// <para>
+    /// If the AppDomain is not configured with a config file then
+    /// the call to System.Diagnostics.Trace may fail. This is only
+    /// an issue if you are programmatically creating your own AppDomains.
+    /// </para>
+    /// </remarks>
+    private static void EmitErrorLine(string message)
+    {
+      try
+      {
+#if NETCF
+        Console.WriteLine(message);
+        //System.Diagnostics.Debug.WriteLine(message);
+#else
+        Console.Error.WriteLine(message);
+        Trace.WriteLine(message);
+#endif
+      }
+      catch
+      {
+        // Ignore exception, what else can we do? Not really a good idea to propagate back to the caller
+      }
+    }
+
+    #region Private Static Fields
+
+    /// <summary>
+    ///  Default debug level
+    /// </summary>
+    private static bool s_debugEnabled = false;
+
+    /// <summary>
+    /// In quietMode not even errors generate any output.
+    /// </summary>
+    private static bool s_quietMode = false;
+
+    private static bool s_emitInternalMessages = true;
+
+    private const string PREFIX = "log4net: ";
+    private const string ERR_PREFIX = "log4net:ERROR ";
+    private const string WARN_PREFIX = "log4net:WARN ";
+
+    #endregion Private Static Fields
+
+    /// <summary>
+    /// Subscribes to the LogLog.LogReceived event and stores messages
+    /// to the supplied IList instance.
+    /// </summary>
+    public class LogReceivedAdapter : IDisposable
+    {
+      private readonly IList items;
+      private readonly LogReceivedEventHandler handler;
+
+      /// <summary>
+      /// 
+      /// </summary>
+      /// <param name="items"></param>
+      public LogReceivedAdapter(IList items)
+      {
+        this.items = items;
+
+        handler = new LogReceivedEventHandler(LogLog_LogReceived);
+
+        LogReceived += handler;
+      }
+
+      void LogLog_LogReceived(object source, LogReceivedEventArgs e)
+      {
+        items.Add(e.LogLog);
+      }
+
+      /// <summary>
+      /// 
+      /// </summary>
+      public IList Items
+      {
+        get { return items; }
+      }
+
+      /// <summary>
+      /// 
+      /// </summary>
+      public void Dispose()
+      {
+        LogReceived -= handler;
+      }
+    }
+  }
+
+  /// <summary>
+  /// 
+  /// </summary>
+  public class LogReceivedEventArgs : EventArgs
+  {
+    private readonly LogLog loglog;
+
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="loglog"></param>
+    public LogReceivedEventArgs(LogLog loglog)
+    {
+      this.loglog = loglog;
+    }
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public LogLog LogLog
+    {
+      get { return loglog; }
+    }
+  }
 }
diff --git a/src/log4net/Util/LogicalThreadContextProperties.cs b/src/log4net/Util/LogicalThreadContextProperties.cs
index 179c22b..2104220 100644
--- a/src/log4net/Util/LogicalThreadContextProperties.cs
+++ b/src/log4net/Util/LogicalThreadContextProperties.cs
@@ -31,252 +31,252 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implementation of Properties collection for the <see cref="log4net.LogicalThreadContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Class implements a collection of properties that is specific to each thread.
-	/// The class is not synchronized as each thread has its own <see cref="PropertiesDictionary"/>.
-	/// </para>
-	/// <para>
-	/// This class stores its properties in a slot on the <see cref="CallContext"/> named
-	/// <c>log4net.Util.LogicalThreadContextProperties</c>.
-	/// </para>
-	/// <para>
-	/// For .NET Standard 1.3 this class uses
-	/// System.Threading.AsyncLocal rather than <see
-	/// cref="System.Runtime.Remoting.Messaging.CallContext"/>.
-	/// </para>
-	/// <para>
-	/// The <see cref="CallContext"/> requires a link time 
-	/// <see cref="System.Security.Permissions.SecurityPermission"/> for the
-	/// <see cref="System.Security.Permissions.SecurityPermissionFlag.Infrastructure"/>.
-	/// If the calling code does not have this permission then this context will be disabled.
-	/// It will not store any property values set on it.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class LogicalThreadContextProperties : ContextPropertiesBase
-	{
+  /// <summary>
+  /// Implementation of Properties collection for the <see cref="log4net.LogicalThreadContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Class implements a collection of properties that is specific to each thread.
+  /// The class is not synchronized as each thread has its own <see cref="PropertiesDictionary"/>.
+  /// </para>
+  /// <para>
+  /// This class stores its properties in a slot on the <see cref="CallContext"/> named
+  /// <c>log4net.Util.LogicalThreadContextProperties</c>.
+  /// </para>
+  /// <para>
+  /// For .NET Standard 1.3 this class uses
+  /// System.Threading.AsyncLocal rather than <see
+  /// cref="System.Runtime.Remoting.Messaging.CallContext"/>.
+  /// </para>
+  /// <para>
+  /// The <see cref="CallContext"/> requires a link time 
+  /// <see cref="System.Security.Permissions.SecurityPermission"/> for the
+  /// <see cref="System.Security.Permissions.SecurityPermissionFlag.Infrastructure"/>.
+  /// If the calling code does not have this permission then this context will be disabled.
+  /// It will not store any property values set on it.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class LogicalThreadContextProperties : ContextPropertiesBase
+  {
 #if NETSTANDARD
-		private static readonly AsyncLocal<PropertiesDictionary> AsyncLocalDictionary = new AsyncLocal<PropertiesDictionary>();
+    private static readonly AsyncLocal<PropertiesDictionary> AsyncLocalDictionary = new AsyncLocal<PropertiesDictionary>();
 #else
-		private const string c_SlotName = "log4net.Util.LogicalThreadContextProperties";
+    private const string c_SlotName = "log4net.Util.LogicalThreadContextProperties";
 #endif
-		
-		/// <summary>
-		/// Flag used to disable this context if we don't have permission to access the CallContext.
-		/// </summary>
-		private bool m_disabled = false;
-		
-		#region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LogicalThreadContextProperties" /> class.
-		/// </para>
-		/// </remarks>
-		internal LogicalThreadContextProperties()
-		{
-		}
+    /// <summary>
+    /// Flag used to disable this context if we don't have permission to access the CallContext.
+    /// </summary>
+    private bool m_disabled = false;
 
-		#endregion Public Instance Constructors
+    #region Public Instance Constructors
 
-		#region Public Instance Properties
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LogicalThreadContextProperties" /> class.
+    /// </para>
+    /// </remarks>
+    internal LogicalThreadContextProperties()
+    {
+    }
 
-		/// <summary>
-		/// Gets or sets the value of a property
-		/// </summary>
-		/// <value>
-		/// The value for the property with the specified key
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Get or set the property value for the <paramref name="key"/> specified.
-		/// </para>
-		/// </remarks>
-		public override object this[string key]
-		{
-			get 
-			{ 
-				// Don't create the dictionary if it does not already exist
-				PropertiesDictionary dictionary = GetProperties(false);
-				if (dictionary != null)
-				{
-					return dictionary[key]; 
-				}
-				return null;
-			}
-			set 
-			{
-				// Force the dictionary to be created
-				PropertiesDictionary props = GetProperties(true);
-				// Reason for cloning the dictionary below: object instances set on the CallContext
-				// need to be immutable to correctly flow through async/await
-				PropertiesDictionary immutableProps = new PropertiesDictionary(props);
-				immutableProps[key] = value;
-				SetLogicalProperties(immutableProps);
-			}
-		}
+    #endregion Public Instance Constructors
 
-		#endregion Public Instance Properties
+    #region Public Instance Properties
 
-		#region Public Instance Methods
+    /// <summary>
+    /// Gets or sets the value of a property
+    /// </summary>
+    /// <value>
+    /// The value for the property with the specified key
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Get or set the property value for the <paramref name="key"/> specified.
+    /// </para>
+    /// </remarks>
+    public override object this[string key]
+    {
+      get
+      {
+        // Don't create the dictionary if it does not already exist
+        PropertiesDictionary dictionary = GetProperties(false);
+        if (dictionary != null)
+        {
+          return dictionary[key];
+        }
+        return null;
+      }
+      set
+      {
+        // Force the dictionary to be created
+        PropertiesDictionary props = GetProperties(true);
+        // Reason for cloning the dictionary below: object instances set on the CallContext
+        // need to be immutable to correctly flow through async/await
+        PropertiesDictionary immutableProps = new PropertiesDictionary(props);
+        immutableProps[key] = value;
+        SetLogicalProperties(immutableProps);
+      }
+    }
 
-		/// <summary>
-		/// Remove a property
-		/// </summary>
-		/// <param name="key">the key for the entry to remove</param>
-		/// <remarks>
-		/// <para>
-		/// Remove the value for the specified <paramref name="key"/> from the context.
-		/// </para>
-		/// </remarks>
-		public void Remove(string key)
-		{
-			PropertiesDictionary dictionary = GetProperties(false);
-			if (dictionary != null)
-			{
-				PropertiesDictionary immutableProps = new PropertiesDictionary(dictionary);
-				immutableProps.Remove(key);
-				SetLogicalProperties(immutableProps);
-			}
-		}
+    #endregion Public Instance Properties
 
-		/// <summary>
-		/// Clear all the context properties
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clear all the context properties
-		/// </para>
-		/// </remarks>
-		public void Clear()
-		{
-			PropertiesDictionary dictionary = GetProperties(false);
-			if (dictionary != null)
-			{
-				PropertiesDictionary immutableProps = new PropertiesDictionary();
-				SetLogicalProperties(immutableProps);
-			}
-		}
+    #region Public Instance Methods
 
-		#endregion Public Instance Methods
+    /// <summary>
+    /// Remove a property
+    /// </summary>
+    /// <param name="key">the key for the entry to remove</param>
+    /// <remarks>
+    /// <para>
+    /// Remove the value for the specified <paramref name="key"/> from the context.
+    /// </para>
+    /// </remarks>
+    public void Remove(string key)
+    {
+      PropertiesDictionary dictionary = GetProperties(false);
+      if (dictionary != null)
+      {
+        PropertiesDictionary immutableProps = new PropertiesDictionary(dictionary);
+        immutableProps.Remove(key);
+        SetLogicalProperties(immutableProps);
+      }
+    }
 
-		#region Internal Instance Methods
+    /// <summary>
+    /// Clear all the context properties
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clear all the context properties
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      PropertiesDictionary dictionary = GetProperties(false);
+      if (dictionary != null)
+      {
+        PropertiesDictionary immutableProps = new PropertiesDictionary();
+        SetLogicalProperties(immutableProps);
+      }
+    }
 
-		/// <summary>
-		/// Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread.
-		/// </summary>
-		/// <param name="create">create the dictionary if it does not exist, otherwise return null if is does not exist</param>
-		/// <returns>the properties for this thread</returns>
-		/// <remarks>
-		/// <para>
-		/// The collection returned is only to be used on the calling thread. If the
-		/// caller needs to share the collection between different threads then the 
-		/// caller must clone the collection before doings so.
-		/// </para>
-		/// </remarks>
-		internal PropertiesDictionary GetProperties(bool create)
-		{
-			if (!m_disabled)
-			{
-				try
-				{
-					PropertiesDictionary properties = GetLogicalProperties();
-					if (properties == null && create)
-					{
-						properties = new PropertiesDictionary();
-						SetLogicalProperties(properties);
-					}
-					return properties;
-				}
-				catch (SecurityException secEx)
-				{
-					m_disabled = true;
-					
-					// Thrown if we don't have permission to read or write the CallContext
-					LogLog.Warn(declaringType, "SecurityException while accessing CallContext. Disabling LogicalThreadContextProperties", secEx);
-				}
-			}
-			
-			// Only get here is we are disabled because of a security exception
-			if (create)
-			{
-				return new PropertiesDictionary();
-			}
-			return null;
-		}
+    #endregion Public Instance Methods
 
-		#endregion Internal Instance Methods
+    #region Internal Instance Methods
 
-        #region Private Static Methods
+    /// <summary>
+    /// Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread.
+    /// </summary>
+    /// <param name="create">create the dictionary if it does not exist, otherwise return null if is does not exist</param>
+    /// <returns>the properties for this thread</returns>
+    /// <remarks>
+    /// <para>
+    /// The collection returned is only to be used on the calling thread. If the
+    /// caller needs to share the collection between different threads then the 
+    /// caller must clone the collection before doings so.
+    /// </para>
+    /// </remarks>
+    internal PropertiesDictionary GetProperties(bool create)
+    {
+      if (!m_disabled)
+      {
+        try
+        {
+          PropertiesDictionary properties = GetLogicalProperties();
+          if (properties == null && create)
+          {
+            properties = new PropertiesDictionary();
+            SetLogicalProperties(properties);
+          }
+          return properties;
+        }
+        catch (SecurityException secEx)
+        {
+          m_disabled = true;
 
-        /// <summary>
-		/// Gets the call context get data.
-		/// </summary>
-		/// <returns>The peroperties dictionary stored in the call context</returns>
-		/// <remarks>
-		/// The <see cref="CallContext"/> method <see cref="CallContext.GetData"/> has a
-		/// security link demand, therfore we must put the method call in a seperate method
-		/// that we can wrap in an exception handler.
-		/// </remarks>
+          // Thrown if we don't have permission to read or write the CallContext
+          LogLog.Warn(declaringType, "SecurityException while accessing CallContext. Disabling LogicalThreadContextProperties", secEx);
+        }
+      }
+
+      // Only get here is we are disabled because of a security exception
+      if (create)
+      {
+        return new PropertiesDictionary();
+      }
+      return null;
+    }
+
+    #endregion Internal Instance Methods
+
+    #region Private Static Methods
+
+    /// <summary>
+    /// Gets the call context get data.
+    /// </summary>
+    /// <returns>The peroperties dictionary stored in the call context</returns>
+    /// <remarks>
+    /// The <see cref="CallContext"/> method <see cref="CallContext.GetData"/> has a
+    /// security link demand, therfore we must put the method call in a seperate method
+    /// that we can wrap in an exception handler.
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
         [System.Security.SecuritySafeCritical]
 #endif
-        private static PropertiesDictionary GetLogicalProperties()
-		{
+    private static PropertiesDictionary GetLogicalProperties()
+    {
 #if NETSTANDARD
             return AsyncLocalDictionary.Value;
 #elif NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0
-            return CallContext.LogicalGetData(c_SlotName) as PropertiesDictionary;
+      return CallContext.LogicalGetData(c_SlotName) as PropertiesDictionary;
 #else
-			return CallContext.GetData(c_SlotName) as PropertiesDictionary;
+      return CallContext.GetData(c_SlotName) as PropertiesDictionary;
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Sets the call context data.
-		/// </summary>
-		/// <param name="properties">The properties.</param>
-		/// <remarks>
-		/// The <see cref="CallContext"/> method <see cref="CallContext.SetData"/> has a
-		/// security link demand, therfore we must put the method call in a seperate method
-		/// that we can wrap in an exception handler.
-		/// </remarks>
+    /// <summary>
+    /// Sets the call context data.
+    /// </summary>
+    /// <param name="properties">The properties.</param>
+    /// <remarks>
+    /// The <see cref="CallContext"/> method <see cref="CallContext.SetData"/> has a
+    /// security link demand, therfore we must put the method call in a seperate method
+    /// that we can wrap in an exception handler.
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
         [System.Security.SecuritySafeCritical]
 #endif
-        private static void SetLogicalProperties(PropertiesDictionary properties)
-		{
+    private static void SetLogicalProperties(PropertiesDictionary properties)
+    {
 #if NETSTANDARD
-			AsyncLocalDictionary.Value = properties;
+      AsyncLocalDictionary.Value = properties;
 #elif NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0
-			CallContext.LogicalSetData(c_SlotName, properties);
+      CallContext.LogicalSetData(c_SlotName, properties);
 #else
-			CallContext.SetData(c_SlotName, properties);
+      CallContext.SetData(c_SlotName, properties);
 #endif
-        }
-
-        #endregion
-
-	    #region Private Static Fields
-
-	    /// <summary>
-	    /// The fully qualified type of the LogicalThreadContextProperties class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(LogicalThreadContextProperties);
-
-	    #endregion Private Static Fields
     }
+
+    #endregion
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the LogicalThreadContextProperties class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(LogicalThreadContextProperties);
+
+    #endregion Private Static Fields
+  }
 }
 
 #endif
diff --git a/src/log4net/Util/LogicalThreadContextStack.cs b/src/log4net/Util/LogicalThreadContextStack.cs
index dbad39a..bd7b0ab 100644
--- a/src/log4net/Util/LogicalThreadContextStack.cs
+++ b/src/log4net/Util/LogicalThreadContextStack.cs
@@ -26,424 +26,424 @@
 namespace log4net.Util
 {
 
-	/// <summary>
-	/// Delegate type used for LogicalThreadContextStack's callbacks.
-	/// </summary>
-	#if NET_2_0 || MONO_2_0 || NETSTANDARD
-	public delegate void TwoArgAction<T1, T2>(T1 t1, T2 t2);
-	#else
-	public delegate void TwoArgAction(string t1, LogicalThreadContextStack t2);
-	#endif
+  /// <summary>
+  /// Delegate type used for LogicalThreadContextStack's callbacks.
+  /// </summary>
+#if NET_2_0 || MONO_2_0 || NETSTANDARD
+  public delegate void TwoArgAction<T1, T2>(T1 t1, T2 t2);
+#else
+  public delegate void TwoArgAction(string t1, LogicalThreadContextStack t2);
+#endif
 
-	/// <summary>
-	/// Implementation of Stack for the <see cref="log4net.LogicalThreadContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Implementation of Stack for the <see cref="log4net.LogicalThreadContext"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class LogicalThreadContextStack : IFixingRequired
-	{
-		#region Private Instance Fields
+  /// <summary>
+  /// Implementation of Stack for the <see cref="log4net.LogicalThreadContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Implementation of Stack for the <see cref="log4net.LogicalThreadContext"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class LogicalThreadContextStack : IFixingRequired
+  {
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The stack store.
-		/// </summary>
-		private Stack m_stack = new Stack();
+    /// <summary>
+    /// The stack store.
+    /// </summary>
+    private Stack m_stack = new Stack();
 
-		/// <summary>
-		/// The name of this <see cref="log4net.Util.LogicalThreadContextStack"/> within the
-		/// <see cref="log4net.Util.LogicalThreadContextProperties"/>.
-		/// </summary>
-		private string m_propertyKey;
+    /// <summary>
+    /// The name of this <see cref="log4net.Util.LogicalThreadContextStack"/> within the
+    /// <see cref="log4net.Util.LogicalThreadContextProperties"/>.
+    /// </summary>
+    private string m_propertyKey;
 
-		/// <summary>
-		/// The callback used to let the <see cref="log4net.Util.LogicalThreadContextStacks"/> register a
-		/// new instance of a <see cref="log4net.Util.LogicalThreadContextStack"/>.
-		/// </summary>
-		#if NET_2_0 || MONO_2_0 || NETSTANDARD
-		private TwoArgAction<string, LogicalThreadContextStack> m_registerNew;
-		#else
-		private TwoArgAction m_registerNew;
-		#endif
+    /// <summary>
+    /// The callback used to let the <see cref="log4net.Util.LogicalThreadContextStacks"/> register a
+    /// new instance of a <see cref="log4net.Util.LogicalThreadContextStack"/>.
+    /// </summary>
+#if NET_2_0 || MONO_2_0 || NETSTANDARD
+    private TwoArgAction<string, LogicalThreadContextStack> m_registerNew;
+#else
+    private TwoArgAction m_registerNew;
+#endif
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Internal constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="LogicalThreadContextStack" /> class. 
-		/// </para>
-		/// </remarks>
-		#if NET_2_0 || MONO_2_0 || NETSTANDARD
-		internal LogicalThreadContextStack(string propertyKey, TwoArgAction<string, LogicalThreadContextStack> registerNew)
-		#else
-		internal LogicalThreadContextStack(string propertyKey, TwoArgAction registerNew)
-		#endif
-		{
-			m_propertyKey = propertyKey;
-			m_registerNew = registerNew;
-		}
+    /// <summary>
+    /// Internal constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="LogicalThreadContextStack" /> class. 
+    /// </para>
+    /// </remarks>
+#if NET_2_0 || MONO_2_0 || NETSTANDARD
+    internal LogicalThreadContextStack(string propertyKey, TwoArgAction<string, LogicalThreadContextStack> registerNew)
+#else
+    internal LogicalThreadContextStack(string propertyKey, TwoArgAction registerNew)
+#endif
+    {
+      m_propertyKey = propertyKey;
+      m_registerNew = registerNew;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Properties
+    #region Public Properties
 
-		/// <summary>
-		/// The number of messages in the stack
-		/// </summary>
-		/// <value>
-		/// The current number of messages in the stack
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The current number of messages in the stack. That is
-		/// the number of times <see cref="Push"/> has been called
-		/// minus the number of times <see cref="Pop"/> has been called.
-		/// </para>
-		/// </remarks>
-		public int Count
-		{
-			get { return m_stack.Count; }
-		}
+    /// <summary>
+    /// The number of messages in the stack
+    /// </summary>
+    /// <value>
+    /// The current number of messages in the stack
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The current number of messages in the stack. That is
+    /// the number of times <see cref="Push"/> has been called
+    /// minus the number of times <see cref="Pop"/> has been called.
+    /// </para>
+    /// </remarks>
+    public int Count
+    {
+      get { return m_stack.Count; }
+    }
 
-		#endregion // Public Properties
+    #endregion // Public Properties
 
-		#region Public Methods
+    #region Public Methods
 
-		/// <summary>
-		/// Clears all the contextual information held in this stack.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clears all the contextual information held in this stack.
-		/// Only call this if you think that this thread is being reused after
-		/// a previous call execution which may not have completed correctly.
-		/// You do not need to use this method if you always guarantee to call
-		/// the <see cref="IDisposable.Dispose"/> method of the <see cref="IDisposable"/>
-		/// returned from <see cref="Push"/> even in exceptional circumstances,
-		/// for example by using the <c>using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message"))</c> 
-		/// syntax.
-		/// </para>
-		/// </remarks>
-		public void Clear()
-		{
-			m_registerNew(m_propertyKey, new LogicalThreadContextStack(m_propertyKey, m_registerNew));
-		}
+    /// <summary>
+    /// Clears all the contextual information held in this stack.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clears all the contextual information held in this stack.
+    /// Only call this if you think that this thread is being reused after
+    /// a previous call execution which may not have completed correctly.
+    /// You do not need to use this method if you always guarantee to call
+    /// the <see cref="IDisposable.Dispose"/> method of the <see cref="IDisposable"/>
+    /// returned from <see cref="Push"/> even in exceptional circumstances,
+    /// for example by using the <c>using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message"))</c> 
+    /// syntax.
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      m_registerNew(m_propertyKey, new LogicalThreadContextStack(m_propertyKey, m_registerNew));
+    }
 
-		/// <summary>
-		/// Removes the top context from this stack.
-		/// </summary>
-		/// <returns>The message in the context that was removed from the top of this stack.</returns>
-		/// <remarks>
-		/// <para>
-		/// Remove the top context from this stack, and return
-		/// it to the caller. If this stack is empty then an
-		/// empty string (not <see langword="null"/>) is returned.
-		/// </para>
-		/// </remarks>
-		public string Pop()
-		{
-			// copy current stack
-			Stack stack = new Stack(new Stack(m_stack));
-			string result = "";
-			if (stack.Count > 0)
-			{
-				result = ((StackFrame)(stack.Pop())).Message;
-			}
-			LogicalThreadContextStack ltcs = new LogicalThreadContextStack(m_propertyKey, m_registerNew);
-			ltcs.m_stack = stack;
-			m_registerNew(m_propertyKey, ltcs);
-			return result;
-		}
+    /// <summary>
+    /// Removes the top context from this stack.
+    /// </summary>
+    /// <returns>The message in the context that was removed from the top of this stack.</returns>
+    /// <remarks>
+    /// <para>
+    /// Remove the top context from this stack, and return
+    /// it to the caller. If this stack is empty then an
+    /// empty string (not <see langword="null"/>) is returned.
+    /// </para>
+    /// </remarks>
+    public string Pop()
+    {
+      // copy current stack
+      Stack stack = new Stack(new Stack(m_stack));
+      string result = "";
+      if (stack.Count > 0)
+      {
+        result = ((StackFrame)(stack.Pop())).Message;
+      }
+      LogicalThreadContextStack ltcs = new LogicalThreadContextStack(m_propertyKey, m_registerNew);
+      ltcs.m_stack = stack;
+      m_registerNew(m_propertyKey, ltcs);
+      return result;
+    }
 
-		/// <summary>
-		/// Pushes a new context message into this stack.
-		/// </summary>
-		/// <param name="message">The new context message.</param>
-		/// <returns>
-		/// An <see cref="IDisposable"/> that can be used to clean up the context stack.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Pushes a new context onto this stack. An <see cref="IDisposable"/>
-		/// is returned that can be used to clean up this stack. This
-		/// can be easily combined with the <c>using</c> keyword to scope the
-		/// context.
-		/// </para>
-		/// </remarks>
-		/// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
-		/// <code lang="C#">
-		/// using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message"))
-		/// {
-		///		log.Warn("This should have an ThreadContext Stack message");
-		///	}
-		/// </code>
-		/// </example>
-		public IDisposable Push(string message)
-		{
-			// do modifications on a copy
-			Stack stack = new Stack(new Stack(m_stack));
-			stack.Push(new StackFrame(message, (stack.Count > 0) ? (StackFrame)stack.Peek() : null));
+    /// <summary>
+    /// Pushes a new context message into this stack.
+    /// </summary>
+    /// <param name="message">The new context message.</param>
+    /// <returns>
+    /// An <see cref="IDisposable"/> that can be used to clean up the context stack.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Pushes a new context onto this stack. An <see cref="IDisposable"/>
+    /// is returned that can be used to clean up this stack. This
+    /// can be easily combined with the <c>using</c> keyword to scope the
+    /// context.
+    /// </para>
+    /// </remarks>
+    /// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
+    /// <code lang="C#">
+    /// using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message"))
+    /// {
+    ///    log.Warn("This should have an ThreadContext Stack message");
+    ///  }
+    /// </code>
+    /// </example>
+    public IDisposable Push(string message)
+    {
+      // do modifications on a copy
+      Stack stack = new Stack(new Stack(m_stack));
+      stack.Push(new StackFrame(message, (stack.Count > 0) ? (StackFrame)stack.Peek() : null));
 
-			LogicalThreadContextStack contextStack = new LogicalThreadContextStack(m_propertyKey, m_registerNew);
-			contextStack.m_stack = stack;
-			m_registerNew(m_propertyKey, contextStack);
-			return new AutoPopStackFrame(contextStack, stack.Count - 1);
-		}
+      LogicalThreadContextStack contextStack = new LogicalThreadContextStack(m_propertyKey, m_registerNew);
+      contextStack.m_stack = stack;
+      m_registerNew(m_propertyKey, contextStack);
+      return new AutoPopStackFrame(contextStack, stack.Count - 1);
+    }
 
-		/// <summary>
-		/// Returns the top context from this stack.
-		/// </summary>
-		/// <returns>The message in the context from the top of this stack.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the top context from this stack. If this stack is empty then an
-		/// empty string (not <see langword="null"/>) is returned.
-		/// </para>
-		/// </remarks>
-		public string Peek()
-		{
-			Stack stack = m_stack;
-			if (stack.Count > 0)
-			{
-				return ((StackFrame)stack.Peek()).Message;
-			}
-			return "";
-		}
+    /// <summary>
+    /// Returns the top context from this stack.
+    /// </summary>
+    /// <returns>The message in the context from the top of this stack.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the top context from this stack. If this stack is empty then an
+    /// empty string (not <see langword="null"/>) is returned.
+    /// </para>
+    /// </remarks>
+    public string Peek()
+    {
+      Stack stack = m_stack;
+      if (stack.Count > 0)
+      {
+        return ((StackFrame)stack.Peek()).Message;
+      }
+      return "";
+    }
 
-		#endregion Public Methods
+    #endregion Public Methods
 
-		#region Internal Methods
+    #region Internal Methods
 
-		/// <summary>
-		/// Gets the current context information for this stack.
-		/// </summary>
-		/// <returns>The current context information.</returns>
-		internal string GetFullMessage()
-		{
-			Stack stack = m_stack;
-			if (stack.Count > 0)
-			{
-				return ((StackFrame)(stack.Peek())).FullMessage;
-			}
-			return null;
-		}
+    /// <summary>
+    /// Gets the current context information for this stack.
+    /// </summary>
+    /// <returns>The current context information.</returns>
+    internal string GetFullMessage()
+    {
+      Stack stack = m_stack;
+      if (stack.Count > 0)
+      {
+        return ((StackFrame)(stack.Peek())).FullMessage;
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Gets and sets the internal stack used by this <see cref="LogicalThreadContextStack"/>
-		/// </summary>
-		/// <value>The internal storage stack</value>
-		/// <remarks>
-		/// <para>
-		/// This property is provided only to support backward compatability 
-		/// of the <see cref="NDC"/>. Tytpically the internal stack should not
-		/// be modified.
-		/// </para>
-		/// </remarks>
-		internal Stack InternalStack
-		{
-			get { return m_stack; }
-			set { m_stack = value; }
-		}
+    /// <summary>
+    /// Gets and sets the internal stack used by this <see cref="LogicalThreadContextStack"/>
+    /// </summary>
+    /// <value>The internal storage stack</value>
+    /// <remarks>
+    /// <para>
+    /// This property is provided only to support backward compatability 
+    /// of the <see cref="NDC"/>. Tytpically the internal stack should not
+    /// be modified.
+    /// </para>
+    /// </remarks>
+    internal Stack InternalStack
+    {
+      get { return m_stack; }
+      set { m_stack = value; }
+    }
 
-		#endregion Internal Methods
+    #endregion Internal Methods
 
-		/// <summary>
-		/// Gets the current context information for this stack.
-		/// </summary>
-		/// <returns>Gets the current context information</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the current context information for this stack.
-		/// </para>
-		/// </remarks>
-		public override string ToString()
-		{
-			return GetFullMessage();
-		}
+    /// <summary>
+    /// Gets the current context information for this stack.
+    /// </summary>
+    /// <returns>Gets the current context information</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the current context information for this stack.
+    /// </para>
+    /// </remarks>
+    public override string ToString()
+    {
+      return GetFullMessage();
+    }
 
-		/// <summary>
-		/// Get a portable version of this object
-		/// </summary>
-		/// <returns>the portable instance of this object</returns>
-		/// <remarks>
-		/// <para>
-		/// Get a cross thread portable version of this object
-		/// </para>
-		/// </remarks>
-		object IFixingRequired.GetFixedObject()
-		{
-			return GetFullMessage();
-		}
+    /// <summary>
+    /// Get a portable version of this object
+    /// </summary>
+    /// <returns>the portable instance of this object</returns>
+    /// <remarks>
+    /// <para>
+    /// Get a cross thread portable version of this object
+    /// </para>
+    /// </remarks>
+    object IFixingRequired.GetFixedObject()
+    {
+      return GetFullMessage();
+    }
 
-		/// <summary>
-		/// Inner class used to represent a single context frame in the stack.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Inner class used to represent a single context frame in the stack.
-		/// </para>
-		/// </remarks>
-		private sealed class StackFrame
-		{
-			#region Private Instance Fields
+    /// <summary>
+    /// Inner class used to represent a single context frame in the stack.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Inner class used to represent a single context frame in the stack.
+    /// </para>
+    /// </remarks>
+    private sealed class StackFrame
+    {
+      #region Private Instance Fields
 
-			private readonly string m_message;
-			private readonly StackFrame m_parent;
-			private string m_fullMessage = null;
+      private readonly string m_message;
+      private readonly StackFrame m_parent;
+      private string m_fullMessage = null;
 
-			#endregion
+      #endregion
 
-			#region Internal Instance Constructors
+      #region Internal Instance Constructors
 
-			/// <summary>
-			/// Constructor
-			/// </summary>
-			/// <param name="message">The message for this context.</param>
-			/// <param name="parent">The parent context in the chain.</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="StackFrame" /> class
-			/// with the specified message and parent context.
-			/// </para>
-			/// </remarks>
-			internal StackFrame(string message, StackFrame parent)
-			{
-				m_message = message;
-				m_parent = parent;
+      /// <summary>
+      /// Constructor
+      /// </summary>
+      /// <param name="message">The message for this context.</param>
+      /// <param name="parent">The parent context in the chain.</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="StackFrame" /> class
+      /// with the specified message and parent context.
+      /// </para>
+      /// </remarks>
+      internal StackFrame(string message, StackFrame parent)
+      {
+        m_message = message;
+        m_parent = parent;
 
-				if (parent == null)
-				{
-					m_fullMessage = message;
-				}
-			}
+        if (parent == null)
+        {
+          m_fullMessage = message;
+        }
+      }
 
-			#endregion Internal Instance Constructors
+      #endregion Internal Instance Constructors
 
-			#region Internal Instance Properties
+      #region Internal Instance Properties
 
-			/// <summary>
-			/// Get the message.
-			/// </summary>
-			/// <value>The message.</value>
-			/// <remarks>
-			/// <para>
-			/// Get the message.
-			/// </para>
-			/// </remarks>
-			internal string Message
-			{
-				get { return m_message; }
-			}
+      /// <summary>
+      /// Get the message.
+      /// </summary>
+      /// <value>The message.</value>
+      /// <remarks>
+      /// <para>
+      /// Get the message.
+      /// </para>
+      /// </remarks>
+      internal string Message
+      {
+        get { return m_message; }
+      }
 
-			/// <summary>
-			/// Gets the full text of the context down to the root level.
-			/// </summary>
-			/// <value>
-			/// The full text of the context down to the root level.
-			/// </value>
-			/// <remarks>
-			/// <para>
-			/// Gets the full text of the context down to the root level.
-			/// </para>
-			/// </remarks>
-			internal string FullMessage
-			{
-				get
-				{
-					if (m_fullMessage == null && m_parent != null)
-					{
-						m_fullMessage = string.Concat(m_parent.FullMessage, " ", m_message);
-					}
-					return m_fullMessage;
-				}
-			}
+      /// <summary>
+      /// Gets the full text of the context down to the root level.
+      /// </summary>
+      /// <value>
+      /// The full text of the context down to the root level.
+      /// </value>
+      /// <remarks>
+      /// <para>
+      /// Gets the full text of the context down to the root level.
+      /// </para>
+      /// </remarks>
+      internal string FullMessage
+      {
+        get
+        {
+          if (m_fullMessage == null && m_parent != null)
+          {
+            m_fullMessage = string.Concat(m_parent.FullMessage, " ", m_message);
+          }
+          return m_fullMessage;
+        }
+      }
 
-			#endregion Internal Instance Properties
-		}
+      #endregion Internal Instance Properties
+    }
 
-		/// <summary>
-		/// Struct returned from the <see cref="LogicalThreadContextStack.Push"/> method.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This struct implements the <see cref="IDisposable"/> and is designed to be used
-		/// with the <see langword="using"/> pattern to remove the stack frame at the end of the scope.
-		/// </para>
-		/// </remarks>
-		private struct AutoPopStackFrame : IDisposable
-		{
-			#region Private Instance Fields
+    /// <summary>
+    /// Struct returned from the <see cref="LogicalThreadContextStack.Push"/> method.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This struct implements the <see cref="IDisposable"/> and is designed to be used
+    /// with the <see langword="using"/> pattern to remove the stack frame at the end of the scope.
+    /// </para>
+    /// </remarks>
+    private struct AutoPopStackFrame : IDisposable
+    {
+      #region Private Instance Fields
 
-			/// <summary>
-			/// The depth to trim the stack to when this instance is disposed
-			/// </summary>
-			private int m_frameDepth;
+      /// <summary>
+      /// The depth to trim the stack to when this instance is disposed
+      /// </summary>
+      private int m_frameDepth;
 
-			/// <summary>
-			/// The outer LogicalThreadContextStack.
-			/// </summary>
-			private LogicalThreadContextStack m_logicalThreadContextStack;
+      /// <summary>
+      /// The outer LogicalThreadContextStack.
+      /// </summary>
+      private LogicalThreadContextStack m_logicalThreadContextStack;
 
-			#endregion Private Instance Fields
+      #endregion Private Instance Fields
 
-			#region Internal Instance Constructors
+      #region Internal Instance Constructors
 
-			/// <summary>
-			/// Constructor
-			/// </summary>
-			/// <param name="logicalThreadContextStack">The internal stack used by the ThreadContextStack.</param>
-			/// <param name="frameDepth">The depth to return the stack to when this object is disposed.</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="AutoPopStackFrame" /> class with
-			/// the specified stack and return depth.
-			/// </para>
-			/// </remarks>
-			internal AutoPopStackFrame(LogicalThreadContextStack logicalThreadContextStack, int frameDepth)
-			{
-				m_frameDepth = frameDepth;
-				m_logicalThreadContextStack = logicalThreadContextStack;
-			}
+      /// <summary>
+      /// Constructor
+      /// </summary>
+      /// <param name="logicalThreadContextStack">The internal stack used by the ThreadContextStack.</param>
+      /// <param name="frameDepth">The depth to return the stack to when this object is disposed.</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="AutoPopStackFrame" /> class with
+      /// the specified stack and return depth.
+      /// </para>
+      /// </remarks>
+      internal AutoPopStackFrame(LogicalThreadContextStack logicalThreadContextStack, int frameDepth)
+      {
+        m_frameDepth = frameDepth;
+        m_logicalThreadContextStack = logicalThreadContextStack;
+      }
 
-			#endregion Internal Instance Constructors
+      #endregion Internal Instance Constructors
 
-			#region Implementation of IDisposable
+      #region Implementation of IDisposable
 
-			/// <summary>
-			/// Returns the stack to the correct depth.
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Returns the stack to the correct depth.
-			/// </para>
-			/// </remarks>
-			public void Dispose()
-			{
-				if (m_frameDepth >= 0 && m_logicalThreadContextStack.m_stack != null)
-				{
-					Stack stack = new Stack(new Stack(m_logicalThreadContextStack.m_stack));
-					while (stack.Count > m_frameDepth)
-					{
-						stack.Pop();
-					}
-					LogicalThreadContextStack ltcs = new LogicalThreadContextStack(m_logicalThreadContextStack.m_propertyKey, m_logicalThreadContextStack.m_registerNew);
-					ltcs.m_stack = stack;
-					m_logicalThreadContextStack.m_registerNew(m_logicalThreadContextStack.m_propertyKey,
-						ltcs);
-				}
-			}
+      /// <summary>
+      /// Returns the stack to the correct depth.
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Returns the stack to the correct depth.
+      /// </para>
+      /// </remarks>
+      public void Dispose()
+      {
+        if (m_frameDepth >= 0 && m_logicalThreadContextStack.m_stack != null)
+        {
+          Stack stack = new Stack(new Stack(m_logicalThreadContextStack.m_stack));
+          while (stack.Count > m_frameDepth)
+          {
+            stack.Pop();
+          }
+          LogicalThreadContextStack ltcs = new LogicalThreadContextStack(m_logicalThreadContextStack.m_propertyKey, m_logicalThreadContextStack.m_registerNew);
+          ltcs.m_stack = stack;
+          m_logicalThreadContextStack.m_registerNew(m_logicalThreadContextStack.m_propertyKey,
+            ltcs);
+        }
+      }
 
-			#endregion Implementation of IDisposable
-		}
+      #endregion Implementation of IDisposable
+    }
 
-	}
+  }
 }
 #endif
\ No newline at end of file
diff --git a/src/log4net/Util/LogicalThreadContextStacks.cs b/src/log4net/Util/LogicalThreadContextStacks.cs
index 7d4a225..6ea5901 100644
--- a/src/log4net/Util/LogicalThreadContextStacks.cs
+++ b/src/log4net/Util/LogicalThreadContextStacks.cs
@@ -22,121 +22,121 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implementation of Stacks collection for the <see cref="log4net.LogicalThreadContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Implementation of Stacks collection for the <see cref="log4net.LogicalThreadContext"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class LogicalThreadContextStacks
-	{
-		private readonly LogicalThreadContextProperties m_properties;
+  /// <summary>
+  /// Implementation of Stacks collection for the <see cref="log4net.LogicalThreadContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Implementation of Stacks collection for the <see cref="log4net.LogicalThreadContext"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class LogicalThreadContextStacks
+  {
+    private readonly LogicalThreadContextProperties m_properties;
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Internal constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ThreadContextStacks" /> class.
-		/// </para>
-		/// </remarks>
-		internal LogicalThreadContextStacks(LogicalThreadContextProperties properties)
-		{
-			m_properties = properties;
-		}
+    /// <summary>
+    /// Internal constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ThreadContextStacks" /> class.
+    /// </para>
+    /// </remarks>
+    internal LogicalThreadContextStacks(LogicalThreadContextProperties properties)
+    {
+      m_properties = properties;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the named thread context stack
-		/// </summary>
-		/// <value>
-		/// The named stack
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the named thread context stack
-		/// </para>
-		/// </remarks>
-		public LogicalThreadContextStack this[string key]
-		{
-			get
-			{
-				LogicalThreadContextStack stack = null;
+    /// <summary>
+    /// Gets the named thread context stack
+    /// </summary>
+    /// <value>
+    /// The named stack
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the named thread context stack
+    /// </para>
+    /// </remarks>
+    public LogicalThreadContextStack this[string key]
+    {
+      get
+      {
+        LogicalThreadContextStack stack = null;
 
-				object propertyValue = m_properties[key];
-				if (propertyValue == null)
-				{
-					// Stack does not exist, create
+        object propertyValue = m_properties[key];
+        if (propertyValue == null)
+        {
+          // Stack does not exist, create
 #if NET_2_0 || MONO_2_0 || NETSTANDARD
-					stack = new LogicalThreadContextStack(key, registerNew);
+          stack = new LogicalThreadContextStack(key, registerNew);
 #else
-					stack = new LogicalThreadContextStack(key, new TwoArgAction(registerNew));
+          stack = new LogicalThreadContextStack(key, new TwoArgAction(registerNew));
 #endif
-					m_properties[key] = stack;
-				}
-				else
-				{
-					// Look for existing stack
-					stack = propertyValue as LogicalThreadContextStack;
-					if (stack == null)
-					{
-						// Property is not set to a stack!
-						string propertyValueString = SystemInfo.NullText;
+          m_properties[key] = stack;
+        }
+        else
+        {
+          // Look for existing stack
+          stack = propertyValue as LogicalThreadContextStack;
+          if (stack == null)
+          {
+            // Property is not set to a stack!
+            string propertyValueString = SystemInfo.NullText;
 
-						try
-						{
-							propertyValueString = propertyValue.ToString();
-						}
-						catch
-						{
-						}
+            try
+            {
+              propertyValueString = propertyValue.ToString();
+            }
+            catch
+            {
+            }
 
-						LogLog.Error(declaringType, "ThreadContextStacks: Request for stack named [" + key + "] failed because a property with the same name exists which is a [" + propertyValue.GetType().Name + "] with value [" + propertyValueString + "]");
+            LogLog.Error(declaringType, "ThreadContextStacks: Request for stack named [" + key + "] failed because a property with the same name exists which is a [" + propertyValue.GetType().Name + "] with value [" + propertyValueString + "]");
 
 #if NET_2_0 || MONO_2_0 || NETSTANDARD
-						stack = new LogicalThreadContextStack(key, registerNew);
+            stack = new LogicalThreadContextStack(key, registerNew);
 #else
-						stack = new LogicalThreadContextStack(key, new TwoArgAction(registerNew));
+            stack = new LogicalThreadContextStack(key, new TwoArgAction(registerNew));
 #endif
-					}
-				}
+          }
+        }
 
-				return stack;
-			}
-		}
+        return stack;
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private void registerNew(string stackName, LogicalThreadContextStack stack)
-		{
-			m_properties[stackName] = stack;
-		}
+    private void registerNew(string stackName, LogicalThreadContextStack stack)
+    {
+      m_properties[stackName] = stack;
+    }
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The fully qualified type of the ThreadContextStacks class.
-		/// </summary>
-		/// <remarks>
-		/// Used by the internal logger to record the Type of the
-		/// log message.
-		/// </remarks>
-		private static readonly Type declaringType = typeof(LogicalThreadContextStacks);
+    /// <summary>
+    /// The fully qualified type of the ThreadContextStacks class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(LogicalThreadContextStacks);
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
 #endif
diff --git a/src/log4net/Util/NativeError.cs b/src/log4net/Util/NativeError.cs
index b527c53..e93cef1 100644
--- a/src/log4net/Util/NativeError.cs
+++ b/src/log4net/Util/NativeError.cs
@@ -28,263 +28,263 @@
 using System.Globalization;
 using System.Runtime.InteropServices;
 
-namespace log4net.Util 
+namespace log4net.Util
 {
-	/// <summary>
-	/// Represents a native error code and message.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Represents a Win32 platform native error.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class NativeError 
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Represents a native error code and message.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Represents a Win32 platform native error.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class NativeError
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Create an instance of the <see cref="NativeError" /> class with the specified 
-		/// error number and message.
-		/// </summary>
-		/// <param name="number">The number of the native error.</param>
-		/// <param name="message">The message of the native error.</param>
-		/// <remarks>
-		/// <para>
-		/// Create an instance of the <see cref="NativeError" /> class with the specified 
-		/// error number and message.
-		/// </para>
-		/// </remarks>
-		private NativeError(int number, string message) 
-		{
-			m_number = number;
-			m_message = message;
-		}
+    /// <summary>
+    /// Create an instance of the <see cref="NativeError" /> class with the specified 
+    /// error number and message.
+    /// </summary>
+    /// <param name="number">The number of the native error.</param>
+    /// <param name="message">The message of the native error.</param>
+    /// <remarks>
+    /// <para>
+    /// Create an instance of the <see cref="NativeError" /> class with the specified 
+    /// error number and message.
+    /// </para>
+    /// </remarks>
+    private NativeError(int number, string message)
+    {
+      m_number = number;
+      m_message = message;
+    }
 
-		#endregion // Protected Instance Constructors
+    #endregion // Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the number of the native error.
-		/// </summary>
-		/// <value>
-		/// The number of the native error.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the number of the native error.
-		/// </para>
-		/// </remarks>
-		public int Number 
-		{
-			get { return m_number; }
-		}
+    /// <summary>
+    /// Gets the number of the native error.
+    /// </summary>
+    /// <value>
+    /// The number of the native error.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the number of the native error.
+    /// </para>
+    /// </remarks>
+    public int Number
+    {
+      get { return m_number; }
+    }
 
-		/// <summary>
-		/// Gets the message of the native error.
-		/// </summary>
-		/// <value>
-		/// The message of the native error.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// </para>
-		/// Gets the message of the native error.
-		/// </remarks>
-		public string Message 
-		{
-			get { return m_message; }
-		}
+    /// <summary>
+    /// Gets the message of the native error.
+    /// </summary>
+    /// <value>
+    /// The message of the native error.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// </para>
+    /// Gets the message of the native error.
+    /// </remarks>
+    public string Message
+    {
+      get { return m_message; }
+    }
 
-		#endregion // Public Instance Properties
+    #endregion // Public Instance Properties
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Create a new instance of the <see cref="NativeError" /> class for the last Windows error.
-		/// </summary>
-		/// <returns>
-		/// An instance of the <see cref="NativeError" /> class for the last windows error.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// The message for the <see cref="Marshal.GetLastWin32Error"/> error number is lookup up using the 
-		/// native Win32 <c>FormatMessage</c> function.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Create a new instance of the <see cref="NativeError" /> class for the last Windows error.
+    /// </summary>
+    /// <returns>
+    /// An instance of the <see cref="NativeError" /> class for the last windows error.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// The message for the <see cref="Marshal.GetLastWin32Error"/> error number is lookup up using the 
+    /// native Win32 <c>FormatMessage</c> function.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
         [System.Security.SecuritySafeCritical]
 #endif
 #if !NETCF && !NETSTANDARD1_3
-        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
 #endif
-        public static NativeError GetLastError() 
-		{
-			int number = Marshal.GetLastWin32Error();
-			return new NativeError(number, NativeError.GetErrorMessage(number));
-		}
+    public static NativeError GetLastError()
+    {
+      int number = Marshal.GetLastWin32Error();
+      return new NativeError(number, NativeError.GetErrorMessage(number));
+    }
 
-		/// <summary>
-		/// Create a new instance of the <see cref="NativeError" /> class.
-		/// </summary>
-		/// <param name="number">the error number for the native error</param>
-		/// <returns>
-		/// An instance of the <see cref="NativeError" /> class for the specified 
-		/// error number.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// The message for the specified error number is lookup up using the 
-		/// native Win32 <c>FormatMessage</c> function.
-		/// </para>
-		/// </remarks>
-		public static NativeError GetError(int number) 
-		{
-			return new NativeError(number, NativeError.GetErrorMessage(number));
-		}
+    /// <summary>
+    /// Create a new instance of the <see cref="NativeError" /> class.
+    /// </summary>
+    /// <param name="number">the error number for the native error</param>
+    /// <returns>
+    /// An instance of the <see cref="NativeError" /> class for the specified 
+    /// error number.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// The message for the specified error number is lookup up using the 
+    /// native Win32 <c>FormatMessage</c> function.
+    /// </para>
+    /// </remarks>
+    public static NativeError GetError(int number)
+    {
+      return new NativeError(number, NativeError.GetErrorMessage(number));
+    }
 
-		/// <summary>
-		/// Retrieves the message corresponding with a Win32 message identifier.
-		/// </summary>
-		/// <param name="messageId">Message identifier for the requested message.</param>
-		/// <returns>
-		/// The message corresponding with the specified message identifier.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// The message will be searched for in system message-table resource(s)
-		/// using the native <c>FormatMessage</c> function.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Retrieves the message corresponding with a Win32 message identifier.
+    /// </summary>
+    /// <param name="messageId">Message identifier for the requested message.</param>
+    /// <returns>
+    /// The message corresponding with the specified message identifier.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// The message will be searched for in system message-table resource(s)
+    /// using the native <c>FormatMessage</c> function.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
         [System.Security.SecuritySafeCritical]
 #endif
 #if !NETCF && !NETSTANDARD1_3
-        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
 #endif
-        public static string GetErrorMessage(int messageId) 
-		{
-			// Win32 constants
-			int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;	// The function should allocates a buffer large enough to hold the formatted message
-			int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;		// Insert sequences in the message definition are to be ignored
-			int FORMAT_MESSAGE_FROM_SYSTEM  = 0x00001000;		// The function should search the system message-table resource(s) for the requested message
+    public static string GetErrorMessage(int messageId)
+    {
+      // Win32 constants
+      int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100;  // The function should allocates a buffer large enough to hold the formatted message
+      int FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200;    // Insert sequences in the message definition are to be ignored
+      int FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000;    // The function should search the system message-table resource(s) for the requested message
 
-			string msgBuf = "";				// buffer that will receive the message
-			IntPtr sourcePtr = new IntPtr();	// Location of the message definition, will be ignored
-			IntPtr argumentsPtr = new IntPtr();	// Pointer to array of values to insert, not supported as it requires unsafe code
+      string msgBuf = "";        // buffer that will receive the message
+      IntPtr sourcePtr = new IntPtr();  // Location of the message definition, will be ignored
+      IntPtr argumentsPtr = new IntPtr();  // Pointer to array of values to insert, not supported as it requires unsafe code
 
-			if (messageId != 0) 
-			{
-				// If the function succeeds, the return value is the number of TCHARs stored in the output buffer, excluding the terminating null character
-				int messageSize = FormatMessage(
-					FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 
-					ref sourcePtr, 
-					messageId, 
-					0, 
-					ref msgBuf, 
-					255, 
-					argumentsPtr);
+      if (messageId != 0)
+      {
+        // If the function succeeds, the return value is the number of TCHARs stored in the output buffer, excluding the terminating null character
+        int messageSize = FormatMessage(
+          FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+          ref sourcePtr,
+          messageId,
+          0,
+          ref msgBuf,
+          255,
+          argumentsPtr);
 
-				if (messageSize > 0) 
-				{
-					// Remove trailing null-terminating characters (\r\n) from the message
-					msgBuf = msgBuf.TrimEnd(new char[] {'\r', '\n'});
-				}
-				else 
-				{
-					// A message could not be located.
-					msgBuf = null;
-				}
-			} 
-			else 
-			{
-				msgBuf = null;
-			}
+        if (messageSize > 0)
+        {
+          // Remove trailing null-terminating characters (\r\n) from the message
+          msgBuf = msgBuf.TrimEnd(new char[] { '\r', '\n' });
+        }
+        else
+        {
+          // A message could not be located.
+          msgBuf = null;
+        }
+      }
+      else
+      {
+        msgBuf = null;
+      }
 
-			return msgBuf;
-		}
+      return msgBuf;
+    }
 
-		#endregion // Public Static Methods
+    #endregion // Public Static Methods
 
-		#region Override Object Implementation
+    #region Override Object Implementation
 
-		/// <summary>
-		/// Return error information string
-		/// </summary>
-		/// <returns>error information string</returns>
-		/// <remarks>
-		/// <para>
-		/// Return error information string
-		/// </para>
-		/// </remarks>
-		public override string ToString() 
-		{
-			return string.Format(CultureInfo.InvariantCulture, "0x{0:x8}", this.Number) + (this.Message != null ? ": " + this.Message : "");
-		}
+    /// <summary>
+    /// Return error information string
+    /// </summary>
+    /// <returns>error information string</returns>
+    /// <remarks>
+    /// <para>
+    /// Return error information string
+    /// </para>
+    /// </remarks>
+    public override string ToString()
+    {
+      return string.Format(CultureInfo.InvariantCulture, "0x{0:x8}", this.Number) + (this.Message != null ? ": " + this.Message : "");
+    }
 
-		#endregion // Override Object Implementation
+    #endregion // Override Object Implementation
 
-		#region Stubs For Native Function Calls
+    #region Stubs For Native Function Calls
 
-		/// <summary>
-		/// Formats a message string.
-		/// </summary>
-		/// <param name="dwFlags">Formatting options, and how to interpret the <paramref name="lpSource" /> parameter.</param>
-		/// <param name="lpSource">Location of the message definition.</param>
-		/// <param name="dwMessageId">Message identifier for the requested message.</param>
-		/// <param name="dwLanguageId">Language identifier for the requested message.</param>
-		/// <param name="lpBuffer">If <paramref name="dwFlags" /> includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the <c>LocalAlloc</c> function, and places the pointer to the buffer at the address specified in <paramref name="lpBuffer" />.</param>
-		/// <param name="nSize">If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer.</param>
-		/// <param name="Arguments">Pointer to an array of values that are used as insert values in the formatted message.</param>
-		/// <remarks>
-		/// <para>
-		/// The function requires a message definition as input. The message definition can come from a 
-		/// buffer passed into the function. It can come from a message table resource in an 
-		/// already-loaded module. Or the caller can ask the function to search the system's message 
-		/// table resource(s) for the message definition. The function finds the message definition 
-		/// in a message table resource based on a message identifier and a language identifier. 
-		/// The function copies the formatted message text to an output buffer, processing any embedded 
-		/// insert sequences if requested.
-		/// </para>
-		/// <para>
-		/// To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message.
-		/// </para>
-		/// </remarks>
-		/// <returns>
-		/// <para>
-		/// If the function succeeds, the return value is the number of TCHARs stored in the output 
-		/// buffer, excluding the terminating null character.
-		/// </para>
-		/// <para>
-		/// If the function fails, the return value is zero. To get extended error information, 
-		/// call <see cref="M:Marshal.GetLastWin32Error()" />.
-		/// </para>
-		/// </returns>
+    /// <summary>
+    /// Formats a message string.
+    /// </summary>
+    /// <param name="dwFlags">Formatting options, and how to interpret the <paramref name="lpSource" /> parameter.</param>
+    /// <param name="lpSource">Location of the message definition.</param>
+    /// <param name="dwMessageId">Message identifier for the requested message.</param>
+    /// <param name="dwLanguageId">Language identifier for the requested message.</param>
+    /// <param name="lpBuffer">If <paramref name="dwFlags" /> includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the <c>LocalAlloc</c> function, and places the pointer to the buffer at the address specified in <paramref name="lpBuffer" />.</param>
+    /// <param name="nSize">If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer.</param>
+    /// <param name="Arguments">Pointer to an array of values that are used as insert values in the formatted message.</param>
+    /// <remarks>
+    /// <para>
+    /// The function requires a message definition as input. The message definition can come from a 
+    /// buffer passed into the function. It can come from a message table resource in an 
+    /// already-loaded module. Or the caller can ask the function to search the system's message 
+    /// table resource(s) for the message definition. The function finds the message definition 
+    /// in a message table resource based on a message identifier and a language identifier. 
+    /// The function copies the formatted message text to an output buffer, processing any embedded 
+    /// insert sequences if requested.
+    /// </para>
+    /// <para>
+    /// To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message.
+    /// </para>
+    /// </remarks>
+    /// <returns>
+    /// <para>
+    /// If the function succeeds, the return value is the number of TCHARs stored in the output 
+    /// buffer, excluding the terminating null character.
+    /// </para>
+    /// <para>
+    /// If the function fails, the return value is zero. To get extended error information, 
+    /// call <see cref="M:Marshal.GetLastWin32Error()" />.
+    /// </para>
+    /// </returns>
 #if NETCF || NETSTANDARD
-		[DllImport("CoreDll.dll", SetLastError=true, CharSet=CharSet.Unicode)]
+    [DllImport("CoreDll.dll", SetLastError=true, CharSet=CharSet.Unicode)]
 #else
-		[DllImport("Kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
+    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
 #endif
-		private static extern int FormatMessage(
-			int dwFlags, 
-			ref IntPtr lpSource, 
-			int dwMessageId,
-			int dwLanguageId, 
-			ref String lpBuffer, 
-			int nSize,
-			IntPtr Arguments);
+    private static extern int FormatMessage(
+      int dwFlags,
+      ref IntPtr lpSource,
+      int dwMessageId,
+      int dwLanguageId,
+      ref String lpBuffer,
+      int nSize,
+      IntPtr Arguments);
 
-		#endregion // Stubs For Native Function Calls
+    #endregion // Stubs For Native Function Calls
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		private int m_number;
-		private string m_message;
+    private int m_number;
+    private string m_message;
 
-		#endregion
-	}
+    #endregion
+  }
 }
 
 #endif // !CLI_1_0
diff --git a/src/log4net/Util/NullDictionaryEnumerator.cs b/src/log4net/Util/NullDictionaryEnumerator.cs
index 48af424..5f1d055 100644
--- a/src/log4net/Util/NullDictionaryEnumerator.cs
+++ b/src/log4net/Util/NullDictionaryEnumerator.cs
@@ -22,181 +22,181 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// An always empty <see cref="IDictionaryEnumerator"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A singleton implementation of the <see cref="IDictionaryEnumerator"/> over a collection
-	/// that is empty and not modifiable.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class NullDictionaryEnumerator : IDictionaryEnumerator
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// An always empty <see cref="IDictionaryEnumerator"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A singleton implementation of the <see cref="IDictionaryEnumerator"/> over a collection
+  /// that is empty and not modifiable.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class NullDictionaryEnumerator : IDictionaryEnumerator
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="NullDictionaryEnumerator" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to enforce the singleton pattern.
-		/// </para>
-		/// </remarks>
-		private NullDictionaryEnumerator()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="NullDictionaryEnumerator" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to enforce the singleton pattern.
+    /// </para>
+    /// </remarks>
+    private NullDictionaryEnumerator()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Properties
-  
-		/// <summary>
-		/// Gets the singleton instance of the <see cref="NullDictionaryEnumerator" />.
-		/// </summary>
-		/// <returns>The singleton instance of the <see cref="NullDictionaryEnumerator" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the singleton instance of the <see cref="NullDictionaryEnumerator" />.
-		/// </para>
-		/// </remarks>
-		public static NullDictionaryEnumerator Instance
-		{
-			get { return s_instance; }
-		}
+    #region Public Static Properties
 
-		#endregion Public Static Properties
+    /// <summary>
+    /// Gets the singleton instance of the <see cref="NullDictionaryEnumerator" />.
+    /// </summary>
+    /// <returns>The singleton instance of the <see cref="NullDictionaryEnumerator" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the singleton instance of the <see cref="NullDictionaryEnumerator" />.
+    /// </para>
+    /// </remarks>
+    public static NullDictionaryEnumerator Instance
+    {
+      get { return s_instance; }
+    }
 
-		#region Implementation of IEnumerator
+    #endregion Public Static Properties
 
-		/// <summary>
-		/// Gets the current object from the enumerator.
-		/// </summary>
-		/// <remarks>
-		/// Throws an <see cref="InvalidOperationException" /> because the 
-		/// <see cref="NullDictionaryEnumerator" /> never has a current value.
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="Current"/>
-		/// will throw an <see cref="InvalidOperationException"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
-		/// cannot be positioned over a valid location.</exception>
-		public object Current 
-		{
-			get	{ throw new InvalidOperationException(); }
-		}
-  
-		/// <summary>
-		/// Test if the enumerator can advance, if so advance.
-		/// </summary>
-		/// <returns><c>false</c> as the <see cref="NullDictionaryEnumerator" /> cannot advance.</returns>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="MoveNext"/>
-		/// will always return <c>false</c>.
-		/// </para>
-		/// </remarks>
-		public bool MoveNext()
-		{
-			return false;
-		}
-  
-		/// <summary>
-		/// Resets the enumerator back to the start.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection <see cref="Reset"/> does nothing.
-		/// </para>
-		/// </remarks>
-		public void Reset() 
-		{
-		}
+    #region Implementation of IEnumerator
 
-		#endregion Implementation of IEnumerator
+    /// <summary>
+    /// Gets the current object from the enumerator.
+    /// </summary>
+    /// <remarks>
+    /// Throws an <see cref="InvalidOperationException" /> because the 
+    /// <see cref="NullDictionaryEnumerator" /> never has a current value.
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="Current"/>
+    /// will throw an <see cref="InvalidOperationException"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
+    /// cannot be positioned over a valid location.</exception>
+    public object Current
+    {
+      get { throw new InvalidOperationException(); }
+    }
 
-		#region Implementation of IDictionaryEnumerator
+    /// <summary>
+    /// Test if the enumerator can advance, if so advance.
+    /// </summary>
+    /// <returns><c>false</c> as the <see cref="NullDictionaryEnumerator" /> cannot advance.</returns>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="MoveNext"/>
+    /// will always return <c>false</c>.
+    /// </para>
+    /// </remarks>
+    public bool MoveNext()
+    {
+      return false;
+    }
 
-		/// <summary>
-		/// Gets the current key from the enumerator.
-		/// </summary>
-		/// <remarks>
-		/// Throws an exception because the <see cref="NullDictionaryEnumerator" />
-		/// never has a current value.
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="Key"/>
-		/// will throw an <see cref="InvalidOperationException"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
-		/// cannot be positioned over a valid location.</exception>
-		public object Key 
-		{
-			get	{ throw new InvalidOperationException(); }
-		}
+    /// <summary>
+    /// Resets the enumerator back to the start.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection <see cref="Reset"/> does nothing.
+    /// </para>
+    /// </remarks>
+    public void Reset()
+    {
+    }
 
-		/// <summary>
-		/// Gets the current value from the enumerator.
-		/// </summary>
-		/// <value>The current value from the enumerator.</value>
-		/// <remarks>
-		/// Throws an <see cref="InvalidOperationException" /> because the 
-		/// <see cref="NullDictionaryEnumerator" /> never has a current value.
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="Value"/>
-		/// will throw an <see cref="InvalidOperationException"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
-		/// cannot be positioned over a valid location.</exception>
-		public object Value 
-		{
-			get	{ throw new InvalidOperationException(); }
-		}
+    #endregion Implementation of IEnumerator
 
-		/// <summary>
-		/// Gets the current entry from the enumerator.
-		/// </summary>
-		/// <remarks>
-		/// Throws an <see cref="InvalidOperationException" /> because the 
-		/// <see cref="NullDictionaryEnumerator" /> never has a current entry.
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="Entry"/>
-		/// will throw an <see cref="InvalidOperationException"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
-		/// cannot be positioned over a valid location.</exception>
-		public DictionaryEntry Entry 
-		{
-			get	{ throw new InvalidOperationException(); }
-		}
-  
-		#endregion Implementation of IDictionaryEnumerator
+    #region Implementation of IDictionaryEnumerator
 
-		#region Private Static Fields
+    /// <summary>
+    /// Gets the current key from the enumerator.
+    /// </summary>
+    /// <remarks>
+    /// Throws an exception because the <see cref="NullDictionaryEnumerator" />
+    /// never has a current value.
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="Key"/>
+    /// will throw an <see cref="InvalidOperationException"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
+    /// cannot be positioned over a valid location.</exception>
+    public object Key
+    {
+      get { throw new InvalidOperationException(); }
+    }
 
-		/// <summary>
-		/// The singleton instance of the <see cref="NullDictionaryEnumerator" />.
-		/// </summary>
-		private static readonly NullDictionaryEnumerator s_instance = new NullDictionaryEnumerator();
-  
-		#endregion Private Static Fields
-	}
+    /// <summary>
+    /// Gets the current value from the enumerator.
+    /// </summary>
+    /// <value>The current value from the enumerator.</value>
+    /// <remarks>
+    /// Throws an <see cref="InvalidOperationException" /> because the 
+    /// <see cref="NullDictionaryEnumerator" /> never has a current value.
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="Value"/>
+    /// will throw an <see cref="InvalidOperationException"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
+    /// cannot be positioned over a valid location.</exception>
+    public object Value
+    {
+      get { throw new InvalidOperationException(); }
+    }
+
+    /// <summary>
+    /// Gets the current entry from the enumerator.
+    /// </summary>
+    /// <remarks>
+    /// Throws an <see cref="InvalidOperationException" /> because the 
+    /// <see cref="NullDictionaryEnumerator" /> never has a current entry.
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="Entry"/>
+    /// will throw an <see cref="InvalidOperationException"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
+    /// cannot be positioned over a valid location.</exception>
+    public DictionaryEntry Entry
+    {
+      get { throw new InvalidOperationException(); }
+    }
+
+    #endregion Implementation of IDictionaryEnumerator
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The singleton instance of the <see cref="NullDictionaryEnumerator" />.
+    /// </summary>
+    private static readonly NullDictionaryEnumerator s_instance = new NullDictionaryEnumerator();
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/NullEnumerator.cs b/src/log4net/Util/NullEnumerator.cs
index 4cb7806..4c57d11 100644
--- a/src/log4net/Util/NullEnumerator.cs
+++ b/src/log4net/Util/NullEnumerator.cs
@@ -22,113 +22,113 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// An always empty <see cref="IEnumerator"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A singleton implementation of the <see cref="IEnumerator"/> over a collection
-	/// that is empty and not modifiable.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class NullEnumerator : IEnumerator
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// An always empty <see cref="IEnumerator"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A singleton implementation of the <see cref="IEnumerator"/> over a collection
+  /// that is empty and not modifiable.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class NullEnumerator : IEnumerator
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="NullEnumerator" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to enforce the singleton pattern.
-		/// </para>
-		/// </remarks>
-		private NullEnumerator()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="NullEnumerator" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to enforce the singleton pattern.
+    /// </para>
+    /// </remarks>
+    private NullEnumerator()
+    {
+    }
 
-		#endregion Private Instance Constructors
-  
-		#region Public Static Properties
+    #endregion Private Instance Constructors
 
-		/// <summary>
-		/// Get the singleton instance of the <see cref="NullEnumerator" />.
-		/// </summary>
-		/// <returns>The singleton instance of the <see cref="NullEnumerator" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the singleton instance of the <see cref="NullEnumerator" />.
-		/// </para>
-		/// </remarks>
-		public static NullEnumerator Instance
-		{
-			get { return s_instance; }
-		}
+    #region Public Static Properties
 
-		#endregion Public Static Properties
+    /// <summary>
+    /// Get the singleton instance of the <see cref="NullEnumerator" />.
+    /// </summary>
+    /// <returns>The singleton instance of the <see cref="NullEnumerator" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the singleton instance of the <see cref="NullEnumerator" />.
+    /// </para>
+    /// </remarks>
+    public static NullEnumerator Instance
+    {
+      get { return s_instance; }
+    }
 
-		#region Implementation of IEnumerator
+    #endregion Public Static Properties
 
-		/// <summary>
-		/// Gets the current object from the enumerator.
-		/// </summary>
-		/// <remarks>
-		/// Throws an <see cref="InvalidOperationException" /> because the 
-		/// <see cref="NullDictionaryEnumerator" /> never has a current value.
-		/// </remarks>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="Current"/>
-		/// will throw an <see cref="InvalidOperationException"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
-		/// cannot be positioned over a valid location.</exception>
-		public object Current 
-		{
-			get	{ throw new InvalidOperationException(); }
-		}
-  
-		/// <summary>
-		/// Test if the enumerator can advance, if so advance
-		/// </summary>
-		/// <returns><c>false</c> as the <see cref="NullEnumerator" /> cannot advance.</returns>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection its <see cref="Current"/>
-		/// value cannot be moved over a valid position, therefore <see cref="MoveNext"/>
-		/// will always return <c>false</c>.
-		/// </para>
-		/// </remarks>
-		public bool MoveNext()
-		{
-			return false;
-		}
-  
-		/// <summary>
-		/// Resets the enumerator back to the start.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// As the enumerator is over an empty collection <see cref="Reset"/> does nothing.
-		/// </para>
-		/// </remarks>
-		public void Reset() 
-		{
-		}
+    #region Implementation of IEnumerator
 
-		#endregion Implementation of IEnumerator
+    /// <summary>
+    /// Gets the current object from the enumerator.
+    /// </summary>
+    /// <remarks>
+    /// Throws an <see cref="InvalidOperationException" /> because the 
+    /// <see cref="NullDictionaryEnumerator" /> never has a current value.
+    /// </remarks>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="Current"/>
+    /// will throw an <see cref="InvalidOperationException"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="InvalidOperationException">The collection is empty and <see cref="Current"/> 
+    /// cannot be positioned over a valid location.</exception>
+    public object Current
+    {
+      get { throw new InvalidOperationException(); }
+    }
 
-		#region Private Static Fields
+    /// <summary>
+    /// Test if the enumerator can advance, if so advance
+    /// </summary>
+    /// <returns><c>false</c> as the <see cref="NullEnumerator" /> cannot advance.</returns>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection its <see cref="Current"/>
+    /// value cannot be moved over a valid position, therefore <see cref="MoveNext"/>
+    /// will always return <c>false</c>.
+    /// </para>
+    /// </remarks>
+    public bool MoveNext()
+    {
+      return false;
+    }
 
-		/// <summary>
-		/// The singleton instance of the <see cref="NullEnumerator" />.
-		/// </summary>
-		private static readonly NullEnumerator s_instance = new NullEnumerator();
-  
-		#endregion Private Static Fields
-	}
+    /// <summary>
+    /// Resets the enumerator back to the start.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// As the enumerator is over an empty collection <see cref="Reset"/> does nothing.
+    /// </para>
+    /// </remarks>
+    public void Reset()
+    {
+    }
+
+    #endregion Implementation of IEnumerator
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The singleton instance of the <see cref="NullEnumerator" />.
+    /// </summary>
+    private static readonly NullEnumerator s_instance = new NullEnumerator();
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/NullSecurityContext.cs b/src/log4net/Util/NullSecurityContext.cs
index 3196d1d..d01d7d3 100644
--- a/src/log4net/Util/NullSecurityContext.cs
+++ b/src/log4net/Util/NullSecurityContext.cs
@@ -23,54 +23,54 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// A SecurityContext used when a SecurityContext is not required
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <see cref="NullSecurityContext"/> is a no-op implementation of the
-	/// <see cref="SecurityContext"/> base class. It is used where a <see cref="SecurityContext"/>
-	/// is required but one has not been provided.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class NullSecurityContext : SecurityContext
-	{
-		/// <summary>
-		/// Singleton instance of <see cref="NullSecurityContext"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Singleton instance of <see cref="NullSecurityContext"/>
-		/// </para>
-		/// </remarks>
-		public static readonly NullSecurityContext Instance = new NullSecurityContext();
+  /// <summary>
+  /// A SecurityContext used when a SecurityContext is not required
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <see cref="NullSecurityContext"/> is a no-op implementation of the
+  /// <see cref="SecurityContext"/> base class. It is used where a <see cref="SecurityContext"/>
+  /// is required but one has not been provided.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class NullSecurityContext : SecurityContext
+  {
+    /// <summary>
+    /// Singleton instance of <see cref="NullSecurityContext"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Singleton instance of <see cref="NullSecurityContext"/>
+    /// </para>
+    /// </remarks>
+    public static readonly NullSecurityContext Instance = new NullSecurityContext();
 
-		/// <summary>
-		/// Private constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Private constructor for singleton pattern.
-		/// </para>
-		/// </remarks>
-		private NullSecurityContext()
-		{
-		}
+    /// <summary>
+    /// Private constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Private constructor for singleton pattern.
+    /// </para>
+    /// </remarks>
+    private NullSecurityContext()
+    {
+    }
 
-		/// <summary>
-		/// Impersonate this SecurityContext
-		/// </summary>
-		/// <param name="state">State supplied by the caller</param>
-		/// <returns><c>null</c></returns>
-		/// <remarks>
-		/// <para>
-		/// No impersonation is done and <c>null</c> is always returned.
-		/// </para>
-		/// </remarks>
-		public override IDisposable Impersonate(object state)
-		{
-			return null;
-		}
-	}
+    /// <summary>
+    /// Impersonate this SecurityContext
+    /// </summary>
+    /// <param name="state">State supplied by the caller</param>
+    /// <returns><c>null</c></returns>
+    /// <remarks>
+    /// <para>
+    /// No impersonation is done and <c>null</c> is always returned.
+    /// </para>
+    /// </remarks>
+    public override IDisposable Impersonate(object state)
+    {
+      return null;
+    }
+  }
 }
diff --git a/src/log4net/Util/OnlyOnceErrorHandler.cs b/src/log4net/Util/OnlyOnceErrorHandler.cs
index 5f03d92..f593607 100644
--- a/src/log4net/Util/OnlyOnceErrorHandler.cs
+++ b/src/log4net/Util/OnlyOnceErrorHandler.cs
@@ -23,261 +23,263 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implements log4net's default error handling policy which consists 
-	/// of emitting a message for the first error in an appender and 
-	/// ignoring all subsequent errors.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The error message is processed using the LogLog sub-system by default.
-	/// </para>
-	/// <para>
-	/// This policy aims at protecting an otherwise working application
-	/// from being flooded with error messages when logging fails.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Ron Grabowski</author>
-	public class OnlyOnceErrorHandler : IErrorHandler
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Implements log4net's default error handling policy which consists 
+  /// of emitting a message for the first error in an appender and 
+  /// ignoring all subsequent errors.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The error message is processed using the LogLog sub-system by default.
+  /// </para>
+  /// <para>
+  /// This policy aims at protecting an otherwise working application
+  /// from being flooded with error messages when logging fails.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Ron Grabowski</author>
+  public class OnlyOnceErrorHandler : IErrorHandler
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Default Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="OnlyOnceErrorHandler" /> class.
-		/// </para>
-		/// </remarks>
-		public OnlyOnceErrorHandler()
-		{
-			m_prefix = "";
-		}
+    /// <summary>
+    /// Default Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="OnlyOnceErrorHandler" /> class.
+    /// </para>
+    /// </remarks>
+    public OnlyOnceErrorHandler()
+    {
+      m_prefix = "";
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="prefix">The prefix to use for each message.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="OnlyOnceErrorHandler" /> class
-		/// with the specified prefix.
-		/// </para>
-		/// </remarks>
-		public OnlyOnceErrorHandler(string prefix)
-		{
-			m_prefix = prefix;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="prefix">The prefix to use for each message.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="OnlyOnceErrorHandler" /> class
+    /// with the specified prefix.
+    /// </para>
+    /// </remarks>
+    public OnlyOnceErrorHandler(string prefix)
+    {
+      m_prefix = prefix;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Reset the error handler back to its initial disabled state.
-		/// </summary>
-		public void Reset()
-		{
-			m_enabledDateUtc = DateTime.MinValue;
-			m_errorCode = ErrorCode.GenericFailure;
-			m_exception = null;
-			m_message = null;
-			m_firstTime = true;
-		}
+    /// <summary>
+    /// Reset the error handler back to its initial disabled state.
+    /// </summary>
+    public void Reset()
+    {
+      m_enabledDateUtc = DateTime.MinValue;
+      m_errorCode = ErrorCode.GenericFailure;
+      m_exception = null;
+      m_message = null;
+      m_firstTime = true;
+    }
 
-		#region Implementation of IErrorHandler
+    #region Implementation of IErrorHandler
 
-		/// <summary>
-		/// Log an Error
-		/// </summary>
-		/// <param name="message">The error message.</param>
-		/// <param name="e">The exception.</param>
-		/// <param name="errorCode">The internal error code.</param>
-		/// <remarks>
-		/// <para>
-		/// Invokes <see cref="FirstError"/> if and only if this is the first error or the first error after <see cref="Reset"/> has been called.
-		/// </para>
-		/// </remarks>
-		public void Error(string message, Exception e, ErrorCode errorCode) 
-		{
-			if (m_firstTime)
-			{
-                FirstError(message, e, errorCode);
-			}
-		}
+    /// <summary>
+    /// Log an Error
+    /// </summary>
+    /// <param name="message">The error message.</param>
+    /// <param name="e">The exception.</param>
+    /// <param name="errorCode">The internal error code.</param>
+    /// <remarks>
+    /// <para>
+    /// Invokes <see cref="FirstError"/> if and only if this is the first error or the first error after <see cref="Reset"/> has been called.
+    /// </para>
+    /// </remarks>
+    public void Error(string message, Exception e, ErrorCode errorCode)
+    {
+      if (m_firstTime)
+      {
+        FirstError(message, e, errorCode);
+      }
+    }
 
-        /// <summary>
-        /// Log the very first error
-        /// </summary>
-        /// <param name="message">The error message.</param>
-        /// <param name="e">The exception.</param>
-        /// <param name="errorCode">The internal error code.</param>
-        /// <remarks>
-        /// <para>
-        /// Sends the error information to <see cref="LogLog"/>'s Error method.
-        /// </para>
-        /// </remarks>
-        public virtual void FirstError(string message, Exception e, ErrorCode errorCode) {
-            m_enabledDateUtc = DateTime.UtcNow;
-            m_errorCode = errorCode;
-            m_exception = e;
-            m_message = message;
-            m_firstTime = false;
+    /// <summary>
+    /// Log the very first error
+    /// </summary>
+    /// <param name="message">The error message.</param>
+    /// <param name="e">The exception.</param>
+    /// <param name="errorCode">The internal error code.</param>
+    /// <remarks>
+    /// <para>
+    /// Sends the error information to <see cref="LogLog"/>'s Error method.
+    /// </para>
+    /// </remarks>
+    public virtual void FirstError(string message, Exception e, ErrorCode errorCode)
+    {
+      m_enabledDateUtc = DateTime.UtcNow;
+      m_errorCode = errorCode;
+      m_exception = e;
+      m_message = message;
+      m_firstTime = false;
 
-            if (LogLog.InternalDebugging && !LogLog.QuietMode) {
-                LogLog.Error(declaringType, "[" + m_prefix + "] ErrorCode: " + errorCode.ToString() + ". " + message, e);
-            }
-        }
+      if (LogLog.InternalDebugging && !LogLog.QuietMode)
+      {
+        LogLog.Error(declaringType, "[" + m_prefix + "] ErrorCode: " + errorCode.ToString() + ". " + message, e);
+      }
+    }
 
-        /// <summary>
-		/// Log an Error
-		/// </summary>
-		/// <param name="message">The error message.</param>
-		/// <param name="e">The exception.</param>
-		/// <remarks>
-        /// <para>
-        /// Invokes <see cref="FirstError"/> if and only if this is the first error or the first error after <see cref="Reset"/> has been called.
-        /// </para>
-        /// </remarks>
-		public void Error(string message, Exception e) 
-		{
-			Error(message, e, ErrorCode.GenericFailure);
-		}
+    /// <summary>
+    /// Log an Error
+    /// </summary>
+    /// <param name="message">The error message.</param>
+    /// <param name="e">The exception.</param>
+    /// <remarks>
+    /// <para>
+    /// Invokes <see cref="FirstError"/> if and only if this is the first error or the first error after <see cref="Reset"/> has been called.
+    /// </para>
+    /// </remarks>
+    public void Error(string message, Exception e)
+    {
+      Error(message, e, ErrorCode.GenericFailure);
+    }
 
-		/// <summary>
-		/// Log an error
-		/// </summary>
-		/// <param name="message">The error message.</param>
-		/// <remarks>
-        /// <para>
-        /// Invokes <see cref="FirstError"/> if and only if this is the first error or the first error after <see cref="Reset"/> has been called.
-        /// </para>
-        /// </remarks>
-		public void Error(string message) 
-		{
-			Error(message, null, ErrorCode.GenericFailure);
-		}
+    /// <summary>
+    /// Log an error
+    /// </summary>
+    /// <param name="message">The error message.</param>
+    /// <remarks>
+    /// <para>
+    /// Invokes <see cref="FirstError"/> if and only if this is the first error or the first error after <see cref="Reset"/> has been called.
+    /// </para>
+    /// </remarks>
+    public void Error(string message)
+    {
+      Error(message, null, ErrorCode.GenericFailure);
+    }
 
-		#endregion Implementation of IErrorHandler
+    #endregion Implementation of IErrorHandler
 
-		#endregion
+    #endregion
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Is error logging enabled
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Is error logging enabled. Logging is only enabled for the
-		/// first error delivered to the <see cref="OnlyOnceErrorHandler"/>.
-		/// </para>
-		/// </remarks>
-		public bool IsEnabled
-		{
-			get { return m_firstTime; }
-		}
+    /// <summary>
+    /// Is error logging enabled
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Is error logging enabled. Logging is only enabled for the
+    /// first error delivered to the <see cref="OnlyOnceErrorHandler"/>.
+    /// </para>
+    /// </remarks>
+    public bool IsEnabled
+    {
+      get { return m_firstTime; }
+    }
 
-		/// <summary>
-		/// The date the first error that trigged this error handler occurred, or <see cref="DateTime.MinValue"/> if it has not been triggered.
-		/// </summary>
-		public DateTime EnabledDate
-		{
-			get 
-            {
-                if (m_enabledDateUtc == DateTime.MinValue) return DateTime.MinValue;
-                return m_enabledDateUtc.ToLocalTime(); 
-            }
-		}
+    /// <summary>
+    /// The date the first error that trigged this error handler occurred, or <see cref="DateTime.MinValue"/> if it has not been triggered.
+    /// </summary>
+    public DateTime EnabledDate
+    {
+      get
+      {
+        if (m_enabledDateUtc == DateTime.MinValue) return DateTime.MinValue;
+        return m_enabledDateUtc.ToLocalTime();
+      }
+    }
 
-        /// <summary>
-        /// The UTC date the first error that trigged this error handler occured, or <see cref="DateTime.MinValue"/> if it has not been triggered.
-        /// </summary>
-        public DateTime EnabledDateUtc
-        {
-            get { return m_enabledDateUtc; }
-        }
+    /// <summary>
+    /// The UTC date the first error that trigged this error handler occured, or <see cref="DateTime.MinValue"/> if it has not been triggered.
+    /// </summary>
+    public DateTime EnabledDateUtc
+    {
+      get { return m_enabledDateUtc; }
+    }
 
-		/// <summary>
-		/// The message from the first error that trigged this error handler.
-		/// </summary>
-		public string ErrorMessage
-		{
-			get { return m_message; }
-		}
+    /// <summary>
+    /// The message from the first error that trigged this error handler.
+    /// </summary>
+    public string ErrorMessage
+    {
+      get { return m_message; }
+    }
 
-		/// <summary>
-		/// The exception from the first error that trigged this error handler.
-		/// </summary>
-		/// <remarks>
-		/// May be <see langword="null" />.
-		/// </remarks>
-		public Exception Exception
-		{
-			get { return m_exception; }
-		}
+    /// <summary>
+    /// The exception from the first error that trigged this error handler.
+    /// </summary>
+    /// <remarks>
+    /// May be <see langword="null" />.
+    /// </remarks>
+    public Exception Exception
+    {
+      get { return m_exception; }
+    }
 
-		/// <summary>
-		/// The error code from the first error that trigged this error handler.
-		/// </summary>
-		/// <remarks>
-		/// Defaults to <see cref="log4net.Core.ErrorCode.GenericFailure"/>
-		/// </remarks>
-		public ErrorCode ErrorCode
-		{
-			get { return m_errorCode; }
-		}
+    /// <summary>
+    /// The error code from the first error that trigged this error handler.
+    /// </summary>
+    /// <remarks>
+    /// Defaults to <see cref="log4net.Core.ErrorCode.GenericFailure"/>
+    /// </remarks>
+    public ErrorCode ErrorCode
+    {
+      get { return m_errorCode; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Private Instance Fields
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The UTC date the error was recorded.
-		/// </summary>
-		private DateTime m_enabledDateUtc;
+    /// <summary>
+    /// The UTC date the error was recorded.
+    /// </summary>
+    private DateTime m_enabledDateUtc;
 
-		/// <summary>
-		/// Flag to indicate if it is the first error
-		/// </summary>
-		private bool m_firstTime = true;
+    /// <summary>
+    /// Flag to indicate if it is the first error
+    /// </summary>
+    private bool m_firstTime = true;
 
-		/// <summary>
-		/// The message recorded during the first error.
-		/// </summary>
-		private string m_message = null;
+    /// <summary>
+    /// The message recorded during the first error.
+    /// </summary>
+    private string m_message = null;
 
-		/// <summary>
-		/// The exception recorded during the first error.
-		/// </summary>
-		private Exception m_exception = null;
+    /// <summary>
+    /// The exception recorded during the first error.
+    /// </summary>
+    private Exception m_exception = null;
 
-		/// <summary>
-		/// The error code recorded during the first error.
-		/// </summary>
-		private ErrorCode m_errorCode = ErrorCode.GenericFailure;
+    /// <summary>
+    /// The error code recorded during the first error.
+    /// </summary>
+    private ErrorCode m_errorCode = ErrorCode.GenericFailure;
 
-		/// <summary>
-		/// String to prefix each message with
-		/// </summary>
-		private readonly string m_prefix;
+    /// <summary>
+    /// String to prefix each message with
+    /// </summary>
+    private readonly string m_prefix;
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the OnlyOnceErrorHandler class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-		private static readonly Type declaringType = typeof(OnlyOnceErrorHandler);
+    /// <summary>
+    /// The fully qualified type of the OnlyOnceErrorHandler class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(OnlyOnceErrorHandler);
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/OptionConverter.cs b/src/log4net/Util/OptionConverter.cs
index 21eabfe..8f4bcc7 100644
--- a/src/log4net/Util/OptionConverter.cs
+++ b/src/log4net/Util/OptionConverter.cs
@@ -27,542 +27,542 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// A convenience class to convert property values to specific types.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Utility functions for converting types and parsing values.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class OptionConverter
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// A convenience class to convert property values to specific types.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Utility functions for converting types and parsing values.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class OptionConverter
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="OptionConverter" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </para>
-		/// </remarks>
-		private OptionConverter()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="OptionConverter" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </para>
+    /// </remarks>
+    private OptionConverter()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Converts a string to a <see cref="bool" /> value.
-		/// </summary>
-		/// <param name="argValue">String to convert.</param>
-		/// <param name="defaultValue">The default value.</param>
-		/// <returns>The <see cref="bool" /> value of <paramref name="argValue" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// If <paramref name="argValue"/> is "true", then <c>true</c> is returned. 
-		/// If <paramref name="argValue"/> is "false", then <c>false</c> is returned. 
-		/// Otherwise, <paramref name="defaultValue"/> is returned.
-		/// </para>
-		/// </remarks>
-		public static bool ToBoolean(string argValue, bool defaultValue) 
-		{
-			if (argValue != null && argValue.Length > 0)
-			{
-				try
-				{
-					return bool.Parse(argValue);
-				}
-				catch(Exception e)
-				{
-					LogLog.Error(declaringType, "[" + argValue + "] is not in proper bool form.", e);
-				}
-			}
-			return defaultValue;
-		}
+    /// <summary>
+    /// Converts a string to a <see cref="bool" /> value.
+    /// </summary>
+    /// <param name="argValue">String to convert.</param>
+    /// <param name="defaultValue">The default value.</param>
+    /// <returns>The <see cref="bool" /> value of <paramref name="argValue" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// If <paramref name="argValue"/> is "true", then <c>true</c> is returned. 
+    /// If <paramref name="argValue"/> is "false", then <c>false</c> is returned. 
+    /// Otherwise, <paramref name="defaultValue"/> is returned.
+    /// </para>
+    /// </remarks>
+    public static bool ToBoolean(string argValue, bool defaultValue)
+    {
+      if (argValue != null && argValue.Length > 0)
+      {
+        try
+        {
+          return bool.Parse(argValue);
+        }
+        catch (Exception e)
+        {
+          LogLog.Error(declaringType, "[" + argValue + "] is not in proper bool form.", e);
+        }
+      }
+      return defaultValue;
+    }
 
-		/// <summary>
-		/// Parses a file size into a number.
-		/// </summary>
-		/// <param name="argValue">String to parse.</param>
-		/// <param name="defaultValue">The default value.</param>
-		/// <returns>The <see cref="long" /> value of <paramref name="argValue" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Parses a file size of the form: number[KB|MB|GB] into a
-		/// long value. It is scaled with the appropriate multiplier.
-		/// </para>
-		/// <para>
-		/// <paramref name="defaultValue"/> is returned when <paramref name="argValue"/>
-		/// cannot be converted to a <see cref="long" /> value.
-		/// </para>
-		/// </remarks>
-		public static long ToFileSize(string argValue, long defaultValue) 
-		{
-			if (argValue == null)
-			{
-				return defaultValue;
-			}
-	
-			string s = argValue.Trim().ToUpperInvariant();
-			long multiplier = 1;
-			int index;
-	
-			if ((index = s.IndexOf("KB")) != -1) 
-			{	  
-				multiplier = 1024;
-				s = s.Substring(0, index);
-			}
-			else if ((index = s.IndexOf("MB")) != -1) 
-			{
-				multiplier = 1024 * 1024;
-				s = s.Substring(0, index);
-			}
-			else if ((index = s.IndexOf("GB")) != -1) 
-			{
-				multiplier = 1024 * 1024 * 1024;
-				s = s.Substring(0, index);
-			}	
-			if (s != null) 
-			{
-				// Try again to remove whitespace between the number and the size specifier
-				s = s.Trim();
-				
-				long longVal;
-				if (SystemInfo.TryParse(s, out longVal))
-				{
-					return longVal * multiplier;
-				}
-				else
-				{
-					LogLog.Error(declaringType, "OptionConverter: ["+ s +"] is not in the correct file size syntax.");
-				}
-			}
-			return defaultValue;
-		}
+    /// <summary>
+    /// Parses a file size into a number.
+    /// </summary>
+    /// <param name="argValue">String to parse.</param>
+    /// <param name="defaultValue">The default value.</param>
+    /// <returns>The <see cref="long" /> value of <paramref name="argValue" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Parses a file size of the form: number[KB|MB|GB] into a
+    /// long value. It is scaled with the appropriate multiplier.
+    /// </para>
+    /// <para>
+    /// <paramref name="defaultValue"/> is returned when <paramref name="argValue"/>
+    /// cannot be converted to a <see cref="long" /> value.
+    /// </para>
+    /// </remarks>
+    public static long ToFileSize(string argValue, long defaultValue)
+    {
+      if (argValue == null)
+      {
+        return defaultValue;
+      }
 
-		/// <summary>
-		/// Converts a string to an object.
-		/// </summary>
-		/// <param name="target">The target type to convert to.</param>
-		/// <param name="txt">The string to convert to an object.</param>
-		/// <returns>
-		/// The object converted from a string or <c>null</c> when the 
-		/// conversion failed.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Converts a string to an object. Uses the converter registry to try
-		/// to convert the string value into the specified target type.
-		/// </para>
-		/// </remarks>
-		public static object ConvertStringTo(Type target, string txt)
-		{
-			if (target == null)
-			{
-				throw new ArgumentNullException("target");
-			}
+      string s = argValue.Trim().ToUpperInvariant();
+      long multiplier = 1;
+      int index;
 
-			// If we want a string we already have the correct type
-			if (typeof(string) == target || typeof(object) == target)
-			{
-				return txt;
-			}
+      if ((index = s.IndexOf("KB")) != -1)
+      {
+        multiplier = 1024;
+        s = s.Substring(0, index);
+      }
+      else if ((index = s.IndexOf("MB")) != -1)
+      {
+        multiplier = 1024 * 1024;
+        s = s.Substring(0, index);
+      }
+      else if ((index = s.IndexOf("GB")) != -1)
+      {
+        multiplier = 1024 * 1024 * 1024;
+        s = s.Substring(0, index);
+      }
+      if (s != null)
+      {
+        // Try again to remove whitespace between the number and the size specifier
+        s = s.Trim();
 
-			// First lets try to find a type converter
-			IConvertFrom typeConverter = ConverterRegistry.GetConvertFrom(target);
-			if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
-			{
-				// Found appropriate converter
-				return typeConverter.ConvertFrom(txt);
-			}
-			else
-			{
+        long longVal;
+        if (SystemInfo.TryParse(s, out longVal))
+        {
+          return longVal * multiplier;
+        }
+        else
+        {
+          LogLog.Error(declaringType, "OptionConverter: [" + s + "] is not in the correct file size syntax.");
+        }
+      }
+      return defaultValue;
+    }
+
+    /// <summary>
+    /// Converts a string to an object.
+    /// </summary>
+    /// <param name="target">The target type to convert to.</param>
+    /// <param name="txt">The string to convert to an object.</param>
+    /// <returns>
+    /// The object converted from a string or <c>null</c> when the 
+    /// conversion failed.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Converts a string to an object. Uses the converter registry to try
+    /// to convert the string value into the specified target type.
+    /// </para>
+    /// </remarks>
+    public static object ConvertStringTo(Type target, string txt)
+    {
+      if (target == null)
+      {
+        throw new ArgumentNullException("target");
+      }
+
+      // If we want a string we already have the correct type
+      if (typeof(string) == target || typeof(object) == target)
+      {
+        return txt;
+      }
+
+      // First lets try to find a type converter
+      IConvertFrom typeConverter = ConverterRegistry.GetConvertFrom(target);
+      if (typeConverter != null && typeConverter.CanConvertFrom(typeof(string)))
+      {
+        // Found appropriate converter
+        return typeConverter.ConvertFrom(txt);
+      }
+      else
+      {
 #if NETSTANDARD1_3
-				if (target.GetTypeInfo().IsEnum)
+        if (target.GetTypeInfo().IsEnum)
 #else
-				if (target.IsEnum)
+        if (target.IsEnum)
 #endif
-				{
-					// Target type is an enum.
+        {
+          // Target type is an enum.
 
-					// Use the Enum.Parse(EnumType, string) method to get the enum value
-					return ParseEnum(target, txt, true);
-				}
-				else
-				{
-					// We essentially make a guess that to convert from a string
-					// to an arbitrary type T there will be a static method defined on type T called Parse
-					// that will take an argument of type string. i.e. T.Parse(string)->T we call this
-					// method to convert the string to the type required by the property.
-					System.Reflection.MethodInfo meth = target.GetMethod("Parse", new Type[] {typeof(string)});
-					if (meth != null)
-					{
-						// Call the Parse method
+          // Use the Enum.Parse(EnumType, string) method to get the enum value
+          return ParseEnum(target, txt, true);
+        }
+        else
+        {
+          // We essentially make a guess that to convert from a string
+          // to an arbitrary type T there will be a static method defined on type T called Parse
+          // that will take an argument of type string. i.e. T.Parse(string)->T we call this
+          // method to convert the string to the type required by the property.
+          System.Reflection.MethodInfo meth = target.GetMethod("Parse", new Type[] { typeof(string) });
+          if (meth != null)
+          {
+            // Call the Parse method
 #if NETSTANDARD1_3
-						return meth.Invoke(target, new[] { txt });
+            return meth.Invoke(target, new[] { txt });
 #else
-						return meth.Invoke(null, BindingFlags.InvokeMethod, null, new object[] {txt}, CultureInfo.InvariantCulture);
+            return meth.Invoke(null, BindingFlags.InvokeMethod, null, new object[] { txt }, CultureInfo.InvariantCulture);
 #endif
-					}
-					else
-					{
-						// No Parse() method found.
-					}
-				}
-			}
-			return null;
-		}
+          }
+          else
+          {
+            // No Parse() method found.
+          }
+        }
+      }
+      return null;
+    }
 
-//		/// <summary>
-//		/// Looks up the <see cref="IConvertFrom"/> for the target type.
-//		/// </summary>
-//		/// <param name="target">The type to lookup the converter for.</param>
-//		/// <returns>The converter for the specified type.</returns>
-//		public static IConvertFrom GetTypeConverter(Type target)
-//		{
-//			IConvertFrom converter = ConverterRegistry.GetConverter(target);
-//			if (converter == null)
-//			{
-//				throw new InvalidOperationException("No type converter defined for [" + target + "]");
-//			}
-//			return converter;
-//		}
+    //    /// <summary>
+    //    /// Looks up the <see cref="IConvertFrom"/> for the target type.
+    //    /// </summary>
+    //    /// <param name="target">The type to lookup the converter for.</param>
+    //    /// <returns>The converter for the specified type.</returns>
+    //    public static IConvertFrom GetTypeConverter(Type target)
+    //    {
+    //      IConvertFrom converter = ConverterRegistry.GetConverter(target);
+    //      if (converter == null)
+    //      {
+    //        throw new InvalidOperationException("No type converter defined for [" + target + "]");
+    //      }
+    //      return converter;
+    //    }
 
-		/// <summary>
-		/// Checks if there is an appropriate type conversion from the source type to the target type.
-		/// </summary>
-		/// <param name="sourceType">The type to convert from.</param>
-		/// <param name="targetType">The type to convert to.</param>
-		/// <returns><c>true</c> if there is a conversion from the source type to the target type.</returns>
-		/// <remarks>
-		/// Checks if there is an appropriate type conversion from the source type to the target type.
-		/// <para>
-		/// </para>
-		/// </remarks>
-		public static bool CanConvertTypeTo(Type sourceType, Type targetType)
-		{
-			if (sourceType == null || targetType == null)
-			{
-				return false;
-			}
+    /// <summary>
+    /// Checks if there is an appropriate type conversion from the source type to the target type.
+    /// </summary>
+    /// <param name="sourceType">The type to convert from.</param>
+    /// <param name="targetType">The type to convert to.</param>
+    /// <returns><c>true</c> if there is a conversion from the source type to the target type.</returns>
+    /// <remarks>
+    /// Checks if there is an appropriate type conversion from the source type to the target type.
+    /// <para>
+    /// </para>
+    /// </remarks>
+    public static bool CanConvertTypeTo(Type sourceType, Type targetType)
+    {
+      if (sourceType == null || targetType == null)
+      {
+        return false;
+      }
 
-			// Check if we can assign directly from the source type to the target type
-			if (targetType.IsAssignableFrom(sourceType))
-			{
-				return true;
-			}
+      // Check if we can assign directly from the source type to the target type
+      if (targetType.IsAssignableFrom(sourceType))
+      {
+        return true;
+      }
 
-			// Look for a To converter
-			IConvertTo tcSource = ConverterRegistry.GetConvertTo(sourceType, targetType);
-			if (tcSource != null)
-			{
-				if (tcSource.CanConvertTo(targetType))
-				{
-					return true;
-				}
-			}
+      // Look for a To converter
+      IConvertTo tcSource = ConverterRegistry.GetConvertTo(sourceType, targetType);
+      if (tcSource != null)
+      {
+        if (tcSource.CanConvertTo(targetType))
+        {
+          return true;
+        }
+      }
 
-			// Look for a From converter
-			IConvertFrom tcTarget = ConverterRegistry.GetConvertFrom(targetType);
-			if (tcTarget != null)
-			{
-				if (tcTarget.CanConvertFrom(sourceType))
-				{
-					return true;
-				}
-			}
+      // Look for a From converter
+      IConvertFrom tcTarget = ConverterRegistry.GetConvertFrom(targetType);
+      if (tcTarget != null)
+      {
+        if (tcTarget.CanConvertFrom(sourceType))
+        {
+          return true;
+        }
+      }
 
-			return false;
-		}
+      return false;
+    }
 
-		/// <summary>
-		/// Converts an object to the target type.
-		/// </summary>
-		/// <param name="sourceInstance">The object to convert to the target type.</param>
-		/// <param name="targetType">The type to convert to.</param>
-		/// <returns>The converted object.</returns>
-		/// <remarks>
-		/// <para>
-		/// Converts an object to the target type.
-		/// </para>
-		/// </remarks>
-		public static object ConvertTypeTo(object sourceInstance, Type targetType)
-		{
-			Type sourceType = sourceInstance.GetType();
+    /// <summary>
+    /// Converts an object to the target type.
+    /// </summary>
+    /// <param name="sourceInstance">The object to convert to the target type.</param>
+    /// <param name="targetType">The type to convert to.</param>
+    /// <returns>The converted object.</returns>
+    /// <remarks>
+    /// <para>
+    /// Converts an object to the target type.
+    /// </para>
+    /// </remarks>
+    public static object ConvertTypeTo(object sourceInstance, Type targetType)
+    {
+      Type sourceType = sourceInstance.GetType();
 
-			// Check if we can assign directly from the source type to the target type
-			if (targetType.IsAssignableFrom(sourceType))
-			{
-				return sourceInstance;
-			}
+      // Check if we can assign directly from the source type to the target type
+      if (targetType.IsAssignableFrom(sourceType))
+      {
+        return sourceInstance;
+      }
 
-			// Look for a TO converter
-			IConvertTo tcSource = ConverterRegistry.GetConvertTo(sourceType, targetType);
-			if (tcSource != null)
-			{
-				if (tcSource.CanConvertTo(targetType))
-				{
-					return tcSource.ConvertTo(sourceInstance, targetType);
-				}
-			}
+      // Look for a TO converter
+      IConvertTo tcSource = ConverterRegistry.GetConvertTo(sourceType, targetType);
+      if (tcSource != null)
+      {
+        if (tcSource.CanConvertTo(targetType))
+        {
+          return tcSource.ConvertTo(sourceInstance, targetType);
+        }
+      }
 
-			// Look for a FROM converter
-			IConvertFrom tcTarget = ConverterRegistry.GetConvertFrom(targetType);
-			if (tcTarget != null)
-			{
-				if (tcTarget.CanConvertFrom(sourceType))
-				{
-					return tcTarget.ConvertFrom(sourceInstance);
-				}
-			}
+      // Look for a FROM converter
+      IConvertFrom tcTarget = ConverterRegistry.GetConvertFrom(targetType);
+      if (tcTarget != null)
+      {
+        if (tcTarget.CanConvertFrom(sourceType))
+        {
+          return tcTarget.ConvertFrom(sourceInstance);
+        }
+      }
 
-			throw new ArgumentException("Cannot convert source object [" + sourceInstance.ToString() + "] to target type [" + targetType.Name + "]", "sourceInstance");
-		}
+      throw new ArgumentException("Cannot convert source object [" + sourceInstance.ToString() + "] to target type [" + targetType.Name + "]", "sourceInstance");
+    }
 
-//		/// <summary>
-//		/// Finds the value corresponding to <paramref name="key"/> in 
-//		/// <paramref name="props"/> and then perform variable substitution 
-//		/// on the found value.
-//		/// </summary>
-//		/// <param name="key">The key to lookup.</param>
-//		/// <param name="props">The association to use for lookups.</param>
-//		/// <returns>The substituted result.</returns>
-//		public static string FindAndSubst(string key, System.Collections.IDictionary props) 
-//		{
-//			if (props == null)
-//			{
-//				throw new ArgumentNullException("props");
-//			}
-//
-//			string v = props[key] as string;
-//			if (v == null) 
-//			{
-//				return null;	  
-//			}
-//	
-//			try 
-//			{
-//				return SubstituteVariables(v, props);
-//			} 
-//			catch(Exception e) 
-//			{
-//				LogLog.Error(declaringType, "OptionConverter: Bad option value [" + v + "].", e);
-//				return v;
-//			}	
-//		}
+    //    /// <summary>
+    //    /// Finds the value corresponding to <paramref name="key"/> in 
+    //    /// <paramref name="props"/> and then perform variable substitution 
+    //    /// on the found value.
+    //    /// </summary>
+    //    /// <param name="key">The key to lookup.</param>
+    //    /// <param name="props">The association to use for lookups.</param>
+    //    /// <returns>The substituted result.</returns>
+    //    public static string FindAndSubst(string key, System.Collections.IDictionary props) 
+    //    {
+    //      if (props == null)
+    //      {
+    //        throw new ArgumentNullException("props");
+    //      }
+    //
+    //      string v = props[key] as string;
+    //      if (v == null) 
+    //      {
+    //        return null;    
+    //      }
+    //  
+    //      try 
+    //      {
+    //        return SubstituteVariables(v, props);
+    //      } 
+    //      catch(Exception e) 
+    //      {
+    //        LogLog.Error(declaringType, "OptionConverter: Bad option value [" + v + "].", e);
+    //        return v;
+    //      }  
+    //    }
 
-		/// <summary>
-		/// Instantiates an object given a class name.
-		/// </summary>
-		/// <param name="className">The fully qualified class name of the object to instantiate.</param>
-		/// <param name="superClass">The class to which the new object should belong.</param>
-		/// <param name="defaultValue">The object to return in case of non-fulfillment.</param>
-		/// <returns>
-		/// An instance of the <paramref name="className"/> or <paramref name="defaultValue"/>
-		/// if the object could not be instantiated.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Checks that the <paramref name="className"/> is a subclass of
-		/// <paramref name="superClass"/>. If that test fails or the object could
-		/// not be instantiated, then <paramref name="defaultValue"/> is returned.
-		/// </para>
-		/// </remarks>
-		public static object InstantiateByClassName(string className, Type superClass, object defaultValue) 
-		{
-			if (className != null) 
-			{
-				try 
-				{
+    /// <summary>
+    /// Instantiates an object given a class name.
+    /// </summary>
+    /// <param name="className">The fully qualified class name of the object to instantiate.</param>
+    /// <param name="superClass">The class to which the new object should belong.</param>
+    /// <param name="defaultValue">The object to return in case of non-fulfillment.</param>
+    /// <returns>
+    /// An instance of the <paramref name="className"/> or <paramref name="defaultValue"/>
+    /// if the object could not be instantiated.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Checks that the <paramref name="className"/> is a subclass of
+    /// <paramref name="superClass"/>. If that test fails or the object could
+    /// not be instantiated, then <paramref name="defaultValue"/> is returned.
+    /// </para>
+    /// </remarks>
+    public static object InstantiateByClassName(string className, Type superClass, object defaultValue)
+    {
+      if (className != null)
+      {
+        try
+        {
 #if NETSTANDARD1_3
-					Type classObj = SystemInfo.GetTypeFromString(superClass.GetTypeInfo().Assembly, className, true, true);
+          Type classObj = SystemInfo.GetTypeFromString(superClass.GetTypeInfo().Assembly, className, true, true);
 #else
-					Type classObj = SystemInfo.GetTypeFromString(className, true, true);
+          Type classObj = SystemInfo.GetTypeFromString(className, true, true);
 #endif
-					if (!superClass.IsAssignableFrom(classObj)) 
-					{
-						LogLog.Error(declaringType, "OptionConverter: A [" + className + "] object is not assignable to a [" + superClass.FullName + "] variable.");
-						return defaultValue;	  
-					}
-					return Activator.CreateInstance(classObj);
-				}
-				catch (Exception e) 
-				{
-					LogLog.Error(declaringType, "Could not instantiate class [" + className + "].", e);
-				}
-			}
-			return defaultValue;	
-		}
+          if (!superClass.IsAssignableFrom(classObj))
+          {
+            LogLog.Error(declaringType, "OptionConverter: A [" + className + "] object is not assignable to a [" + superClass.FullName + "] variable.");
+            return defaultValue;
+          }
+          return Activator.CreateInstance(classObj);
+        }
+        catch (Exception e)
+        {
+          LogLog.Error(declaringType, "Could not instantiate class [" + className + "].", e);
+        }
+      }
+      return defaultValue;
+    }
 
-		/// <summary>
-		/// Performs variable substitution in string <paramref name="value"/> from the 
-		/// values of keys found in <paramref name="props"/>.
-		/// </summary>
-		/// <param name="value">The string on which variable substitution is performed.</param>
-		/// <param name="props">The dictionary to use to lookup variables.</param>
-		/// <returns>The result of the substitutions.</returns>
-		/// <remarks>
-		/// <para>
-		/// The variable substitution delimiters are <b>${</b> and <b>}</b>.
-		/// </para>
-		/// <para>
-		/// For example, if props contains <c>key=value</c>, then the call
-		/// </para>
-		/// <para>
-		/// <code lang="C#">
-		/// string s = OptionConverter.SubstituteVariables("Value of key is ${key}.");
-		/// </code>
-		/// </para>
-		/// <para>
-		/// will set the variable <c>s</c> to "Value of key is value.".
-		/// </para>
-		/// <para>
-		/// If no value could be found for the specified key, then substitution 
-		/// defaults to an empty string.
-		/// </para>
-		/// <para>
-		/// For example, if system properties contains no value for the key
-		/// "nonExistentKey", then the call
-		/// </para>
-		/// <para>
-		/// <code lang="C#">
-		/// string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]");
-		/// </code>
-		/// </para>
-		/// <para>
-		/// will set <s>s</s> to "Value of nonExistentKey is []".	 
-		/// </para>
-		/// <para>
-		/// An Exception is thrown if <paramref name="value"/> contains a start 
-		/// delimiter "${" which is not balanced by a stop delimiter "}". 
-		/// </para>
-		/// </remarks>
-		public static string SubstituteVariables(string value, System.Collections.IDictionary props) 
-		{
-			StringBuilder buf = new StringBuilder();
+    /// <summary>
+    /// Performs variable substitution in string <paramref name="value"/> from the 
+    /// values of keys found in <paramref name="props"/>.
+    /// </summary>
+    /// <param name="value">The string on which variable substitution is performed.</param>
+    /// <param name="props">The dictionary to use to lookup variables.</param>
+    /// <returns>The result of the substitutions.</returns>
+    /// <remarks>
+    /// <para>
+    /// The variable substitution delimiters are <b>${</b> and <b>}</b>.
+    /// </para>
+    /// <para>
+    /// For example, if props contains <c>key=value</c>, then the call
+    /// </para>
+    /// <para>
+    /// <code lang="C#">
+    /// string s = OptionConverter.SubstituteVariables("Value of key is ${key}.");
+    /// </code>
+    /// </para>
+    /// <para>
+    /// will set the variable <c>s</c> to "Value of key is value.".
+    /// </para>
+    /// <para>
+    /// If no value could be found for the specified key, then substitution 
+    /// defaults to an empty string.
+    /// </para>
+    /// <para>
+    /// For example, if system properties contains no value for the key
+    /// "nonExistentKey", then the call
+    /// </para>
+    /// <para>
+    /// <code lang="C#">
+    /// string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]");
+    /// </code>
+    /// </para>
+    /// <para>
+    /// will set <s>s</s> to "Value of nonExistentKey is []".   
+    /// </para>
+    /// <para>
+    /// An Exception is thrown if <paramref name="value"/> contains a start 
+    /// delimiter "${" which is not balanced by a stop delimiter "}". 
+    /// </para>
+    /// </remarks>
+    public static string SubstituteVariables(string value, System.Collections.IDictionary props)
+    {
+      StringBuilder buf = new StringBuilder();
 
-			int i = 0;
-			int j, k;
-	
-			while(true) 
-			{
-				j = value.IndexOf(DELIM_START, i);
-				if (j == -1) 
-				{
-					if (i == 0)
-					{
-						return value;
-					}
-					else 
-					{
-						buf.Append(value.Substring(i, value.Length - i));
-						return buf.ToString();
-					}
-				}
-				else 
-				{
-					buf.Append(value.Substring(i, j - i));
-					k = value.IndexOf(DELIM_STOP, j);
-					if (k == -1) 
-					{
-						throw new LogException("[" + value + "] has no closing brace. Opening brace at position [" + j + "]");
-					}
-					else 
-					{
-						j += DELIM_START_LEN;
-						string key = value.Substring(j, k - j);
+      int i = 0;
+      int j, k;
 
-						string replacement = props[key] as string;
+      while (true)
+      {
+        j = value.IndexOf(DELIM_START, i);
+        if (j == -1)
+        {
+          if (i == 0)
+          {
+            return value;
+          }
+          else
+          {
+            buf.Append(value.Substring(i, value.Length - i));
+            return buf.ToString();
+          }
+        }
+        else
+        {
+          buf.Append(value.Substring(i, j - i));
+          k = value.IndexOf(DELIM_STOP, j);
+          if (k == -1)
+          {
+            throw new LogException("[" + value + "] has no closing brace. Opening brace at position [" + j + "]");
+          }
+          else
+          {
+            j += DELIM_START_LEN;
+            string key = value.Substring(j, k - j);
 
-						if (replacement != null) 
-						{
-							buf.Append(replacement);
-						}
-						i = k + DELIM_STOP_LEN;		
-					}
-				}
-			}
-		}
+            string replacement = props[key] as string;
 
-		#endregion Public Static Methods
+            if (replacement != null)
+            {
+              buf.Append(replacement);
+            }
+            i = k + DELIM_STOP_LEN;
+          }
+        }
+      }
+    }
 
-		#region Private Static Methods
+    #endregion Public Static Methods
 
-		/// <summary>
-		/// Converts the string representation of the name or numeric value of one or 
-		/// more enumerated constants to an equivalent enumerated object.
-		/// </summary>
-		/// <param name="enumType">The type to convert to.</param>
-		/// <param name="value">The enum string value.</param>
-		/// <param name="ignoreCase">If <c>true</c>, ignore case; otherwise, regard case.</param>
-		/// <returns>An object of type <paramref name="enumType" /> whose value is represented by <paramref name="value" />.</returns>
-		private static object ParseEnum(System.Type enumType, string value, bool ignoreCase) 
-		{
+    #region Private Static Methods
+
+    /// <summary>
+    /// Converts the string representation of the name or numeric value of one or 
+    /// more enumerated constants to an equivalent enumerated object.
+    /// </summary>
+    /// <param name="enumType">The type to convert to.</param>
+    /// <param name="value">The enum string value.</param>
+    /// <param name="ignoreCase">If <c>true</c>, ignore case; otherwise, regard case.</param>
+    /// <returns>An object of type <paramref name="enumType" /> whose value is represented by <paramref name="value" />.</returns>
+    private static object ParseEnum(System.Type enumType, string value, bool ignoreCase)
+    {
 #if !NETCF
-			return Enum.Parse(enumType, value, ignoreCase);
+      return Enum.Parse(enumType, value, ignoreCase);
 #else
-			FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
+      FieldInfo[] fields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
 
-			string[] names = value.Split(new char[] {','});
-			for (int i = 0; i < names.Length; ++i) 
-			{
-				names[i] = names [i].Trim();
-			}
+      string[] names = value.Split(new char[] {','});
+      for (int i = 0; i < names.Length; ++i) 
+      {
+        names[i] = names [i].Trim();
+      }
 
-			long retVal = 0;
+      long retVal = 0;
 
-			try 
-			{
-				// Attempt to convert to numeric type
-				return Enum.ToObject(enumType, Convert.ChangeType(value, typeof(long), CultureInfo.InvariantCulture));
-			} 
-			catch {}
+      try 
+      {
+        // Attempt to convert to numeric type
+        return Enum.ToObject(enumType, Convert.ChangeType(value, typeof(long), CultureInfo.InvariantCulture));
+      } 
+      catch {}
 
-			foreach (string name in names) 
-			{
-				bool found = false;
-				foreach(FieldInfo field in fields) 
-				{
-					if (String.Compare(name, field.Name, ignoreCase) == 0) 
-					{
-						retVal |= ((IConvertible) field.GetValue(null)).ToInt64(CultureInfo.InvariantCulture);
-						found = true;
-						break;
-					}
-				}
-				if (!found) 
-				{
-					throw new ArgumentException("Failed to lookup member [" + name + "] from Enum type [" + enumType.Name + "]");
-				}
-			}
-			return Enum.ToObject(enumType, retVal);
+      foreach (string name in names) 
+      {
+        bool found = false;
+        foreach(FieldInfo field in fields) 
+        {
+          if (String.Compare(name, field.Name, ignoreCase) == 0) 
+          {
+            retVal |= ((IConvertible) field.GetValue(null)).ToInt64(CultureInfo.InvariantCulture);
+            found = true;
+            break;
+          }
+        }
+        if (!found) 
+        {
+          throw new ArgumentException("Failed to lookup member [" + name + "] from Enum type [" + enumType.Name + "]");
+        }
+      }
+      return Enum.ToObject(enumType, retVal);
 #endif
-		}		
+    }
 
-		#endregion Private Static Methods
+    #endregion Private Static Methods
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-        /// <summary>
-        /// The fully qualified type of the OptionConverter class.
-        /// </summary>
-        /// <remarks>
-        /// Used by the internal logger to record the Type of the
-        /// log message.
-        /// </remarks>
-        private static readonly Type declaringType = typeof(OptionConverter);
+    /// <summary>
+    /// The fully qualified type of the OptionConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(OptionConverter);
 
-		private const string DELIM_START = "${";
-		private const char   DELIM_STOP  = '}';
-		private const int DELIM_START_LEN = 2;
-		private const int DELIM_STOP_LEN  = 1;
+    private const string DELIM_START = "${";
+    private const char DELIM_STOP = '}';
+    private const int DELIM_START_LEN = 2;
+    private const int DELIM_STOP_LEN = 1;
 
-		#endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternConverter.cs b/src/log4net/Util/PatternConverter.cs
index 9f9067b..8403ddd 100644
--- a/src/log4net/Util/PatternConverter.cs
+++ b/src/log4net/Util/PatternConverter.cs
@@ -26,372 +26,372 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Abstract class that provides the formatting functionality that 
-	/// derived classes need.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Conversion specifiers in a conversion patterns are parsed to
-	/// individual PatternConverters. Each of which is responsible for
-	/// converting a logging event in a converter specific manner.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public abstract class PatternConverter
-	{
-		#region Protected Instance Constructors
+  /// <summary>
+  /// Abstract class that provides the formatting functionality that 
+  /// derived classes need.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Conversion specifiers in a conversion patterns are parsed to
+  /// individual PatternConverters. Each of which is responsible for
+  /// converting a logging event in a converter specific manner.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public abstract class PatternConverter
+  {
+    #region Protected Instance Constructors
 
-		/// <summary>
-		/// Protected constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="PatternConverter" /> class.
-		/// </para>
-		/// </remarks>
-		protected PatternConverter() 
-		{  
-		}
+    /// <summary>
+    /// Protected constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="PatternConverter" /> class.
+    /// </para>
+    /// </remarks>
+    protected PatternConverter()
+    {
+    }
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Get the next pattern converter in the chain
-		/// </summary>
-		/// <value>
-		/// the next pattern converter in the chain
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Get the next pattern converter in the chain
-		/// </para>
-		/// </remarks>
-		public virtual PatternConverter Next
-		{
-			get { return m_next; }
-		}
+    /// <summary>
+    /// Get the next pattern converter in the chain
+    /// </summary>
+    /// <value>
+    /// the next pattern converter in the chain
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Get the next pattern converter in the chain
+    /// </para>
+    /// </remarks>
+    public virtual PatternConverter Next
+    {
+      get { return m_next; }
+    }
 
-		/// <summary>
-		/// Gets or sets the formatting info for this converter
-		/// </summary>
-		/// <value>
-		/// The formatting info for this converter
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the formatting info for this converter
-		/// </para>
-		/// </remarks>
-		public virtual FormattingInfo FormattingInfo
-		{
-			get { return new FormattingInfo(m_min, m_max, m_leftAlign); }
-			set
-			{
-				m_min = value.Min;
-				m_max = value.Max;
-				m_leftAlign = value.LeftAlign;
-			}
-		}
+    /// <summary>
+    /// Gets or sets the formatting info for this converter
+    /// </summary>
+    /// <value>
+    /// The formatting info for this converter
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the formatting info for this converter
+    /// </para>
+    /// </remarks>
+    public virtual FormattingInfo FormattingInfo
+    {
+      get { return new FormattingInfo(m_min, m_max, m_leftAlign); }
+      set
+      {
+        m_min = value.Min;
+        m_max = value.Max;
+        m_leftAlign = value.LeftAlign;
+      }
+    }
 
-		/// <summary>
-		/// Gets or sets the option value for this converter
-		/// </summary>
-		/// <summary>
-		/// The option for this converter
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the option value for this converter
-		/// </para>
-		/// </remarks>
-		public virtual string Option
-		{
-			get { return m_option; }
-			set { m_option = value; }
-		}
+    /// <summary>
+    /// Gets or sets the option value for this converter
+    /// </summary>
+    /// <summary>
+    /// The option for this converter
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the option value for this converter
+    /// </para>
+    /// </remarks>
+    public virtual string Option
+    {
+      get { return m_option; }
+      set { m_option = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Protected Abstract Methods
+    #region Protected Abstract Methods
 
-		/// <summary>
-		/// Evaluate this pattern converter and write the output to a writer.
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">The state object on which the pattern converter should be executed.</param>
-		/// <remarks>
-		/// <para>
-		/// Derived pattern converters must override this method in order to
-		/// convert conversion specifiers in the appropriate way.
-		/// </para>
-		/// </remarks>
-		protected abstract void Convert(TextWriter writer, object state);
+    /// <summary>
+    /// Evaluate this pattern converter and write the output to a writer.
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">The state object on which the pattern converter should be executed.</param>
+    /// <remarks>
+    /// <para>
+    /// Derived pattern converters must override this method in order to
+    /// convert conversion specifiers in the appropriate way.
+    /// </para>
+    /// </remarks>
+    protected abstract void Convert(TextWriter writer, object state);
 
-		#endregion Protected Abstract Methods
+    #endregion Protected Abstract Methods
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Set the next pattern converter in the chains
-		/// </summary>
-		/// <param name="patternConverter">the pattern converter that should follow this converter in the chain</param>
-		/// <returns>the next converter</returns>
-		/// <remarks>
-		/// <para>
-		/// The PatternConverter can merge with its neighbor during this method (or a sub class).
-		/// Therefore the return value may or may not be the value of the argument passed in.
-		/// </para>
-		/// </remarks>
-		public virtual PatternConverter SetNext(PatternConverter patternConverter)
-		{
-			m_next = patternConverter;
-			return m_next;
-		}
+    /// <summary>
+    /// Set the next pattern converter in the chains
+    /// </summary>
+    /// <param name="patternConverter">the pattern converter that should follow this converter in the chain</param>
+    /// <returns>the next converter</returns>
+    /// <remarks>
+    /// <para>
+    /// The PatternConverter can merge with its neighbor during this method (or a sub class).
+    /// Therefore the return value may or may not be the value of the argument passed in.
+    /// </para>
+    /// </remarks>
+    public virtual PatternConverter SetNext(PatternConverter patternConverter)
+    {
+      m_next = patternConverter;
+      return m_next;
+    }
 
-		/// <summary>
-		/// Write the pattern converter to the writer with appropriate formatting
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">The state object on which the pattern converter should be executed.</param>
-		/// <remarks>
-		/// <para>
-		/// This method calls <see cref="Convert"/> to allow the subclass to perform
-		/// appropriate conversion of the pattern converter. If formatting options have
-		/// been specified via the <see cref="FormattingInfo"/> then this method will
-		/// apply those formattings before writing the output.
-		/// </para>
-		/// </remarks>
-		public virtual void Format(TextWriter writer, object state) 
-		{
-			if (m_min < 0 && m_max == int.MaxValue)
-			{
-				// Formatting options are not in use
-				Convert(writer, state);
-			}
-			else
-			{
-                string msg = null;
-                int len;
-                lock (m_formatWriter)
-                {
-                    m_formatWriter.Reset(c_renderBufferMaxCapacity, c_renderBufferSize);
+    /// <summary>
+    /// Write the pattern converter to the writer with appropriate formatting
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">The state object on which the pattern converter should be executed.</param>
+    /// <remarks>
+    /// <para>
+    /// This method calls <see cref="Convert"/> to allow the subclass to perform
+    /// appropriate conversion of the pattern converter. If formatting options have
+    /// been specified via the <see cref="FormattingInfo"/> then this method will
+    /// apply those formattings before writing the output.
+    /// </para>
+    /// </remarks>
+    public virtual void Format(TextWriter writer, object state)
+    {
+      if (m_min < 0 && m_max == int.MaxValue)
+      {
+        // Formatting options are not in use
+        Convert(writer, state);
+      }
+      else
+      {
+        string msg = null;
+        int len;
+        lock (m_formatWriter)
+        {
+          m_formatWriter.Reset(c_renderBufferMaxCapacity, c_renderBufferSize);
 
-                    Convert(m_formatWriter, state);
+          Convert(m_formatWriter, state);
 
-                    StringBuilder buf = m_formatWriter.GetStringBuilder();
-                    len = buf.Length;
-                    if (len > m_max)
-                    {
-                        msg = buf.ToString(len - m_max, m_max);
-                        len = m_max;
-                    }
-                    else
-                    {
-                        msg = buf.ToString();
-                    }
-                }
+          StringBuilder buf = m_formatWriter.GetStringBuilder();
+          len = buf.Length;
+          if (len > m_max)
+          {
+            msg = buf.ToString(len - m_max, m_max);
+            len = m_max;
+          }
+          else
+          {
+            msg = buf.ToString();
+          }
+        }
 
-				if (len < m_min) 
-				{
-					if (m_leftAlign) 
-					{	
-						writer.Write(msg);
-						SpacePad(writer, m_min - len);
-					}
-					else 
-					{
-						SpacePad(writer, m_min - len);
-						writer.Write(msg);
-					}
-				}
-				else
-				{
-					writer.Write(msg);
-				}
-			}
-		}	
+        if (len < m_min)
+        {
+          if (m_leftAlign)
+          {
+            writer.Write(msg);
+            SpacePad(writer, m_min - len);
+          }
+          else
+          {
+            SpacePad(writer, m_min - len);
+            writer.Write(msg);
+          }
+        }
+        else
+        {
+          writer.Write(msg);
+        }
+      }
+    }
 
-		private static readonly string[] SPACES = {	" ", "  ", "    ", "        ",			// 1,2,4,8 spaces
-													"                ",						// 16 spaces
-													"                                " };	// 32 spaces
+    private static readonly string[] SPACES = {  " ", "  ", "    ", "        ",      // 1,2,4,8 spaces
+                          "                ",            // 16 spaces
+                          "                                " };  // 32 spaces
 
-		/// <summary>
-		/// Fast space padding method.
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> to which the spaces will be appended.</param>
-		/// <param name="length">The number of spaces to be padded.</param>
-		/// <remarks>
-		/// <para>
-		/// Fast space padding method.
-		/// </para>
-		/// </remarks>
-		protected static void SpacePad(TextWriter writer, int length) 
-		{
-			while(length >= 32) 
-			{
-				writer.Write(SPACES[5]);
-				length -= 32;
-			}
-    
-			for(int i = 4; i >= 0; i--) 
-			{	
-				if ((length & (1<<i)) != 0) 
-				{
-					writer.Write(SPACES[i]);
-				}
-			}
-		}	
+    /// <summary>
+    /// Fast space padding method.
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> to which the spaces will be appended.</param>
+    /// <param name="length">The number of spaces to be padded.</param>
+    /// <remarks>
+    /// <para>
+    /// Fast space padding method.
+    /// </para>
+    /// </remarks>
+    protected static void SpacePad(TextWriter writer, int length)
+    {
+      while (length >= 32)
+      {
+        writer.Write(SPACES[5]);
+        length -= 32;
+      }
 
-		#endregion Public Instance Methods
+      for (int i = 4; i >= 0; i--)
+      {
+        if ((length & (1 << i)) != 0)
+        {
+          writer.Write(SPACES[i]);
+        }
+      }
+    }
 
-		#region Private Instance Fields
+    #endregion Public Instance Methods
 
-		private PatternConverter m_next;
-		private int m_min = -1;
-		private int m_max = int.MaxValue;
-		private bool m_leftAlign = false;
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The option string to the converter
-		/// </summary>
-		private string m_option = null;
+    private PatternConverter m_next;
+    private int m_min = -1;
+    private int m_max = int.MaxValue;
+    private bool m_leftAlign = false;
 
-		private ReusableStringWriter m_formatWriter = new ReusableStringWriter(System.Globalization.CultureInfo.InvariantCulture);
+    /// <summary>
+    /// The option string to the converter
+    /// </summary>
+    private string m_option = null;
 
-		#endregion Private Instance Fields
+    private ReusableStringWriter m_formatWriter = new ReusableStringWriter(System.Globalization.CultureInfo.InvariantCulture);
 
-		#region Constants
+    #endregion Private Instance Fields
 
-		/// <summary>
-		/// Initial buffer size
-		/// </summary>
-		private const int c_renderBufferSize = 256;
+    #region Constants
 
-		/// <summary>
-		/// Maximum buffer size before it is recycled
-		/// </summary>
-		private const int c_renderBufferMaxCapacity = 1024;
+    /// <summary>
+    /// Initial buffer size
+    /// </summary>
+    private const int c_renderBufferSize = 256;
 
-		#endregion
+    /// <summary>
+    /// Maximum buffer size before it is recycled
+    /// </summary>
+    private const int c_renderBufferMaxCapacity = 1024;
 
-		#region Static Methods
+    #endregion
 
-		/// <summary>
-		/// Write an dictionary to a <see cref="TextWriter"/>
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="repository">a <see cref="ILoggerRepository"/> to use for object conversion</param>
-		/// <param name="value">the value to write to the writer</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="IDictionary"/> to a writer in the form:
-		/// </para>
-		/// <code>
-		/// {key1=value1, key2=value2, key3=value3}
-		/// </code>
-		/// <para>
-		/// If the <see cref="ILoggerRepository"/> specified
-		/// is not null then it is used to render the key and value to text, otherwise
-		/// the object's ToString method is called.
-		/// </para>
-		/// </remarks>
-		protected static void WriteDictionary(TextWriter writer, ILoggerRepository repository, IDictionary value)
-		{
-			WriteDictionary(writer, repository, value.GetEnumerator());
-		}
+    #region Static Methods
 
-		/// <summary>
-		/// Write an dictionary to a <see cref="TextWriter"/>
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="repository">a <see cref="ILoggerRepository"/> to use for object conversion</param>
-		/// <param name="value">the value to write to the writer</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the <see cref="IDictionaryEnumerator"/> to a writer in the form:
-		/// </para>
-		/// <code>
-		/// {key1=value1, key2=value2, key3=value3}
-		/// </code>
-		/// <para>
-		/// If the <see cref="ILoggerRepository"/> specified
-		/// is not null then it is used to render the key and value to text, otherwise
-		/// the object's ToString method is called.
-		/// </para>
-		/// </remarks>
-		protected static void WriteDictionary(TextWriter writer, ILoggerRepository repository, IDictionaryEnumerator value)
-		{
-			writer.Write("{");
+    /// <summary>
+    /// Write an dictionary to a <see cref="TextWriter"/>
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="repository">a <see cref="ILoggerRepository"/> to use for object conversion</param>
+    /// <param name="value">the value to write to the writer</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="IDictionary"/> to a writer in the form:
+    /// </para>
+    /// <code>
+    /// {key1=value1, key2=value2, key3=value3}
+    /// </code>
+    /// <para>
+    /// If the <see cref="ILoggerRepository"/> specified
+    /// is not null then it is used to render the key and value to text, otherwise
+    /// the object's ToString method is called.
+    /// </para>
+    /// </remarks>
+    protected static void WriteDictionary(TextWriter writer, ILoggerRepository repository, IDictionary value)
+    {
+      WriteDictionary(writer, repository, value.GetEnumerator());
+    }
 
-			bool first = true;
+    /// <summary>
+    /// Write an dictionary to a <see cref="TextWriter"/>
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="repository">a <see cref="ILoggerRepository"/> to use for object conversion</param>
+    /// <param name="value">the value to write to the writer</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the <see cref="IDictionaryEnumerator"/> to a writer in the form:
+    /// </para>
+    /// <code>
+    /// {key1=value1, key2=value2, key3=value3}
+    /// </code>
+    /// <para>
+    /// If the <see cref="ILoggerRepository"/> specified
+    /// is not null then it is used to render the key and value to text, otherwise
+    /// the object's ToString method is called.
+    /// </para>
+    /// </remarks>
+    protected static void WriteDictionary(TextWriter writer, ILoggerRepository repository, IDictionaryEnumerator value)
+    {
+      writer.Write("{");
 
-			// Write out all the dictionary key value pairs
-			while (value.MoveNext())
-			{
-				if (first)
-				{
-					first = false;
-				}
-				else
-				{
-					writer.Write(", ");
-				}
-				WriteObject(writer, repository, value.Key);
-				writer.Write("=");
-				WriteObject(writer, repository, value.Value);
-			}
+      bool first = true;
 
-			writer.Write("}");
-		}
+      // Write out all the dictionary key value pairs
+      while (value.MoveNext())
+      {
+        if (first)
+        {
+          first = false;
+        }
+        else
+        {
+          writer.Write(", ");
+        }
+        WriteObject(writer, repository, value.Key);
+        writer.Write("=");
+        WriteObject(writer, repository, value.Value);
+      }
 
-		/// <summary>
-		/// Write an object to a <see cref="TextWriter"/>
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="repository">a <see cref="ILoggerRepository"/> to use for object conversion</param>
-		/// <param name="value">the value to write to the writer</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the Object to a writer. If the <see cref="ILoggerRepository"/> specified
-		/// is not null then it is used to render the object to text, otherwise
-		/// the object's ToString method is called.
-		/// </para>
-		/// </remarks>
-		protected static void WriteObject(TextWriter writer, ILoggerRepository repository, object value)
-		{
-			if (repository != null)
-			{
-				repository.RendererMap.FindAndRender(value, writer);
-			}
-			else
-			{
-				// Don't have a repository to render with so just have to rely on ToString
-				if (value == null)
-				{
-					writer.Write( SystemInfo.NullText );
-				}
-				else
-				{
-					writer.Write( value.ToString() );
-				}
-			}
-		}
+      writer.Write("}");
+    }
 
-		#endregion
+    /// <summary>
+    /// Write an object to a <see cref="TextWriter"/>
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="repository">a <see cref="ILoggerRepository"/> to use for object conversion</param>
+    /// <param name="value">the value to write to the writer</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the Object to a writer. If the <see cref="ILoggerRepository"/> specified
+    /// is not null then it is used to render the object to text, otherwise
+    /// the object's ToString method is called.
+    /// </para>
+    /// </remarks>
+    protected static void WriteObject(TextWriter writer, ILoggerRepository repository, object value)
+    {
+      if (repository != null)
+      {
+        repository.RendererMap.FindAndRender(value, writer);
+      }
+      else
+      {
+        // Don't have a repository to render with so just have to rely on ToString
+        if (value == null)
+        {
+          writer.Write(SystemInfo.NullText);
+        }
+        else
+        {
+          writer.Write(value.ToString());
+        }
+      }
+    }
 
-        private PropertiesDictionary properties;
+    #endregion
 
-        /// <summary>
-        /// 
-        /// </summary>
-        public PropertiesDictionary Properties
-	    {
-	        get { return properties; }
-	        set { properties = value; }
-	    }
-	}
+    private PropertiesDictionary properties;
+
+    /// <summary>
+    /// 
+    /// </summary>
+    public PropertiesDictionary Properties
+    {
+      get { return properties; }
+      set { properties = value; }
+    }
+  }
 }
diff --git a/src/log4net/Util/PatternParser.cs b/src/log4net/Util/PatternParser.cs
index 7dfbb32..c639d5a 100644
--- a/src/log4net/Util/PatternParser.cs
+++ b/src/log4net/Util/PatternParser.cs
@@ -26,410 +26,410 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Most of the work of the <see cref="PatternLayout"/> class
-	/// is delegated to the PatternParser class.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The <c>PatternParser</c> processes a pattern string and
-	/// returns a chain of <see cref="PatternConverter"/> objects.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class PatternParser
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// Most of the work of the <see cref="PatternLayout"/> class
+  /// is delegated to the PatternParser class.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The <c>PatternParser</c> processes a pattern string and
+  /// returns a chain of <see cref="PatternConverter"/> objects.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class PatternParser
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="pattern">The pattern to parse.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="PatternParser" /> class 
-		/// with the specified pattern string.
-		/// </para>
-		/// </remarks>
-		public PatternParser(string pattern) 
-		{
-			m_pattern = pattern;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="pattern">The pattern to parse.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="PatternParser" /> class 
+    /// with the specified pattern string.
+    /// </para>
+    /// </remarks>
+    public PatternParser(string pattern)
+    {
+      m_pattern = pattern;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Parses the pattern into a chain of pattern converters.
-		/// </summary>
-		/// <returns>The head of a chain of pattern converters.</returns>
-		/// <remarks>
-		/// <para>
-		/// Parses the pattern into a chain of pattern converters.
-		/// </para>
-		/// </remarks>
-		public PatternConverter Parse()
-		{
-			string[] converterNamesCache = BuildCache();
+    /// <summary>
+    /// Parses the pattern into a chain of pattern converters.
+    /// </summary>
+    /// <returns>The head of a chain of pattern converters.</returns>
+    /// <remarks>
+    /// <para>
+    /// Parses the pattern into a chain of pattern converters.
+    /// </para>
+    /// </remarks>
+    public PatternConverter Parse()
+    {
+      string[] converterNamesCache = BuildCache();
 
-			ParseInternal(m_pattern, converterNamesCache);
+      ParseInternal(m_pattern, converterNamesCache);
 
-			return m_head;
-		}
+      return m_head;
+    }
 
-		#endregion Public Instance Methods
+    #endregion Public Instance Methods
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Get the converter registry used by this parser
-		/// </summary>
-		/// <value>
-		/// The converter registry used by this parser
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Get the converter registry used by this parser
-		/// </para>
-		/// </remarks>
-		public Hashtable PatternConverters
-		{
-			get { return m_patternConverters; }
-		}
+    /// <summary>
+    /// Get the converter registry used by this parser
+    /// </summary>
+    /// <value>
+    /// The converter registry used by this parser
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Get the converter registry used by this parser
+    /// </para>
+    /// </remarks>
+    public Hashtable PatternConverters
+    {
+      get { return m_patternConverters; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Private Instance Methods
+    #region Private Instance Methods
 
-		/// <summary>
-		/// Build the unified cache of converters from the static and instance maps
-		/// </summary>
-		/// <returns>the list of all the converter names</returns>
-		/// <remarks>
-		/// <para>
-		/// Build the unified cache of converters from the static and instance maps
-		/// </para>
-		/// </remarks>
-		private string[] BuildCache()
-		{
-			string[] converterNamesCache = new string[m_patternConverters.Keys.Count];
-			m_patternConverters.Keys.CopyTo(converterNamesCache, 0);
+    /// <summary>
+    /// Build the unified cache of converters from the static and instance maps
+    /// </summary>
+    /// <returns>the list of all the converter names</returns>
+    /// <remarks>
+    /// <para>
+    /// Build the unified cache of converters from the static and instance maps
+    /// </para>
+    /// </remarks>
+    private string[] BuildCache()
+    {
+      string[] converterNamesCache = new string[m_patternConverters.Keys.Count];
+      m_patternConverters.Keys.CopyTo(converterNamesCache, 0);
 
-			// sort array so that longer strings come first
-			Array.Sort(converterNamesCache, 0, converterNamesCache.Length, StringLengthComparer.Instance);
+      // sort array so that longer strings come first
+      Array.Sort(converterNamesCache, 0, converterNamesCache.Length, StringLengthComparer.Instance);
 
-			return converterNamesCache;
-		}
+      return converterNamesCache;
+    }
 
-		#region StringLengthComparer
+    #region StringLengthComparer
 
-		/// <summary>
-		/// Sort strings by length
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <see cref="IComparer" /> that orders strings by string length.
-		/// The longest strings are placed first
-		/// </para>
-		/// </remarks>
-		private sealed class StringLengthComparer : IComparer
-		{
-			public static readonly StringLengthComparer Instance = new StringLengthComparer();
+    /// <summary>
+    /// Sort strings by length
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <see cref="IComparer" /> that orders strings by string length.
+    /// The longest strings are placed first
+    /// </para>
+    /// </remarks>
+    private sealed class StringLengthComparer : IComparer
+    {
+      public static readonly StringLengthComparer Instance = new StringLengthComparer();
 
-			private StringLengthComparer()
-			{
-			}
+      private StringLengthComparer()
+      {
+      }
 
-			#region Implementation of IComparer
+      #region Implementation of IComparer
 
-			public int Compare(object x, object y)
-			{
-				string s1 = x as string;
-				string s2 = y as string;
+      public int Compare(object x, object y)
+      {
+        string s1 = x as string;
+        string s2 = y as string;
 
-				if (s1 == null && s2 == null)
-				{
-					return 0;
-				}
-				if (s1 == null)
-				{
-					return 1;
-				}
-				if (s2 == null)
-				{
-					return -1;
-				}
+        if (s1 == null && s2 == null)
+        {
+          return 0;
+        }
+        if (s1 == null)
+        {
+          return 1;
+        }
+        if (s2 == null)
+        {
+          return -1;
+        }
 
-				return s2.Length.CompareTo(s1.Length);
-			}
-		
-			#endregion
-		}
+        return s2.Length.CompareTo(s1.Length);
+      }
 
-		#endregion // StringLengthComparer
+      #endregion
+    }
 
-		/// <summary>
-		/// Internal method to parse the specified pattern to find specified matches
-		/// </summary>
-		/// <param name="pattern">the pattern to parse</param>
-		/// <param name="matches">the converter names to match in the pattern</param>
-		/// <remarks>
-		/// <para>
-		/// The matches param must be sorted such that longer strings come before shorter ones.
-		/// </para>
-		/// </remarks>
-		private void ParseInternal(string pattern, string[] matches)
-		{
-			int offset = 0;
-			while(offset < pattern.Length)
-			{
-				int i = pattern.IndexOf('%', offset);
-				if (i < 0 || i == pattern.Length - 1)
-				{
-					ProcessLiteral(pattern.Substring(offset));
-					offset = pattern.Length;
-				}
-				else
-				{
-					if (pattern[i+1] == '%')
-					{
-						// Escaped
-						ProcessLiteral(pattern.Substring(offset, i - offset + 1));
-						offset = i + 2;
-					}
-					else
-					{
-						ProcessLiteral(pattern.Substring(offset, i - offset));
-						offset = i + 1;
+    #endregion // StringLengthComparer
 
-						FormattingInfo formattingInfo = new FormattingInfo();
+    /// <summary>
+    /// Internal method to parse the specified pattern to find specified matches
+    /// </summary>
+    /// <param name="pattern">the pattern to parse</param>
+    /// <param name="matches">the converter names to match in the pattern</param>
+    /// <remarks>
+    /// <para>
+    /// The matches param must be sorted such that longer strings come before shorter ones.
+    /// </para>
+    /// </remarks>
+    private void ParseInternal(string pattern, string[] matches)
+    {
+      int offset = 0;
+      while (offset < pattern.Length)
+      {
+        int i = pattern.IndexOf('%', offset);
+        if (i < 0 || i == pattern.Length - 1)
+        {
+          ProcessLiteral(pattern.Substring(offset));
+          offset = pattern.Length;
+        }
+        else
+        {
+          if (pattern[i + 1] == '%')
+          {
+            // Escaped
+            ProcessLiteral(pattern.Substring(offset, i - offset + 1));
+            offset = i + 2;
+          }
+          else
+          {
+            ProcessLiteral(pattern.Substring(offset, i - offset));
+            offset = i + 1;
 
-						// Process formatting options
+            FormattingInfo formattingInfo = new FormattingInfo();
 
-						// Look for the align flag
-						if (offset < pattern.Length)
-						{
-							if (pattern[offset] == '-')
-							{
-								// Seen align flag
-								formattingInfo.LeftAlign = true;
-								offset++;
-							}
-						}
-						// Look for the minimum length
-						while (offset < pattern.Length && char.IsDigit(pattern[offset]))
-						{
-							// Seen digit
-							if (formattingInfo.Min < 0)
-							{
-								formattingInfo.Min = 0;
-							}
+            // Process formatting options
 
-							formattingInfo.Min = (formattingInfo.Min * 10) + int.Parse(pattern[offset].ToString(), NumberFormatInfo.InvariantInfo);
+            // Look for the align flag
+            if (offset < pattern.Length)
+            {
+              if (pattern[offset] == '-')
+              {
+                // Seen align flag
+                formattingInfo.LeftAlign = true;
+                offset++;
+              }
+            }
+            // Look for the minimum length
+            while (offset < pattern.Length && char.IsDigit(pattern[offset]))
+            {
+              // Seen digit
+              if (formattingInfo.Min < 0)
+              {
+                formattingInfo.Min = 0;
+              }
 
-							offset++;
-						}
-						// Look for the separator between min and max
-						if (offset < pattern.Length)
-						{
-							if (pattern[offset] == '.')
-							{
-								// Seen separator
-								offset++;
-							}
-						}
-						// Look for the maximum length
-						while (offset < pattern.Length && char.IsDigit(pattern[offset]))
-						{
-							// Seen digit
-							if (formattingInfo.Max == int.MaxValue)
-							{
-								formattingInfo.Max = 0;
-							}
+              formattingInfo.Min = (formattingInfo.Min * 10) + int.Parse(pattern[offset].ToString(), NumberFormatInfo.InvariantInfo);
 
-							formattingInfo.Max = (formattingInfo.Max * 10) + int.Parse(pattern[offset].ToString(), NumberFormatInfo.InvariantInfo);
+              offset++;
+            }
+            // Look for the separator between min and max
+            if (offset < pattern.Length)
+            {
+              if (pattern[offset] == '.')
+              {
+                // Seen separator
+                offset++;
+              }
+            }
+            // Look for the maximum length
+            while (offset < pattern.Length && char.IsDigit(pattern[offset]))
+            {
+              // Seen digit
+              if (formattingInfo.Max == int.MaxValue)
+              {
+                formattingInfo.Max = 0;
+              }
 
-							offset++;
-						}
+              formattingInfo.Max = (formattingInfo.Max * 10) + int.Parse(pattern[offset].ToString(), NumberFormatInfo.InvariantInfo);
 
-						int remainingStringLength = pattern.Length - offset;
+              offset++;
+            }
 
-						// Look for pattern
-						for(int m=0; m<matches.Length; m++)
-						{
-							string key = matches[m];
+            int remainingStringLength = pattern.Length - offset;
 
-							if (key.Length <= remainingStringLength)
-							{
-								if (string.Compare(pattern, offset, key, 0, key.Length) == 0)
-								{
-									// Found match
-									offset = offset + matches[m].Length;
+            // Look for pattern
+            for (int m = 0; m < matches.Length; m++)
+            {
+              string key = matches[m];
 
-									string option = null;
+              if (key.Length <= remainingStringLength)
+              {
+                if (string.Compare(pattern, offset, key, 0, key.Length) == 0)
+                {
+                  // Found match
+                  offset = offset + matches[m].Length;
 
-									// Look for option
-									if (offset < pattern.Length)
-									{
-										if (pattern[offset] == '{')
-										{
-											// Seen option start
-											offset++;
-											
-											int optEnd = pattern.IndexOf('}', offset);
-											if (optEnd < 0)
-											{
-												// error
-											}
-											else
-											{
-												option = pattern.Substring(offset, optEnd - offset);
-												offset = optEnd + 1;
-											}
-										}
-									}
+                  string option = null;
 
-									ProcessConverter(matches[m], option, formattingInfo);
-									break;
-								}
-							}
-						}
-					}
-				}
-			}
-		}
+                  // Look for option
+                  if (offset < pattern.Length)
+                  {
+                    if (pattern[offset] == '{')
+                    {
+                      // Seen option start
+                      offset++;
 
-		/// <summary>
-		/// Process a parsed literal
-		/// </summary>
-		/// <param name="text">the literal text</param>
-		private void ProcessLiteral(string text)
-		{
-			if (text.Length > 0)
-			{
-				// Convert into a pattern
-				ProcessConverter("literal", text, new FormattingInfo());
-			}
-		}
+                      int optEnd = pattern.IndexOf('}', offset);
+                      if (optEnd < 0)
+                      {
+                        // error
+                      }
+                      else
+                      {
+                        option = pattern.Substring(offset, optEnd - offset);
+                        offset = optEnd + 1;
+                      }
+                    }
+                  }
 
-		/// <summary>
-		/// Process a parsed converter pattern
-		/// </summary>
-		/// <param name="converterName">the name of the converter</param>
-		/// <param name="option">the optional option for the converter</param>
-		/// <param name="formattingInfo">the formatting info for the converter</param>
-		private void ProcessConverter(string converterName, string option, FormattingInfo formattingInfo)
-		{
-			LogLog.Debug(declaringType, "Converter ["+converterName+"] Option ["+option+"] Format [min="+formattingInfo.Min+",max="+formattingInfo.Max+",leftAlign="+formattingInfo.LeftAlign+"]");
+                  ProcessConverter(matches[m], option, formattingInfo);
+                  break;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
 
-			// Lookup the converter type
-            ConverterInfo converterInfo = (ConverterInfo)m_patternConverters[converterName];
-			if (converterInfo == null)
-			{
-				LogLog.Error(declaringType, "Unknown converter name ["+converterName+"] in conversion pattern.");
-			}
-			else
-			{
-				// Create the pattern converter
-				PatternConverter pc = null;
-				try
-				{
-                    pc = (PatternConverter)Activator.CreateInstance(converterInfo.Type);
-				}
-				catch(Exception createInstanceEx)
-				{
-                    LogLog.Error(declaringType, "Failed to create instance of Type [" + converterInfo.Type.FullName + "] using default constructor. Exception: " + createInstanceEx.ToString());
-				}
+    /// <summary>
+    /// Process a parsed literal
+    /// </summary>
+    /// <param name="text">the literal text</param>
+    private void ProcessLiteral(string text)
+    {
+      if (text.Length > 0)
+      {
+        // Convert into a pattern
+        ProcessConverter("literal", text, new FormattingInfo());
+      }
+    }
 
-				// formattingInfo variable is an instance variable, occasionally reset 
-				// and used over and over again
-				pc.FormattingInfo = formattingInfo;
-				pc.Option = option;
-                pc.Properties = converterInfo.Properties;
+    /// <summary>
+    /// Process a parsed converter pattern
+    /// </summary>
+    /// <param name="converterName">the name of the converter</param>
+    /// <param name="option">the optional option for the converter</param>
+    /// <param name="formattingInfo">the formatting info for the converter</param>
+    private void ProcessConverter(string converterName, string option, FormattingInfo formattingInfo)
+    {
+      LogLog.Debug(declaringType, "Converter [" + converterName + "] Option [" + option + "] Format [min=" + formattingInfo.Min + ",max=" + formattingInfo.Max + ",leftAlign=" + formattingInfo.LeftAlign + "]");
 
-			    IOptionHandler optionHandler = pc as IOptionHandler;
-				if (optionHandler != null)
-				{
-					optionHandler.ActivateOptions();
-				}
+      // Lookup the converter type
+      ConverterInfo converterInfo = (ConverterInfo)m_patternConverters[converterName];
+      if (converterInfo == null)
+      {
+        LogLog.Error(declaringType, "Unknown converter name [" + converterName + "] in conversion pattern.");
+      }
+      else
+      {
+        // Create the pattern converter
+        PatternConverter pc = null;
+        try
+        {
+          pc = (PatternConverter)Activator.CreateInstance(converterInfo.Type);
+        }
+        catch (Exception createInstanceEx)
+        {
+          LogLog.Error(declaringType, "Failed to create instance of Type [" + converterInfo.Type.FullName + "] using default constructor. Exception: " + createInstanceEx.ToString());
+        }
 
-				AddConverter(pc);
-			}
-		}
+        // formattingInfo variable is an instance variable, occasionally reset 
+        // and used over and over again
+        pc.FormattingInfo = formattingInfo;
+        pc.Option = option;
+        pc.Properties = converterInfo.Properties;
 
-		/// <summary>
-		/// Resets the internal state of the parser and adds the specified pattern converter 
-		/// to the chain.
-		/// </summary>
-		/// <param name="pc">The pattern converter to add.</param>
-		private void AddConverter(PatternConverter pc) 
-		{
-			// Add the pattern converter to the list.
+        IOptionHandler optionHandler = pc as IOptionHandler;
+        if (optionHandler != null)
+        {
+          optionHandler.ActivateOptions();
+        }
 
-			if (m_head == null) 
-			{
-				m_head = m_tail = pc;
-			}
-			else 
-			{
-				// Set the next converter on the tail
-				// Update the tail reference
-				// note that a converter may combine the 'next' into itself
-				// and therefore the tail would not change!
-				m_tail = m_tail.SetNext(pc);
-			}
-		}
+        AddConverter(pc);
+      }
+    }
 
-		#endregion Protected Instance Methods
+    /// <summary>
+    /// Resets the internal state of the parser and adds the specified pattern converter 
+    /// to the chain.
+    /// </summary>
+    /// <param name="pc">The pattern converter to add.</param>
+    private void AddConverter(PatternConverter pc)
+    {
+      // Add the pattern converter to the list.
 
-		#region Private Constants
+      if (m_head == null)
+      {
+        m_head = m_tail = pc;
+      }
+      else
+      {
+        // Set the next converter on the tail
+        // Update the tail reference
+        // note that a converter may combine the 'next' into itself
+        // and therefore the tail would not change!
+        m_tail = m_tail.SetNext(pc);
+      }
+    }
 
-		private const char ESCAPE_CHAR = '%';
-  
-		#endregion Private Constants
+    #endregion Protected Instance Methods
 
-		#region Private Instance Fields
+    #region Private Constants
 
-		/// <summary>
-		/// The first pattern converter in the chain
-		/// </summary>
-		private PatternConverter m_head;
+    private const char ESCAPE_CHAR = '%';
 
-		/// <summary>
-		///  the last pattern converter in the chain
-		/// </summary>
-		private PatternConverter m_tail;
+    #endregion Private Constants
 
-		/// <summary>
-		/// The pattern
-		/// </summary>
-		private string m_pattern;
+    #region Private Instance Fields
 
-		/// <summary>
-		/// Internal map of converter identifiers to converter types
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This map overrides the static s_globalRulesRegistry map.
-		/// </para>
-		/// </remarks>
-		private Hashtable m_patternConverters = new Hashtable();
+    /// <summary>
+    /// The first pattern converter in the chain
+    /// </summary>
+    private PatternConverter m_head;
 
-		#endregion Private Instance Fields
+    /// <summary>
+    ///  the last pattern converter in the chain
+    /// </summary>
+    private PatternConverter m_tail;
 
-	    #region Private Static Fields
+    /// <summary>
+    /// The pattern
+    /// </summary>
+    private string m_pattern;
 
-	    /// <summary>
-	    /// The fully qualified type of the PatternParser class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(PatternParser);
+    /// <summary>
+    /// Internal map of converter identifiers to converter types
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This map overrides the static s_globalRulesRegistry map.
+    /// </para>
+    /// </remarks>
+    private Hashtable m_patternConverters = new Hashtable();
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Instance Fields
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the PatternParser class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(PatternParser);
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternString.cs b/src/log4net/Util/PatternString.cs
index c7d924b..d844b63 100644
--- a/src/log4net/Util/PatternString.cs
+++ b/src/log4net/Util/PatternString.cs
@@ -26,493 +26,493 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// This class implements a patterned string.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This string has embedded patterns that are resolved and expanded
-	/// when the string is formatted.
-	/// </para>
-	/// <para>
-	/// This class functions similarly to the <see cref="log4net.Layout.PatternLayout"/>
-	/// in that it accepts a pattern and renders it to a string. Unlike the 
-	/// <see cref="log4net.Layout.PatternLayout"/> however the <c>PatternString</c>
-	/// does not render the properties of a specific <see cref="LoggingEvent"/> but
-	/// of the process in general.
-	/// </para>
-	/// <para>
-	/// The recognized conversion pattern names are:
-	/// </para>
-	/// <list type="table">
-	///     <listheader>
-	///         <term>Conversion Pattern Name</term>
-	///         <description>Effect</description>
-	///     </listheader>
-	///     <item>
-	///         <term>appdomain</term>
-	///         <description>
-	///             <para>
-	///             Used to output the friendly name of the current AppDomain.
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>appsetting</term>
-	///         <description>
-	///             <para>
-	///             Used to output the value of a specific appSetting key in the application
-	///             configuration file.
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>date</term>
-	///         <description>
-	/// 			<para>
-	/// 			Used to output the current date and time in the local time zone. 
-	/// 			To output the date in universal time use the <c>%utcdate</c> pattern.
-	/// 			The date conversion 
-	/// 			specifier may be followed by a <i>date format specifier</i> enclosed 
-	/// 			between braces. For example, <b>%date{HH:mm:ss,fff}</b> or
-	/// 			<b>%date{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
-	/// 			given then ISO8601 format is
-	/// 			assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
-	/// 			</para>
-	/// 			<para>
-	/// 			The date format specifier admits the same syntax as the
-	/// 			time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	/// 			<para>
-	/// 			For better results it is recommended to use the log4net date
-	/// 			formatters. These can be specified using one of the strings
-	/// 			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
-	/// 			<see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
-	/// 			<see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
-	/// 			<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
-	/// 			<b>%date{ISO8601}</b> or <b>%date{ABSOLUTE}</b>.
-	/// 			</para>
-	/// 			<para>
-	/// 			These dedicated date formatters perform significantly
-	/// 			better than <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>env</term>
-	///         <description>
-	///             <para>
-	/// 			Used to output the a specific environment variable. The key to 
-	/// 			lookup must be specified within braces and directly following the
-	/// 			pattern specifier, e.g. <b>%env{COMPUTERNAME}</b> would include the value
-	/// 			of the <c>COMPUTERNAME</c> environment variable.
-	///             </para>
-	///             <para>
-	///             The <c>env</c> pattern is not supported on the .NET Compact Framework.
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>identity</term>
-	///         <description>
-	///				<para>
-	///				Used to output the user name for the currently active user
-	///				(Principal.Identity.Name).
-	///				</para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>newline</term>
-	///         <description>
-	/// 			<para>
-	/// 			Outputs the platform dependent line separator character or
-	/// 			characters.
-	/// 			</para>
-	/// 			<para>
-	/// 			This conversion pattern name offers the same performance as using 
-	/// 			non-portable line separator strings such as	"\n", or "\r\n". 
-	/// 			Thus, it is the preferred way of specifying a line separator.
-	/// 			</para> 
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>processid</term>
-	///         <description>
-	///             <para>
-	///				Used to output the system process ID for the current process.
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>property</term>
-	///         <description>
-	/// 			<para>
-	/// 			Used to output a specific context property. The key to 
-	/// 			lookup must be specified within braces and directly following the
-	/// 			pattern specifier, e.g. <b>%property{user}</b> would include the value
-	/// 			from the property that is keyed by the string 'user'. Each property value
-	/// 			that is to be included in the log must be specified separately.
-	/// 			Properties are stored in logging contexts. By default 
-	/// 			the <c>log4net:HostName</c> property is set to the name of machine on 
-	/// 			which the event was originally logged.
-	/// 			</para>
-	/// 			<para>
-	/// 			If no key is specified, e.g. <b>%property</b> then all the keys and their
-	/// 			values are printed in a comma separated list.
-	/// 			</para>
-	/// 			<para>
-	/// 			The properties of an event are combined from a number of different
-	/// 			contexts. These are listed below in the order in which they are searched.
-	/// 			</para>
-	/// 			<list type="definition">
-	/// 				<item>
-	/// 					<term>the thread properties</term>
-	/// 					<description>
-	/// 					The <see cref="ThreadContext.Properties"/> that are set on the current
-	/// 					thread. These properties are shared by all events logged on this thread.
-	/// 					</description>
-	/// 				</item>
-	/// 				<item>
-	/// 					<term>the global properties</term>
-	/// 					<description>
-	/// 					The <see cref="GlobalContext.Properties"/> that are set globally. These 
-	/// 					properties are shared by all the threads in the AppDomain.
-	/// 					</description>
-	/// 				</item>
-	/// 			</list>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>random</term>
-	///         <description>
-	///             <para>
-	///             Used to output a random string of characters. The string is made up of
-	///             uppercase letters and numbers. By default the string is 4 characters long.
-	///             The length of the string can be specified within braces directly following the
-	/// 			pattern specifier, e.g. <b>%random{8}</b> would output an 8 character string.
-	///             </para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>username</term>
-	///         <description>
-	///				<para>
-	///				Used to output the WindowsIdentity for the currently
-	///				active user.
-	///				</para>
-	///         </description>
-	///     </item>
-	///     <item>
-	///         <term>utcdate</term>
-	///         <description>
-	/// 			<para>
-	/// 			Used to output the date of the logging event in universal time. 
-	/// 			The date conversion 
-	/// 			specifier may be followed by a <i>date format specifier</i> enclosed 
-	/// 			between braces. For example, <b>%utcdate{HH:mm:ss,fff}</b> or
-	/// 			<b>%utcdate{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
-	/// 			given then ISO8601 format is
-	/// 			assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
-	/// 			</para>
-	/// 			<para>
-	/// 			The date format specifier admits the same syntax as the
-	/// 			time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	/// 			<para>
-	/// 			For better results it is recommended to use the log4net date
-	/// 			formatters. These can be specified using one of the strings
-	/// 			"ABSOLUTE", "DATE" and "ISO8601" for specifying 
-	/// 			<see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
-	/// 			<see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
-	/// 			<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
-	/// 			<b>%utcdate{ISO8601}</b> or <b>%utcdate{ABSOLUTE}</b>.
-	/// 			</para>
-	/// 			<para>
-	/// 			These dedicated date formatters perform significantly
-	/// 			better than <see cref="M:DateTime.ToString(string)"/>.
-	/// 			</para>
-	///         </description>
-	///     </item>
-	///		<item>
-	///			<term>%</term>
-	///			<description>
-	/// 			<para>
-	/// 			The sequence %% outputs a single percent sign.
-	/// 			</para>
-	///			</description>
-	///		</item>
-	/// </list>
-	/// <para>
-	/// Additional pattern converters may be registered with a specific <see cref="PatternString"/>
-	/// instance using <see cref="M:AddConverter(ConverterInfo)"/> or
-	/// <see cref="M:AddConverter(string, Type)" />.
-	/// </para>
-	/// <para>
-	/// See the <see cref="log4net.Layout.PatternLayout"/> for details on the 
-	/// <i>format modifiers</i> supported by the patterns.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class PatternString : IOptionHandler
-	{
-		#region Static Fields
+  /// <summary>
+  /// This class implements a patterned string.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This string has embedded patterns that are resolved and expanded
+  /// when the string is formatted.
+  /// </para>
+  /// <para>
+  /// This class functions similarly to the <see cref="log4net.Layout.PatternLayout"/>
+  /// in that it accepts a pattern and renders it to a string. Unlike the 
+  /// <see cref="log4net.Layout.PatternLayout"/> however the <c>PatternString</c>
+  /// does not render the properties of a specific <see cref="LoggingEvent"/> but
+  /// of the process in general.
+  /// </para>
+  /// <para>
+  /// The recognized conversion pattern names are:
+  /// </para>
+  /// <list type="table">
+  ///     <listheader>
+  ///         <term>Conversion Pattern Name</term>
+  ///         <description>Effect</description>
+  ///     </listheader>
+  ///     <item>
+  ///         <term>appdomain</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output the friendly name of the current AppDomain.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>appsetting</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output the value of a specific appSetting key in the application
+  ///             configuration file.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>date</term>
+  ///         <description>
+  ///       <para>
+  ///       Used to output the current date and time in the local time zone. 
+  ///       To output the date in universal time use the <c>%utcdate</c> pattern.
+  ///       The date conversion 
+  ///       specifier may be followed by a <i>date format specifier</i> enclosed 
+  ///       between braces. For example, <b>%date{HH:mm:ss,fff}</b> or
+  ///       <b>%date{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+  ///       given then ISO8601 format is
+  ///       assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
+  ///       </para>
+  ///       <para>
+  ///       The date format specifier admits the same syntax as the
+  ///       time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///       <para>
+  ///       For better results it is recommended to use the log4net date
+  ///       formatters. These can be specified using one of the strings
+  ///       "ABSOLUTE", "DATE" and "ISO8601" for specifying 
+  ///       <see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+  ///       <see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+  ///       <see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+  ///       <b>%date{ISO8601}</b> or <b>%date{ABSOLUTE}</b>.
+  ///       </para>
+  ///       <para>
+  ///       These dedicated date formatters perform significantly
+  ///       better than <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>env</term>
+  ///         <description>
+  ///             <para>
+  ///       Used to output the a specific environment variable. The key to 
+  ///       lookup must be specified within braces and directly following the
+  ///       pattern specifier, e.g. <b>%env{COMPUTERNAME}</b> would include the value
+  ///       of the <c>COMPUTERNAME</c> environment variable.
+  ///             </para>
+  ///             <para>
+  ///             The <c>env</c> pattern is not supported on the .NET Compact Framework.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>identity</term>
+  ///         <description>
+  ///        <para>
+  ///        Used to output the user name for the currently active user
+  ///        (Principal.Identity.Name).
+  ///        </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>newline</term>
+  ///         <description>
+  ///       <para>
+  ///       Outputs the platform dependent line separator character or
+  ///       characters.
+  ///       </para>
+  ///       <para>
+  ///       This conversion pattern name offers the same performance as using 
+  ///       non-portable line separator strings such as  "\n", or "\r\n". 
+  ///       Thus, it is the preferred way of specifying a line separator.
+  ///       </para> 
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>processid</term>
+  ///         <description>
+  ///             <para>
+  ///        Used to output the system process ID for the current process.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>property</term>
+  ///         <description>
+  ///       <para>
+  ///       Used to output a specific context property. The key to 
+  ///       lookup must be specified within braces and directly following the
+  ///       pattern specifier, e.g. <b>%property{user}</b> would include the value
+  ///       from the property that is keyed by the string 'user'. Each property value
+  ///       that is to be included in the log must be specified separately.
+  ///       Properties are stored in logging contexts. By default 
+  ///       the <c>log4net:HostName</c> property is set to the name of machine on 
+  ///       which the event was originally logged.
+  ///       </para>
+  ///       <para>
+  ///       If no key is specified, e.g. <b>%property</b> then all the keys and their
+  ///       values are printed in a comma separated list.
+  ///       </para>
+  ///       <para>
+  ///       The properties of an event are combined from a number of different
+  ///       contexts. These are listed below in the order in which they are searched.
+  ///       </para>
+  ///       <list type="definition">
+  ///         <item>
+  ///           <term>the thread properties</term>
+  ///           <description>
+  ///           The <see cref="ThreadContext.Properties"/> that are set on the current
+  ///           thread. These properties are shared by all events logged on this thread.
+  ///           </description>
+  ///         </item>
+  ///         <item>
+  ///           <term>the global properties</term>
+  ///           <description>
+  ///           The <see cref="GlobalContext.Properties"/> that are set globally. These 
+  ///           properties are shared by all the threads in the AppDomain.
+  ///           </description>
+  ///         </item>
+  ///       </list>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>random</term>
+  ///         <description>
+  ///             <para>
+  ///             Used to output a random string of characters. The string is made up of
+  ///             uppercase letters and numbers. By default the string is 4 characters long.
+  ///             The length of the string can be specified within braces directly following the
+  ///       pattern specifier, e.g. <b>%random{8}</b> would output an 8 character string.
+  ///             </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>username</term>
+  ///         <description>
+  ///        <para>
+  ///        Used to output the WindowsIdentity for the currently
+  ///        active user.
+  ///        </para>
+  ///         </description>
+  ///     </item>
+  ///     <item>
+  ///         <term>utcdate</term>
+  ///         <description>
+  ///       <para>
+  ///       Used to output the date of the logging event in universal time. 
+  ///       The date conversion 
+  ///       specifier may be followed by a <i>date format specifier</i> enclosed 
+  ///       between braces. For example, <b>%utcdate{HH:mm:ss,fff}</b> or
+  ///       <b>%utcdate{dd MMM yyyy HH:mm:ss,fff}</b>.  If no date format specifier is 
+  ///       given then ISO8601 format is
+  ///       assumed (<see cref="log4net.DateFormatter.Iso8601DateFormatter"/>).
+  ///       </para>
+  ///       <para>
+  ///       The date format specifier admits the same syntax as the
+  ///       time pattern string of the <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///       <para>
+  ///       For better results it is recommended to use the log4net date
+  ///       formatters. These can be specified using one of the strings
+  ///       "ABSOLUTE", "DATE" and "ISO8601" for specifying 
+  ///       <see cref="log4net.DateFormatter.AbsoluteTimeDateFormatter"/>, 
+  ///       <see cref="log4net.DateFormatter.DateTimeDateFormatter"/> and respectively 
+  ///       <see cref="log4net.DateFormatter.Iso8601DateFormatter"/>. For example, 
+  ///       <b>%utcdate{ISO8601}</b> or <b>%utcdate{ABSOLUTE}</b>.
+  ///       </para>
+  ///       <para>
+  ///       These dedicated date formatters perform significantly
+  ///       better than <see cref="M:DateTime.ToString(string)"/>.
+  ///       </para>
+  ///         </description>
+  ///     </item>
+  ///    <item>
+  ///      <term>%</term>
+  ///      <description>
+  ///       <para>
+  ///       The sequence %% outputs a single percent sign.
+  ///       </para>
+  ///      </description>
+  ///    </item>
+  /// </list>
+  /// <para>
+  /// Additional pattern converters may be registered with a specific <see cref="PatternString"/>
+  /// instance using <see cref="M:AddConverter(ConverterInfo)"/> or
+  /// <see cref="M:AddConverter(string, Type)" />.
+  /// </para>
+  /// <para>
+  /// See the <see cref="log4net.Layout.PatternLayout"/> for details on the 
+  /// <i>format modifiers</i> supported by the patterns.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class PatternString : IOptionHandler
+  {
+    #region Static Fields
 
-		/// <summary>
-		/// Internal map of converter identifiers to converter types.
-		/// </summary>
-		private static Hashtable s_globalRulesRegistry;
+    /// <summary>
+    /// Internal map of converter identifiers to converter types.
+    /// </summary>
+    private static Hashtable s_globalRulesRegistry;
 
-		#endregion Static Fields
+    #endregion Static Fields
 
-		#region Member Variables
-    
-		/// <summary>
-		/// the pattern
-		/// </summary>
-		private string m_pattern;
-  
-		/// <summary>
-		/// the head of the pattern converter chain
-		/// </summary>
-		private PatternConverter m_head;
+    #region Member Variables
 
-		/// <summary>
-		/// patterns defined on this PatternString only
-		/// </summary>
-		private Hashtable m_instanceRulesRegistry = new Hashtable();
+    /// <summary>
+    /// the pattern
+    /// </summary>
+    private string m_pattern;
 
-		#endregion
+    /// <summary>
+    /// the head of the pattern converter chain
+    /// </summary>
+    private PatternConverter m_head;
 
-		#region Static Constructor
+    /// <summary>
+    /// patterns defined on this PatternString only
+    /// </summary>
+    private Hashtable m_instanceRulesRegistry = new Hashtable();
 
-		/// <summary>
-		/// Initialize the global registry
-		/// </summary>
-		static PatternString()
-		{
-			s_globalRulesRegistry = new Hashtable(18);
+    #endregion
 
-			s_globalRulesRegistry.Add("appdomain", typeof(AppDomainPatternConverter));
-			s_globalRulesRegistry.Add("date", typeof(DatePatternConverter));
+    #region Static Constructor
+
+    /// <summary>
+    /// Initialize the global registry
+    /// </summary>
+    static PatternString()
+    {
+      s_globalRulesRegistry = new Hashtable(18);
+
+      s_globalRulesRegistry.Add("appdomain", typeof(AppDomainPatternConverter));
+      s_globalRulesRegistry.Add("date", typeof(DatePatternConverter));
 #if !NETCF
-			s_globalRulesRegistry.Add("env", typeof(EnvironmentPatternConverter));
+      s_globalRulesRegistry.Add("env", typeof(EnvironmentPatternConverter));
 #if !NETSTANDARD1_3 // EnvironmentFolderPathPatternConverter not yet supported
-			s_globalRulesRegistry.Add("envFolderPath", typeof(EnvironmentFolderPathPatternConverter));
+      s_globalRulesRegistry.Add("envFolderPath", typeof(EnvironmentFolderPathPatternConverter));
 #endif
 #endif
-			s_globalRulesRegistry.Add("identity", typeof(IdentityPatternConverter));
-			s_globalRulesRegistry.Add("literal", typeof(LiteralPatternConverter));
-			s_globalRulesRegistry.Add("newline", typeof(NewLinePatternConverter));
-			s_globalRulesRegistry.Add("processid", typeof(ProcessIdPatternConverter));
-			s_globalRulesRegistry.Add("property", typeof(PropertyPatternConverter));
-			s_globalRulesRegistry.Add("random", typeof(RandomStringPatternConverter));
-			s_globalRulesRegistry.Add("username", typeof(UserNamePatternConverter));
+      s_globalRulesRegistry.Add("identity", typeof(IdentityPatternConverter));
+      s_globalRulesRegistry.Add("literal", typeof(LiteralPatternConverter));
+      s_globalRulesRegistry.Add("newline", typeof(NewLinePatternConverter));
+      s_globalRulesRegistry.Add("processid", typeof(ProcessIdPatternConverter));
+      s_globalRulesRegistry.Add("property", typeof(PropertyPatternConverter));
+      s_globalRulesRegistry.Add("random", typeof(RandomStringPatternConverter));
+      s_globalRulesRegistry.Add("username", typeof(UserNamePatternConverter));
 
-			s_globalRulesRegistry.Add("utcdate", typeof(UtcDatePatternConverter));
-			s_globalRulesRegistry.Add("utcDate", typeof(UtcDatePatternConverter));
-			s_globalRulesRegistry.Add("UtcDate", typeof(UtcDatePatternConverter));
+      s_globalRulesRegistry.Add("utcdate", typeof(UtcDatePatternConverter));
+      s_globalRulesRegistry.Add("utcDate", typeof(UtcDatePatternConverter));
+      s_globalRulesRegistry.Add("UtcDate", typeof(UtcDatePatternConverter));
 #if !NETCF && !NETSTANDARD1_3
-			// TODO - have added common variants of casing like utcdate above.
-			// Wouldn't it be better to use a case-insensitive Hashtable?
-			s_globalRulesRegistry.Add("appsetting", typeof(AppSettingPatternConverter));
-			s_globalRulesRegistry.Add("appSetting", typeof(AppSettingPatternConverter));
-			s_globalRulesRegistry.Add("AppSetting", typeof(AppSettingPatternConverter));
+      // TODO - have added common variants of casing like utcdate above.
+      // Wouldn't it be better to use a case-insensitive Hashtable?
+      s_globalRulesRegistry.Add("appsetting", typeof(AppSettingPatternConverter));
+      s_globalRulesRegistry.Add("appSetting", typeof(AppSettingPatternConverter));
+      s_globalRulesRegistry.Add("AppSetting", typeof(AppSettingPatternConverter));
 #endif
-		}
+    }
 
-		#endregion Static Constructor
+    #endregion Static Constructor
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initialize a new instance of <see cref="PatternString"/>
-		/// </para>
-		/// </remarks>
-		public PatternString()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initialize a new instance of <see cref="PatternString"/>
+    /// </para>
+    /// </remarks>
+    public PatternString()
+    {
+    }
 
-		/// <summary>
-		/// Constructs a PatternString
-		/// </summary>
-		/// <param name="pattern">The pattern to use with this PatternString</param>
-		/// <remarks>
-		/// <para>
-		/// Initialize a new instance of <see cref="PatternString"/> with the pattern specified.
-		/// </para>
-		/// </remarks>
-		public PatternString(string pattern)
-		{
-			m_pattern = pattern;
-			ActivateOptions();
-		}
+    /// <summary>
+    /// Constructs a PatternString
+    /// </summary>
+    /// <param name="pattern">The pattern to use with this PatternString</param>
+    /// <remarks>
+    /// <para>
+    /// Initialize a new instance of <see cref="PatternString"/> with the pattern specified.
+    /// </para>
+    /// </remarks>
+    public PatternString(string pattern)
+    {
+      m_pattern = pattern;
+      ActivateOptions();
+    }
 
-		#endregion
-  
-		/// <summary>
-		/// Gets or sets the pattern formatting string
-		/// </summary>
-		/// <value>
-		/// The pattern formatting string
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The <b>ConversionPattern</b> option. This is the string which
-		/// controls formatting and consists of a mix of literal content and
-		/// conversion specifiers.
-		/// </para>
-		/// </remarks>
-		public string ConversionPattern
-		{
-			get { return m_pattern;	}
-			set { m_pattern = value; }
-		}
+    #endregion
 
-		#region Implementation of IOptionHandler
+    /// <summary>
+    /// Gets or sets the pattern formatting string
+    /// </summary>
+    /// <value>
+    /// The pattern formatting string
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The <b>ConversionPattern</b> option. This is the string which
+    /// controls formatting and consists of a mix of literal content and
+    /// conversion specifiers.
+    /// </para>
+    /// </remarks>
+    public string ConversionPattern
+    {
+      get { return m_pattern; }
+      set { m_pattern = value; }
+    }
 
-		/// <summary>
-		/// Initialize object options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public virtual void ActivateOptions() 
-		{
-			m_head = CreatePatternParser(m_pattern).Parse();
-		}
+    #region Implementation of IOptionHandler
 
-		#endregion
+    /// <summary>
+    /// Initialize object options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public virtual void ActivateOptions()
+    {
+      m_head = CreatePatternParser(m_pattern).Parse();
+    }
 
-		/// <summary>
-		/// Create the <see cref="PatternParser"/> used to parse the pattern
-		/// </summary>
-		/// <param name="pattern">the pattern to parse</param>
-		/// <returns>The <see cref="PatternParser"/></returns>
-		/// <remarks>
-		/// <para>
-		/// Returns PatternParser used to parse the conversion string. Subclasses
-		/// may override this to return a subclass of PatternParser which recognize
-		/// custom conversion pattern name.
-		/// </para>
-		/// </remarks>
-		private PatternParser CreatePatternParser(string pattern) 
-		{
-			PatternParser patternParser = new PatternParser(pattern);
+    #endregion
 
-			// Add all the builtin patterns
-			foreach(DictionaryEntry entry in s_globalRulesRegistry)
-			{
-                ConverterInfo converterInfo = new ConverterInfo();
-                converterInfo.Name = (string)entry.Key;
-                converterInfo.Type = (Type)entry.Value;
-                patternParser.PatternConverters.Add(entry.Key, converterInfo);
-			}
-			// Add the instance patterns
-			foreach(DictionaryEntry entry in m_instanceRulesRegistry)
-			{
-				patternParser.PatternConverters[entry.Key] = entry.Value;
-			}
+    /// <summary>
+    /// Create the <see cref="PatternParser"/> used to parse the pattern
+    /// </summary>
+    /// <param name="pattern">the pattern to parse</param>
+    /// <returns>The <see cref="PatternParser"/></returns>
+    /// <remarks>
+    /// <para>
+    /// Returns PatternParser used to parse the conversion string. Subclasses
+    /// may override this to return a subclass of PatternParser which recognize
+    /// custom conversion pattern name.
+    /// </para>
+    /// </remarks>
+    private PatternParser CreatePatternParser(string pattern)
+    {
+      PatternParser patternParser = new PatternParser(pattern);
 
-			return patternParser;
-		}
-  
-		/// <summary>
-		/// Produces a formatted string as specified by the conversion pattern.
-		/// </summary>
-		/// <param name="writer">The TextWriter to write the formatted event to</param>
-		/// <remarks>
-		/// <para>
-		/// Format the pattern to the <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		public void Format(TextWriter writer) 
-		{
-			if (writer == null)
-			{
-				throw new ArgumentNullException("writer");
-			}
+      // Add all the builtin patterns
+      foreach (DictionaryEntry entry in s_globalRulesRegistry)
+      {
+        ConverterInfo converterInfo = new ConverterInfo();
+        converterInfo.Name = (string)entry.Key;
+        converterInfo.Type = (Type)entry.Value;
+        patternParser.PatternConverters.Add(entry.Key, converterInfo);
+      }
+      // Add the instance patterns
+      foreach (DictionaryEntry entry in m_instanceRulesRegistry)
+      {
+        patternParser.PatternConverters[entry.Key] = entry.Value;
+      }
 
-			PatternConverter c = m_head;
+      return patternParser;
+    }
 
-			// loop through the chain of pattern converters
-			while(c != null) 
-			{
-				c.Format(writer, null);
-				c = c.Next;
-			}
-		}
+    /// <summary>
+    /// Produces a formatted string as specified by the conversion pattern.
+    /// </summary>
+    /// <param name="writer">The TextWriter to write the formatted event to</param>
+    /// <remarks>
+    /// <para>
+    /// Format the pattern to the <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    public void Format(TextWriter writer)
+    {
+      if (writer == null)
+      {
+        throw new ArgumentNullException("writer");
+      }
 
-		/// <summary>
-		/// Format the pattern as a string
-		/// </summary>
-		/// <returns>the pattern formatted as a string</returns>
-		/// <remarks>
-		/// <para>
-		/// Format the pattern to a string.
-		/// </para>
-		/// </remarks>
-		public string Format() 
-		{
-			using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
-			Format(writer);
-			return writer.ToString();
-		}
+      PatternConverter c = m_head;
 
-		/// <summary>
-		/// Add a converter to this PatternString
-		/// </summary>
-		/// <param name="converterInfo">the converter info</param>
-		/// <remarks>
-		/// <para>
-		/// This version of the method is used by the configurator.
-		/// Programmatic users should use the alternative <see cref="M:AddConverter(string,Type)"/> method.
-		/// </para>
-		/// </remarks>
-		public void AddConverter(ConverterInfo converterInfo)
-		{
-            if (converterInfo == null) throw new ArgumentNullException("converterInfo");
+      // loop through the chain of pattern converters
+      while (c != null)
+      {
+        c.Format(writer, null);
+        c = c.Next;
+      }
+    }
 
-            if (!typeof(PatternConverter).IsAssignableFrom(converterInfo.Type))
-            {
-                throw new ArgumentException("The converter type specified [" + converterInfo.Type + "] must be a subclass of log4net.Util.PatternConverter", "converterInfo");
-            }
-            m_instanceRulesRegistry[converterInfo.Name] = converterInfo;
-		}
+    /// <summary>
+    /// Format the pattern as a string
+    /// </summary>
+    /// <returns>the pattern formatted as a string</returns>
+    /// <remarks>
+    /// <para>
+    /// Format the pattern to a string.
+    /// </para>
+    /// </remarks>
+    public string Format()
+    {
+      using StringWriter writer = new StringWriter(System.Globalization.CultureInfo.InvariantCulture);
+      Format(writer);
+      return writer.ToString();
+    }
 
-		/// <summary>
-		/// Add a converter to this PatternString
-		/// </summary>
-		/// <param name="name">the name of the conversion pattern for this converter</param>
-		/// <param name="type">the type of the converter</param>
-		/// <remarks>
-		/// <para>
-		/// Add a converter to this PatternString
-		/// </para>
-		/// </remarks>
-		public void AddConverter(string name, Type type)
-		{
-			if (name == null) throw new ArgumentNullException("name");
-			if (type == null) throw new ArgumentNullException("type");
+    /// <summary>
+    /// Add a converter to this PatternString
+    /// </summary>
+    /// <param name="converterInfo">the converter info</param>
+    /// <remarks>
+    /// <para>
+    /// This version of the method is used by the configurator.
+    /// Programmatic users should use the alternative <see cref="M:AddConverter(string,Type)"/> method.
+    /// </para>
+    /// </remarks>
+    public void AddConverter(ConverterInfo converterInfo)
+    {
+      if (converterInfo == null) throw new ArgumentNullException("converterInfo");
 
-            ConverterInfo converterInfo = new ConverterInfo();
-            converterInfo.Name = name;
-            converterInfo.Type = type;
+      if (!typeof(PatternConverter).IsAssignableFrom(converterInfo.Type))
+      {
+        throw new ArgumentException("The converter type specified [" + converterInfo.Type + "] must be a subclass of log4net.Util.PatternConverter", "converterInfo");
+      }
+      m_instanceRulesRegistry[converterInfo.Name] = converterInfo;
+    }
 
-            AddConverter(converterInfo);
-		}
-	}
+    /// <summary>
+    /// Add a converter to this PatternString
+    /// </summary>
+    /// <param name="name">the name of the conversion pattern for this converter</param>
+    /// <param name="type">the type of the converter</param>
+    /// <remarks>
+    /// <para>
+    /// Add a converter to this PatternString
+    /// </para>
+    /// </remarks>
+    public void AddConverter(string name, Type type)
+    {
+      if (name == null) throw new ArgumentNullException("name");
+      if (type == null) throw new ArgumentNullException("type");
+
+      ConverterInfo converterInfo = new ConverterInfo();
+      converterInfo.Name = name;
+      converterInfo.Type = type;
+
+      AddConverter(converterInfo);
+    }
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs b/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs
index 9a20d65..4168df1 100644
--- a/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/AppDomainPatternConverter.cs
@@ -25,30 +25,30 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write the name of the current AppDomain to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Write the name of the current AppDomain to the output writer
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class AppDomainPatternConverter : PatternConverter 
-	{
-		/// <summary>
-		/// Write the name of the current AppDomain to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Writes name of the current AppDomain to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
-			writer.Write( SystemInfo.ApplicationFriendlyName );
-		}
-	}
+  /// <summary>
+  /// Write the name of the current AppDomain to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Write the name of the current AppDomain to the output writer
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class AppDomainPatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Write the name of the current AppDomain to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Writes name of the current AppDomain to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      writer.Write(SystemInfo.ApplicationFriendlyName);
+    }
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs b/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs
index 75d5fb0..b3487ff 100644
--- a/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/AppSettingPatternConverter.cs
@@ -26,83 +26,83 @@
 
 namespace log4net.Util.PatternStringConverters
 {
+  /// <summary>
+  /// AppSetting pattern converter
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This pattern converter reads appSettings from the application configuration file.
+  /// </para>
+  /// <para>
+  /// If the <see cref="PatternConverter.Option"/> is specified then that will be used to
+  /// lookup a single appSettings value. If no <see cref="PatternConverter.Option"/> is specified
+  /// then all appSettings will be dumped as a list of key value pairs.
+  /// </para>
+  /// <para>
+  /// A typical use is to specify a base directory for log files, e.g.
+  /// <example>
+  /// <![CDATA[
+  /// <log4net>
+  ///    <appender name="MyAppender" type="log4net.Appender.RollingFileAppender">
+  ///      <file type="log4net.Util.PatternString" value="appsetting{LogDirectory}MyApp.log"/>
+  ///       ...
+  ///   </appender>
+  /// </log4net>
+  /// ]]>
+  /// </example>
+  /// </para>
+  /// </remarks>
+  internal sealed class AppSettingPatternConverter : PatternConverter
+  {
+    private static IDictionary AppSettingsDictionary
+    {
+      get
+      {
+        if (_appSettingsHashTable == null)
+        {
+          Hashtable h = new Hashtable();
+          foreach (string key in ConfigurationManager.AppSettings)
+          {
+            h.Add(key, ConfigurationManager.AppSettings[key]);
+          }
+          _appSettingsHashTable = h;
+        }
+        return _appSettingsHashTable;
+      }
+
+    }
+    private static Hashtable _appSettingsHashTable;
+
     /// <summary>
-    /// AppSetting pattern converter
+    /// Write the property value to the output
     /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">null, state is not set</param>
     /// <remarks>
     /// <para>
-    /// This pattern converter reads appSettings from the application configuration file.
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
     /// </para>
     /// <para>
-    /// If the <see cref="PatternConverter.Option"/> is specified then that will be used to
-    /// lookup a single appSettings value. If no <see cref="PatternConverter.Option"/> is specified
-    /// then all appSettings will be dumped as a list of key value pairs.
-    /// </para>
-    /// <para>
-    /// A typical use is to specify a base directory for log files, e.g.
-    /// <example>
-    /// <![CDATA[
-    /// <log4net>
-    ///    <appender name="MyAppender" type="log4net.Appender.RollingFileAppender">
-    ///      <file type="log4net.Util.PatternString" value="appsetting{LogDirectory}MyApp.log"/>
-    ///       ...
-    ///   </appender>
-    /// </log4net>
-    /// ]]>
-    /// </example>
+    /// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+    /// then all the properties are written as key value pairs.
     /// </para>
     /// </remarks>
-    internal sealed class AppSettingPatternConverter : PatternConverter
+    protected override void Convert(TextWriter writer, object state)
     {
-        private static IDictionary AppSettingsDictionary
-        {
-            get
-            {
-                if (_appSettingsHashTable == null)
-                {
-                    Hashtable h = new Hashtable();
-                    foreach(string key in ConfigurationManager.AppSettings)
-                    {
-                        h.Add(key, ConfigurationManager.AppSettings[key]);
-                    }
-                    _appSettingsHashTable = h;
-                }
-                return _appSettingsHashTable;
-            }
 
-        }
-        private static Hashtable _appSettingsHashTable;
-
-        /// <summary>
-        /// Write the property value to the output
-        /// </summary>
-        /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-        /// <param name="state">null, state is not set</param>
-        /// <remarks>
-        /// <para>
-        /// Writes out the value of a named property. The property name
-        /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-        /// property.
-        /// </para>
-        /// <para>
-        /// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
-        /// then all the properties are written as key value pairs.
-        /// </para>
-        /// </remarks>
-        protected override void Convert(TextWriter writer, object state)
-        {
-
-            if (Option != null)
-            {
-                // Write the value for the specified key
-                WriteObject(writer, null, ConfigurationManager.AppSettings[Option]);
-            }
-            else
-            {
-                // Write all the key value pairs
-                WriteDictionary(writer, null, AppSettingsDictionary);
-            }
-        }
+      if (Option != null)
+      {
+        // Write the value for the specified key
+        WriteObject(writer, null, ConfigurationManager.AppSettings[Option]);
+      }
+      else
+      {
+        // Write all the key value pairs
+        WriteDictionary(writer, null, AppSettingsDictionary);
+      }
     }
+  }
 }
 #endif // !NETCF && NET_2_0
diff --git a/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs b/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs
index 40ffd77..8f77b5f 100644
--- a/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/DatePatternConverter.cs
@@ -25,165 +25,165 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write the current date to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
-	/// the current date and time to the writer as a string.
-	/// </para>
-	/// <para>
-	/// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
-	/// the formatting of the date. The following values are allowed:
-	/// <list type="definition">
-	///		<listheader>
-	/// 		<term>Option value</term>
-	/// 		<description>Output</description>
-	/// 	</listheader>
-	///		<item>
-	/// 		<term>ISO8601</term>
-	/// 		<description>
-	/// 		Uses the <see cref="Iso8601DateFormatter"/> formatter. 
-	/// 		Formats using the <c>"yyyy-MM-dd HH:mm:ss,fff"</c> pattern.
-	/// 		</description>
-	/// 	</item>
-	/// 	<item>
-	/// 		<term>DATE</term>
-	/// 		<description>
-	/// 		Uses the <see cref="DateTimeDateFormatter"/> formatter. 
-	/// 		Formats using the <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, <c>"06 Nov 1994 15:49:37,459"</c>.
-	/// 		</description>
-	/// 	</item>
-	/// 	<item>
-	/// 		<term>ABSOLUTE</term>
-	/// 		<description>
-	/// 		Uses the <see cref="AbsoluteTimeDateFormatter"/> formatter. 
-	/// 		Formats using the <c>"HH:mm:ss,fff"</c> for example, <c>"15:49:37,459"</c>.
-	/// 		</description>
-	/// 	</item>
-	/// 	<item>
-	/// 		<term>other</term>
-	/// 		<description>
-	/// 		Any other pattern string uses the <see cref="SimpleDateFormatter"/> formatter. 
-	/// 		This formatter passes the pattern string to the <see cref="DateTime"/> 
-	/// 		<see cref="M:DateTime.ToString(string)"/> method.
-	/// 		For details on valid patterns see 
-	/// 		<a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp">DateTimeFormatInfo Class</a>.
-	/// 		</description>
-	/// 	</item>
-	/// </list>
-	/// </para>
-	/// <para>
-	/// The date and time is in the local time zone and is rendered in that zone.
-	/// To output the time in Universal time see <see cref="UtcDatePatternConverter"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal class DatePatternConverter : PatternConverter, IOptionHandler
-	{
-		/// <summary>
-		/// The <see cref="IDateFormatter"/> used to render the date to a string
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <see cref="IDateFormatter"/> used to render the date to a string
-		/// </para>
-		/// </remarks>
-		protected IDateFormatter m_dateFormatter;
-	
-		#region Implementation of IOptionHandler
+  /// <summary>
+  /// Write the current date to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
+  /// the current date and time to the writer as a string.
+  /// </para>
+  /// <para>
+  /// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
+  /// the formatting of the date. The following values are allowed:
+  /// <list type="definition">
+  ///    <listheader>
+  ///     <term>Option value</term>
+  ///     <description>Output</description>
+  ///   </listheader>
+  ///    <item>
+  ///     <term>ISO8601</term>
+  ///     <description>
+  ///     Uses the <see cref="Iso8601DateFormatter"/> formatter. 
+  ///     Formats using the <c>"yyyy-MM-dd HH:mm:ss,fff"</c> pattern.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>DATE</term>
+  ///     <description>
+  ///     Uses the <see cref="DateTimeDateFormatter"/> formatter. 
+  ///     Formats using the <c>"dd MMM yyyy HH:mm:ss,fff"</c> for example, <c>"06 Nov 1994 15:49:37,459"</c>.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>ABSOLUTE</term>
+  ///     <description>
+  ///     Uses the <see cref="AbsoluteTimeDateFormatter"/> formatter. 
+  ///     Formats using the <c>"HH:mm:ss,fff"</c> for example, <c>"15:49:37,459"</c>.
+  ///     </description>
+  ///   </item>
+  ///   <item>
+  ///     <term>other</term>
+  ///     <description>
+  ///     Any other pattern string uses the <see cref="SimpleDateFormatter"/> formatter. 
+  ///     This formatter passes the pattern string to the <see cref="DateTime"/> 
+  ///     <see cref="M:DateTime.ToString(string)"/> method.
+  ///     For details on valid patterns see 
+  ///     <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemglobalizationdatetimeformatinfoclasstopic.asp">DateTimeFormatInfo Class</a>.
+  ///     </description>
+  ///   </item>
+  /// </list>
+  /// </para>
+  /// <para>
+  /// The date and time is in the local time zone and is rendered in that zone.
+  /// To output the time in Universal time see <see cref="UtcDatePatternConverter"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal class DatePatternConverter : PatternConverter, IOptionHandler
+  {
+    /// <summary>
+    /// The <see cref="IDateFormatter"/> used to render the date to a string
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <see cref="IDateFormatter"/> used to render the date to a string
+    /// </para>
+    /// </remarks>
+    protected IDateFormatter m_dateFormatter;
 
-		/// <summary>
-		/// Initialize the converter options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			string dateFormatStr = Option;
+    #region Implementation of IOptionHandler
 
-			if (dateFormatStr == null)
-			{
-				dateFormatStr = AbsoluteTimeDateFormatter.Iso8601TimeDateFormat;
-			}
-			
-			if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.Iso8601TimeDateFormat))
-			{
-				m_dateFormatter = new Iso8601DateFormatter();
-			}
-			else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.AbsoluteTimeDateFormat))
-			{
-				m_dateFormatter = new AbsoluteTimeDateFormatter();
-			}
-			else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.DateAndTimeDateFormat))
-			{
-				m_dateFormatter = new DateTimeDateFormatter();
-			}
-			else
-			{
-				try 
-				{
-					m_dateFormatter = new SimpleDateFormatter(dateFormatStr);
-				}
-				catch (Exception e) 
-				{
-					LogLog.Error(declaringType, "Could not instantiate SimpleDateFormatter with ["+dateFormatStr+"]", e);
-					m_dateFormatter = new Iso8601DateFormatter();
-				}	
-			}
-		}
+    /// <summary>
+    /// Initialize the converter options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      string dateFormatStr = Option;
 
-		#endregion
+      if (dateFormatStr == null)
+      {
+        dateFormatStr = AbsoluteTimeDateFormatter.Iso8601TimeDateFormat;
+      }
 
-		/// <summary>
-		/// Write the current date to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Pass the current date and time to the <see cref="IDateFormatter"/>
-		/// for it to render it to the writer.
-		/// </para>
-		/// <para>
-		/// The date and time passed is in the local time zone.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
-			try 
-			{
-				m_dateFormatter.FormatDate(DateTime.Now, writer);
-			}
-			catch (Exception ex) 
-			{
-				LogLog.Error(declaringType, "Error occurred while converting date.", ex);
-			}
-		}
+      if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.Iso8601TimeDateFormat))
+      {
+        m_dateFormatter = new Iso8601DateFormatter();
+      }
+      else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.AbsoluteTimeDateFormat))
+      {
+        m_dateFormatter = new AbsoluteTimeDateFormatter();
+      }
+      else if (SystemInfo.EqualsIgnoringCase(dateFormatStr, AbsoluteTimeDateFormatter.DateAndTimeDateFormat))
+      {
+        m_dateFormatter = new DateTimeDateFormatter();
+      }
+      else
+      {
+        try
+        {
+          m_dateFormatter = new SimpleDateFormatter(dateFormatStr);
+        }
+        catch (Exception e)
+        {
+          LogLog.Error(declaringType, "Could not instantiate SimpleDateFormatter with [" + dateFormatStr + "]", e);
+          m_dateFormatter = new Iso8601DateFormatter();
+        }
+      }
+    }
 
-	    #region Private Static Fields
+    #endregion
 
-	    /// <summary>
-	    /// The fully qualified type of the DatePatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(DatePatternConverter);
+    /// <summary>
+    /// Write the current date to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Pass the current date and time to the <see cref="IDateFormatter"/>
+    /// for it to render it to the writer.
+    /// </para>
+    /// <para>
+    /// The date and time passed is in the local time zone.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      try
+      {
+        m_dateFormatter.FormatDate(DateTime.Now, writer);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting date.", ex);
+      }
+    }
 
-	    #endregion Private Static Fields
-	}
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the DatePatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(DatePatternConverter);
+
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs b/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs
index bd8d4b5..a66cdce 100644
--- a/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/EnvironmentFolderPathPatternConverter.cs
@@ -24,75 +24,75 @@
 
 namespace log4net.Util.PatternStringConverters
 {
+  /// <summary>
+  /// Write an <see cref="System.Environment.SpecialFolder" /> folder path to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Write an special path environment folder path to the output writer.
+  /// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
+  /// the name of the variable to output. <see cref="log4net.Util.PatternConverter.Option"/>
+  /// should be a value in the <see cref="System.Environment.SpecialFolder" /> enumeration.
+  /// </para>
+  /// </remarks>
+  /// <author>Ron Grabowski</author>
+  internal sealed class EnvironmentFolderPathPatternConverter : PatternConverter
+  {
     /// <summary>
-    /// Write an <see cref="System.Environment.SpecialFolder" /> folder path to the output
+    /// Write an special path environment folder path to the output
     /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
     /// <remarks>
     /// <para>
-    /// Write an special path environment folder path to the output writer.
-    /// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
-    /// the name of the variable to output. <see cref="log4net.Util.PatternConverter.Option"/>
-    /// should be a value in the <see cref="System.Environment.SpecialFolder" /> enumeration.
+    /// Writes the special path environment folder path to the output <paramref name="writer"/>.
+    /// The name of the special path environment folder path to output must be set
+    /// using the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
     /// </para>
     /// </remarks>
-    /// <author>Ron Grabowski</author>
-    internal sealed class EnvironmentFolderPathPatternConverter : PatternConverter
+    protected override void Convert(TextWriter writer, object state)
     {
-        /// <summary>
-        /// Write an special path environment folder path to the output
-        /// </summary>
-        /// <param name="writer">the writer to write to</param>
-        /// <param name="state">null, state is not set</param>
-        /// <remarks>
-        /// <para>
-        /// Writes the special path environment folder path to the output <paramref name="writer"/>.
-        /// The name of the special path environment folder path to output must be set
-        /// using the <see cref="log4net.Util.PatternConverter.Option"/>
-        /// property.
-        /// </para>
-        /// </remarks>
-        protected override void Convert(TextWriter writer, object state)
+      try
+      {
+        if (Option != null && Option.Length > 0)
         {
-            try
-            {
-                if (Option != null && Option.Length > 0)
-                {
-                    Environment.SpecialFolder specialFolder =
-                        (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), Option, true);
+          Environment.SpecialFolder specialFolder =
+              (Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), Option, true);
 
-                    string envFolderPathValue = Environment.GetFolderPath(specialFolder);
-                    if (envFolderPathValue != null && envFolderPathValue.Length > 0)
-                    {
-                        writer.Write(envFolderPathValue);
-                    }
-                }
-            }
-            catch (System.Security.SecurityException secEx)
-            {
-                // This security exception will occur if the caller does not have 
-                // unrestricted environment permission. If this occurs the expansion 
-                // will be skipped with the following warning message.
-                LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion.", secEx);
-            }
-            catch (Exception ex)
-            {
-                LogLog.Error(declaringType, "Error occurred while converting environment variable.", ex);
-            }
+          string envFolderPathValue = Environment.GetFolderPath(specialFolder);
+          if (envFolderPathValue != null && envFolderPathValue.Length > 0)
+          {
+            writer.Write(envFolderPathValue);
+          }
         }
-
-        #region Private Static Fields
-
-        /// <summary>
-        /// The fully qualified type of the EnvironmentFolderPathPatternConverter class.
-        /// </summary>
-        /// <remarks>
-        /// Used by the internal logger to record the Type of the
-        /// log message.
-        /// </remarks>
-        private static readonly Type declaringType = typeof(EnvironmentFolderPathPatternConverter);
-
-        #endregion Private Static Fields
+      }
+      catch (System.Security.SecurityException secEx)
+      {
+        // This security exception will occur if the caller does not have 
+        // unrestricted environment permission. If this occurs the expansion 
+        // will be skipped with the following warning message.
+        LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion.", secEx);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting environment variable.", ex);
+      }
     }
+
+    #region Private Static Fields
+
+    /// <summary>
+    /// The fully qualified type of the EnvironmentFolderPathPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(EnvironmentFolderPathPatternConverter);
+
+    #endregion Private Static Fields
+  }
 }
 
 #endif // !NETCF && NET_2_0
\ No newline at end of file
diff --git a/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs b/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs
index 7085129..7efb2a2 100644
--- a/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/EnvironmentPatternConverter.cs
@@ -25,87 +25,87 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write an environment variable to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Write an environment variable to the output writer.
-	/// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
-	/// the name of the variable to output.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class EnvironmentPatternConverter : PatternConverter
-	{
-		/// <summary>
-		/// Write an environment variable to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the environment variable to the output <paramref name="writer"/>.
-		/// The name of the environment variable to output must be set
-		/// using the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
-			try 
-			{
-				if (this.Option != null && this.Option.Length > 0)
-				{
-					// Lookup the environment variable
-					string envValue = Environment.GetEnvironmentVariable(this.Option);
+  /// <summary>
+  /// Write an environment variable to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Write an environment variable to the output writer.
+  /// The value of the <see cref="log4net.Util.PatternConverter.Option"/> determines 
+  /// the name of the variable to output.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class EnvironmentPatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Write an environment variable to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the environment variable to the output <paramref name="writer"/>.
+    /// The name of the environment variable to output must be set
+    /// using the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      try
+      {
+        if (this.Option != null && this.Option.Length > 0)
+        {
+          // Lookup the environment variable
+          string envValue = Environment.GetEnvironmentVariable(this.Option);
 
 #if NET_2_0 || NETSTANDARD2_0
-                    // If we didn't see it for the process, try a user level variable.
-				    if (envValue == null)
-				    {
-				        envValue = Environment.GetEnvironmentVariable(this.Option, EnvironmentVariableTarget.User);
-				    }
+          // If we didn't see it for the process, try a user level variable.
+          if (envValue == null)
+          {
+            envValue = Environment.GetEnvironmentVariable(this.Option, EnvironmentVariableTarget.User);
+          }
 
-                    // If we still didn't find it, try a system level one.
-				    if (envValue == null)
-				    {
-				        envValue = Environment.GetEnvironmentVariable(this.Option, EnvironmentVariableTarget.Machine);
-				    }
-#endif					
+          // If we still didn't find it, try a system level one.
+          if (envValue == null)
+          {
+            envValue = Environment.GetEnvironmentVariable(this.Option, EnvironmentVariableTarget.Machine);
+          }
+#endif          
 
-					if (envValue != null && envValue.Length > 0)
-					{
-						writer.Write(envValue);
-					}
-				}
-			}
-			catch(System.Security.SecurityException secEx)
-			{
-				// This security exception will occur if the caller does not have 
-				// unrestricted environment permission. If this occurs the expansion 
-				// will be skipped with the following warning message.
-				LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion.", secEx);
-			}
-			catch (Exception ex) 
-			{
-				LogLog.Error(declaringType, "Error occurred while converting environment variable.", ex);
-			}
-		}
+          if (envValue != null && envValue.Length > 0)
+          {
+            writer.Write(envValue);
+          }
+        }
+      }
+      catch (System.Security.SecurityException secEx)
+      {
+        // This security exception will occur if the caller does not have 
+        // unrestricted environment permission. If this occurs the expansion 
+        // will be skipped with the following warning message.
+        LogLog.Debug(declaringType, "Security exception while trying to expand environment variables. Error Ignored. No Expansion.", secEx);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting environment variable.", ex);
+      }
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the EnvironmentPatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(EnvironmentPatternConverter);
+    /// <summary>
+    /// The fully qualified type of the EnvironmentPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(EnvironmentPatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
 #endif // !NETCF
diff --git a/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs b/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs
index f3ee860..8f6b926 100644
--- a/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/IdentityPatternConverter.cs
@@ -25,64 +25,64 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write the current thread identity to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Write the current thread identity to the output writer
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class IdentityPatternConverter : PatternConverter 
-	{
-		/// <summary>
-		/// Write the current thread identity to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Writes the current thread identity to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
+  /// <summary>
+  /// Write the current thread identity to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Write the current thread identity to the output writer
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class IdentityPatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Write the current thread identity to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Writes the current thread identity to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
 #if (NETCF || SSCLI || NETSTANDARD1_3)
-			// On compact framework there's no notion of current thread principals
-			writer.Write( SystemInfo.NotAvailableText );
+      // On compact framework there's no notion of current thread principals
+      writer.Write( SystemInfo.NotAvailableText );
 #else
-			try
-			{
-				if (System.Threading.Thread.CurrentPrincipal != null && 
-					System.Threading.Thread.CurrentPrincipal.Identity != null &&
-					System.Threading.Thread.CurrentPrincipal.Identity.Name != null)
-				{
-					writer.Write( System.Threading.Thread.CurrentPrincipal.Identity.Name );
-				}
-			}
-			catch(System.Security.SecurityException)
-			{
-				// This security exception will occur if the caller does not have 
-				// some undefined set of SecurityPermission flags.
-				LogLog.Debug(declaringType, "Security exception while trying to get current thread principal. Error Ignored.");
+      try
+      {
+        if (System.Threading.Thread.CurrentPrincipal != null &&
+          System.Threading.Thread.CurrentPrincipal.Identity != null &&
+          System.Threading.Thread.CurrentPrincipal.Identity.Name != null)
+        {
+          writer.Write(System.Threading.Thread.CurrentPrincipal.Identity.Name);
+        }
+      }
+      catch (System.Security.SecurityException)
+      {
+        // This security exception will occur if the caller does not have 
+        // some undefined set of SecurityPermission flags.
+        LogLog.Debug(declaringType, "Security exception while trying to get current thread principal. Error Ignored.");
 
-				writer.Write( SystemInfo.NotAvailableText );
-			}
+        writer.Write(SystemInfo.NotAvailableText);
+      }
 #endif
-		}
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the IdentityPatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(IdentityPatternConverter);
+    /// <summary>
+    /// The fully qualified type of the IdentityPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(IdentityPatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs b/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs
index 3f3e242..c1adfb9 100644
--- a/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/LiteralPatternConverter.cs
@@ -25,83 +25,83 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Pattern converter for literal string instances in the pattern
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the literal string value specified in the 
-	/// <see cref="log4net.Util.PatternConverter.Option"/> property to 
-	/// the output.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal class LiteralPatternConverter : PatternConverter 
-	{
-		/// <summary>
-		/// Set the next converter in the chain
-		/// </summary>
-		/// <param name="pc">The next pattern converter in the chain</param>
-		/// <returns>The next pattern converter</returns>
-		/// <remarks>
-		/// <para>
-		/// Special case the building of the pattern converter chain
-		/// for <see cref="LiteralPatternConverter"/> instances. Two adjacent
-		/// literals in the pattern can be represented by a single combined
-		/// pattern converter. This implementation detects when a 
-		/// <see cref="LiteralPatternConverter"/> is added to the chain
-		/// after this converter and combines its value with this converter's
-		/// literal value.
-		/// </para>
-		/// </remarks>
-		public override PatternConverter SetNext(PatternConverter pc)
-		{
-			LiteralPatternConverter literalPc = pc as LiteralPatternConverter;
-			if (literalPc != null)
-			{
-				// Combine the two adjacent literals together
-				Option = Option + literalPc.Option;
+  /// <summary>
+  /// Pattern converter for literal string instances in the pattern
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the literal string value specified in the 
+  /// <see cref="log4net.Util.PatternConverter.Option"/> property to 
+  /// the output.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal class LiteralPatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Set the next converter in the chain
+    /// </summary>
+    /// <param name="pc">The next pattern converter in the chain</param>
+    /// <returns>The next pattern converter</returns>
+    /// <remarks>
+    /// <para>
+    /// Special case the building of the pattern converter chain
+    /// for <see cref="LiteralPatternConverter"/> instances. Two adjacent
+    /// literals in the pattern can be represented by a single combined
+    /// pattern converter. This implementation detects when a 
+    /// <see cref="LiteralPatternConverter"/> is added to the chain
+    /// after this converter and combines its value with this converter's
+    /// literal value.
+    /// </para>
+    /// </remarks>
+    public override PatternConverter SetNext(PatternConverter pc)
+    {
+      LiteralPatternConverter literalPc = pc as LiteralPatternConverter;
+      if (literalPc != null)
+      {
+        // Combine the two adjacent literals together
+        Option = Option + literalPc.Option;
 
-				// We are the next converter now
-				return this;
-			}
+        // We are the next converter now
+        return this;
+      }
 
-			return base.SetNext(pc);
-		}
+      return base.SetNext(pc);
+    }
 
-		/// <summary>
-		/// Write the literal to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, not set</param>
-		/// <remarks>
-		/// <para>
-		/// Override the formatting behavior to ignore the FormattingInfo
-		/// because we have a literal instead.
-		/// </para>
-		/// <para>
-		/// Writes the value of <see cref="log4net.Util.PatternConverter.Option"/>
-		/// to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		public override void Format(TextWriter writer, object state) 
-		{
-			writer.Write(Option);
-		}
+    /// <summary>
+    /// Write the literal to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, not set</param>
+    /// <remarks>
+    /// <para>
+    /// Override the formatting behavior to ignore the FormattingInfo
+    /// because we have a literal instead.
+    /// </para>
+    /// <para>
+    /// Writes the value of <see cref="log4net.Util.PatternConverter.Option"/>
+    /// to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    public override void Format(TextWriter writer, object state)
+    {
+      writer.Write(Option);
+    }
 
-		/// <summary>
-		/// Convert this pattern into the rendered message
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">null, not set</param>
-		/// <remarks>
-		/// <para>
-		/// This method is not used.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
-			throw new InvalidOperationException("Should never get here because of the overridden Format method");
-		}
-	}
+    /// <summary>
+    /// Convert this pattern into the rendered message
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">null, not set</param>
+    /// <remarks>
+    /// <para>
+    /// This method is not used.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      throw new InvalidOperationException("Should never get here because of the overridden Format method");
+    }
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/NewLinePatternConverter.cs b/src/log4net/Util/PatternStringConverters/NewLinePatternConverter.cs
index 2ba276f..2d663a0 100644
--- a/src/log4net/Util/PatternStringConverters/NewLinePatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/NewLinePatternConverter.cs
@@ -21,66 +21,66 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Writes a newline to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Writes the system dependent line terminator to the output.
-	/// This behavior can be overridden by setting the <see cref="PatternConverter.Option"/>:
-	/// </para>
-	/// <list type="definition">
-	///   <listheader>
-	///     <term>Option Value</term>
-	///     <description>Output</description>
-	///   </listheader>
-	///   <item>
-	///     <term>DOS</term>
-	///     <description>DOS or Windows line terminator <c>"\r\n"</c></description>
-	///   </item>
-	///   <item>
-	///     <term>UNIX</term>
-	///     <description>UNIX line terminator <c>"\n"</c></description>
-	///   </item>
-	/// </list>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class NewLinePatternConverter : LiteralPatternConverter, IOptionHandler
-	{
-		#region Implementation of IOptionHandler
+  /// <summary>
+  /// Writes a newline to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Writes the system dependent line terminator to the output.
+  /// This behavior can be overridden by setting the <see cref="PatternConverter.Option"/>:
+  /// </para>
+  /// <list type="definition">
+  ///   <listheader>
+  ///     <term>Option Value</term>
+  ///     <description>Output</description>
+  ///   </listheader>
+  ///   <item>
+  ///     <term>DOS</term>
+  ///     <description>DOS or Windows line terminator <c>"\r\n"</c></description>
+  ///   </item>
+  ///   <item>
+  ///     <term>UNIX</term>
+  ///     <description>UNIX line terminator <c>"\n"</c></description>
+  ///   </item>
+  /// </list>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class NewLinePatternConverter : LiteralPatternConverter, IOptionHandler
+  {
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the converter
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			if (SystemInfo.EqualsIgnoringCase(Option, "DOS"))
-			{
-				Option = "\r\n";
-			}
-			else if (SystemInfo.EqualsIgnoringCase(Option, "UNIX"))
-			{
-				Option = "\n";
-			}
-			else
-			{
-				Option = SystemInfo.NewLine;
-			}
-		}
+    /// <summary>
+    /// Initialize the converter
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      if (SystemInfo.EqualsIgnoringCase(Option, "DOS"))
+      {
+        Option = "\r\n";
+      }
+      else if (SystemInfo.EqualsIgnoringCase(Option, "UNIX"))
+      {
+        Option = "\n";
+      }
+      else
+      {
+        Option = SystemInfo.NewLine;
+      }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs b/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs
index fbb796d..55dbeeb 100644
--- a/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/ProcessIdPatternConverter.cs
@@ -22,62 +22,62 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write the current process ID to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Write the current process ID to the output writer
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class ProcessIdPatternConverter : PatternConverter 
-	{
-		/// <summary>
-		/// Write the current process ID to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Write the current process ID to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
+  /// <summary>
+  /// Write the current process ID to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Write the current process ID to the output writer
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class ProcessIdPatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Write the current process ID to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Write the current process ID to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
         [System.Security.SecuritySafeCritical]
 #endif
-        protected override void Convert(TextWriter writer, object state) 
-		{
+    protected override void Convert(TextWriter writer, object state)
+    {
 #if (NETCF || SSCLI)
-			// On compact framework there is no System.Diagnostics.Process class
-			writer.Write( SystemInfo.NotAvailableText );
+      // On compact framework there is no System.Diagnostics.Process class
+      writer.Write( SystemInfo.NotAvailableText );
 #else
-			try
-			{
-				writer.Write( System.Diagnostics.Process.GetCurrentProcess().Id );
-			}
-			catch(System.Security.SecurityException)
-			{
-				// This security exception will occur if the caller does not have 
-				// some undefined set of SecurityPermission flags.
-				LogLog.Debug(declaringType, "Security exception while trying to get current process id. Error Ignored.");
+      try
+      {
+        writer.Write(System.Diagnostics.Process.GetCurrentProcess().Id);
+      }
+      catch (System.Security.SecurityException)
+      {
+        // This security exception will occur if the caller does not have 
+        // some undefined set of SecurityPermission flags.
+        LogLog.Debug(declaringType, "Security exception while trying to get current process id. Error Ignored.");
 
-				writer.Write( SystemInfo.NotAvailableText );
-			}
+        writer.Write(SystemInfo.NotAvailableText);
+      }
 #endif
-		}
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the ProcessIdPatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(ProcessIdPatternConverter);
+    /// <summary>
+    /// The fully qualified type of the ProcessIdPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(ProcessIdPatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs b/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs
index bf81f2a..9955116 100644
--- a/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/PropertyPatternConverter.cs
@@ -21,72 +21,72 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Property pattern converter
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This pattern converter reads the thread and global properties.
-	/// The thread properties take priority over global properties.
-	/// See <see cref="ThreadContext.Properties"/> for details of the 
-	/// thread properties. See <see cref="GlobalContext.Properties"/> for
-	/// details of the global properties.
-	/// </para>
-	/// <para>
-	/// If the <see cref="PatternConverter.Option"/> is specified then that will be used to
-	/// lookup a single property. If no <see cref="PatternConverter.Option"/> is specified
-	/// then all properties will be dumped as a list of key value pairs.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class PropertyPatternConverter : PatternConverter 
-	{
-		/// <summary>
-		/// Write the property value to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Writes out the value of a named property. The property name
-		/// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
-		/// property.
-		/// </para>
-		/// <para>
-		/// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
-		/// then all the properties are written as key value pairs.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
-			CompositeProperties compositeProperties = new CompositeProperties();
+  /// <summary>
+  /// Property pattern converter
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This pattern converter reads the thread and global properties.
+  /// The thread properties take priority over global properties.
+  /// See <see cref="ThreadContext.Properties"/> for details of the 
+  /// thread properties. See <see cref="GlobalContext.Properties"/> for
+  /// details of the global properties.
+  /// </para>
+  /// <para>
+  /// If the <see cref="PatternConverter.Option"/> is specified then that will be used to
+  /// lookup a single property. If no <see cref="PatternConverter.Option"/> is specified
+  /// then all properties will be dumped as a list of key value pairs.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class PropertyPatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Write the property value to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Writes out the value of a named property. The property name
+    /// should be set in the <see cref="log4net.Util.PatternConverter.Option"/>
+    /// property.
+    /// </para>
+    /// <para>
+    /// If the <see cref="log4net.Util.PatternConverter.Option"/> is set to <c>null</c>
+    /// then all the properties are written as key value pairs.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      CompositeProperties compositeProperties = new CompositeProperties();
 
 #if !NETCF
-			PropertiesDictionary logicalThreadProperties = LogicalThreadContext.Properties.GetProperties(false);
-			if (logicalThreadProperties != null)
-			{
-				compositeProperties.Add(logicalThreadProperties);
-			}
+      PropertiesDictionary logicalThreadProperties = LogicalThreadContext.Properties.GetProperties(false);
+      if (logicalThreadProperties != null)
+      {
+        compositeProperties.Add(logicalThreadProperties);
+      }
 #endif
-			PropertiesDictionary threadProperties = ThreadContext.Properties.GetProperties(false);
-			if (threadProperties != null)
-			{
-				compositeProperties.Add(threadProperties);
-			}
+      PropertiesDictionary threadProperties = ThreadContext.Properties.GetProperties(false);
+      if (threadProperties != null)
+      {
+        compositeProperties.Add(threadProperties);
+      }
 
-			// TODO: Add Repository Properties
-			compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties());
+      // TODO: Add Repository Properties
+      compositeProperties.Add(GlobalContext.Properties.GetReadOnlyProperties());
 
-			if (Option != null)
-			{
-				// Write the value for the specified key
-				WriteObject(writer, null, compositeProperties[Option]);
-			}
-			else
-			{
-				// Write all the key value pairs
-				WriteDictionary(writer, null, compositeProperties.Flatten());
-			}
-		}
-	}
+      if (Option != null)
+      {
+        // Write the value for the specified key
+        WriteObject(writer, null, compositeProperties[Option]);
+      }
+      else
+      {
+        // Write all the key value pairs
+        WriteDictionary(writer, null, compositeProperties.Flatten());
+      }
+    }
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs b/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs
index 015cfd7..0502dfc 100644
--- a/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/RandomStringPatternConverter.cs
@@ -27,130 +27,130 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// A Pattern converter that generates a string of random characters
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// The converter generates a string of random characters. By default
-	/// the string is length 4. This can be changed by setting the <see cref="PatternConverter.Option"/>
-	/// to the string value of the length required.
-	/// </para>
-	/// <para>
-	/// The random characters in the string are limited to uppercase letters
-	/// and numbers only.
-	/// </para>
-	/// <para>
-	/// The random number generator used by this class is not cryptographically secure.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class RandomStringPatternConverter : PatternConverter, IOptionHandler
-	{
-		/// <summary>
-		/// Shared random number generator
-		/// </summary>
-		private static readonly Random s_random = new Random();
+  /// <summary>
+  /// A Pattern converter that generates a string of random characters
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// The converter generates a string of random characters. By default
+  /// the string is length 4. This can be changed by setting the <see cref="PatternConverter.Option"/>
+  /// to the string value of the length required.
+  /// </para>
+  /// <para>
+  /// The random characters in the string are limited to uppercase letters
+  /// and numbers only.
+  /// </para>
+  /// <para>
+  /// The random number generator used by this class is not cryptographically secure.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class RandomStringPatternConverter : PatternConverter, IOptionHandler
+  {
+    /// <summary>
+    /// Shared random number generator
+    /// </summary>
+    private static readonly Random s_random = new Random();
 
-		/// <summary>
-		/// Length of random string to generate. Default length 4.
-		/// </summary>
-		private int m_length = 4;
+    /// <summary>
+    /// Length of random string to generate. Default length 4.
+    /// </summary>
+    private int m_length = 4;
 
-		#region Implementation of IOptionHandler
+    #region Implementation of IOptionHandler
 
-		/// <summary>
-		/// Initialize the converter options
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// </remarks>
-		public void ActivateOptions()
-		{
-			string optionStr = Option;
-			if (optionStr != null && optionStr.Length > 0)
-			{
-				int lengthVal;
-				if (SystemInfo.TryParse(optionStr, out lengthVal))
-				{
-					m_length = lengthVal;
-				}
-				else
-				{
-					LogLog.Error(declaringType, "RandomStringPatternConverter: Could not convert Option ["+optionStr+"] to Length Int32");
-				}	
-			}
-		}
+    /// <summary>
+    /// Initialize the converter options
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// </remarks>
+    public void ActivateOptions()
+    {
+      string optionStr = Option;
+      if (optionStr != null && optionStr.Length > 0)
+      {
+        int lengthVal;
+        if (SystemInfo.TryParse(optionStr, out lengthVal))
+        {
+          m_length = lengthVal;
+        }
+        else
+        {
+          LogLog.Error(declaringType, "RandomStringPatternConverter: Could not convert Option [" + optionStr + "] to Length Int32");
+        }
+      }
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Write a randoim string to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Write a randoim string to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
-			try 
-			{
-				lock(s_random)
-				{
-					for(int i=0; i<m_length; i++)
-					{
-						int randValue = s_random.Next(36);
+    /// <summary>
+    /// Write a randoim string to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Write a randoim string to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      try
+      {
+        lock (s_random)
+        {
+          for (int i = 0; i < m_length; i++)
+          {
+            int randValue = s_random.Next(36);
 
-						if (randValue < 26)
-						{
-							// Letter
-							char ch = (char)('A' + randValue);
-							writer.Write(ch);
-						}
-						else if (randValue < 36)
-						{
-							// Number
-							char ch = (char)('0' + (randValue - 26));
-							writer.Write(ch);
-						}
-						else
-						{
-							// Should not get here
-							writer.Write('X');
-						}
-					}
-				}
-			}
-			catch (Exception ex) 
-			{
-				LogLog.Error(declaringType, "Error occurred while converting.", ex);
-			}
-		}
+            if (randValue < 26)
+            {
+              // Letter
+              char ch = (char)('A' + randValue);
+              writer.Write(ch);
+            }
+            else if (randValue < 36)
+            {
+              // Number
+              char ch = (char)('0' + (randValue - 26));
+              writer.Write(ch);
+            }
+            else
+            {
+              // Should not get here
+              writer.Write('X');
+            }
+          }
+        }
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting.", ex);
+      }
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the RandomStringPatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(RandomStringPatternConverter);
+    /// <summary>
+    /// The fully qualified type of the RandomStringPatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(RandomStringPatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs b/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs
index 9cc69fd..a0f4789 100644
--- a/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/UserNamePatternConverter.cs
@@ -22,64 +22,64 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write the current threads username to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Write the current threads username to the output writer
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	internal sealed class UserNamePatternConverter : PatternConverter 
-	{
-		/// <summary>
-		/// Write the current threads username to the output
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Write the current threads username to the output <paramref name="writer"/>.
-		/// </para>
-		/// </remarks>
-		protected override void Convert(TextWriter writer, object state) 
-		{
+  /// <summary>
+  /// Write the current threads username to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Write the current threads username to the output writer
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  internal sealed class UserNamePatternConverter : PatternConverter
+  {
+    /// <summary>
+    /// Write the current threads username to the output
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Write the current threads username to the output <paramref name="writer"/>.
+    /// </para>
+    /// </remarks>
+    protected override void Convert(TextWriter writer, object state)
+    {
 #if (NETCF || SSCLI || NETSTANDARD1_3)
-			// On compact framework there's no notion of current Windows user
-			writer.Write( SystemInfo.NotAvailableText );
+      // On compact framework there's no notion of current Windows user
+      writer.Write( SystemInfo.NotAvailableText );
 #else
-			try
-			{
-				System.Security.Principal.WindowsIdentity windowsIdentity = null;
-				windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
-				if (windowsIdentity != null && windowsIdentity.Name != null)
-				{
-					writer.Write( windowsIdentity.Name );
-				}
-			}
-			catch(System.Security.SecurityException)
-			{
-				// This security exception will occur if the caller does not have 
-				// some undefined set of SecurityPermission flags.
-				LogLog.Debug(declaringType, "Security exception while trying to get current windows identity. Error Ignored.");
+      try
+      {
+        System.Security.Principal.WindowsIdentity windowsIdentity = null;
+        windowsIdentity = System.Security.Principal.WindowsIdentity.GetCurrent();
+        if (windowsIdentity != null && windowsIdentity.Name != null)
+        {
+          writer.Write(windowsIdentity.Name);
+        }
+      }
+      catch (System.Security.SecurityException)
+      {
+        // This security exception will occur if the caller does not have 
+        // some undefined set of SecurityPermission flags.
+        LogLog.Debug(declaringType, "Security exception while trying to get current windows identity. Error Ignored.");
 
-				writer.Write( SystemInfo.NotAvailableText );
-			}
+        writer.Write(SystemInfo.NotAvailableText);
+      }
 #endif
-		}
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the UserNamePatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(UserNamePatternConverter);
+    /// <summary>
+    /// The fully qualified type of the UserNamePatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(UserNamePatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs b/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs
index 31d5f7f..3a04450 100644
--- a/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs
+++ b/src/log4net/Util/PatternStringConverters/UtcDatePatternConverter.cs
@@ -27,60 +27,60 @@
 
 namespace log4net.Util.PatternStringConverters
 {
-	/// <summary>
-	/// Write the UTC date time to the output
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
-	/// the current date and time in Universal time.
-	/// </para>
-	/// <para>
-	/// See the <see cref="DatePatternConverter"/> for details on the date pattern syntax.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="DatePatternConverter"/>
-	/// <author>Nicko Cadell</author>
-	internal class UtcDatePatternConverter : DatePatternConverter
-	{
-		/// <summary>
-		/// Write the current date and time to the output
-		/// </summary>
-		/// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
-		/// <param name="state">null, state is not set</param>
-		/// <remarks>
-		/// <para>
-		/// Pass the current date and time to the <see cref="IDateFormatter"/>
-		/// for it to render it to the writer.
-		/// </para>
-		/// <para>
-		/// The date is in Universal time when it is rendered.
-		/// </para>
-		/// </remarks>
-		/// <seealso cref="DatePatternConverter"/>
-		protected override void Convert(TextWriter writer, object state)
-		{
-			try 
-			{
-				m_dateFormatter.FormatDate(DateTime.UtcNow, writer);
-			}
-			catch (Exception ex) 
-			{
-				LogLog.Error(declaringType, "Error occurred while converting date.", ex);
-			}
-		}
+  /// <summary>
+  /// Write the UTC date time to the output
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Date pattern converter, uses a <see cref="IDateFormatter"/> to format 
+  /// the current date and time in Universal time.
+  /// </para>
+  /// <para>
+  /// See the <see cref="DatePatternConverter"/> for details on the date pattern syntax.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="DatePatternConverter"/>
+  /// <author>Nicko Cadell</author>
+  internal class UtcDatePatternConverter : DatePatternConverter
+  {
+    /// <summary>
+    /// Write the current date and time to the output
+    /// </summary>
+    /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
+    /// <param name="state">null, state is not set</param>
+    /// <remarks>
+    /// <para>
+    /// Pass the current date and time to the <see cref="IDateFormatter"/>
+    /// for it to render it to the writer.
+    /// </para>
+    /// <para>
+    /// The date is in Universal time when it is rendered.
+    /// </para>
+    /// </remarks>
+    /// <seealso cref="DatePatternConverter"/>
+    protected override void Convert(TextWriter writer, object state)
+    {
+      try
+      {
+        m_dateFormatter.FormatDate(DateTime.UtcNow, writer);
+      }
+      catch (Exception ex)
+      {
+        LogLog.Error(declaringType, "Error occurred while converting date.", ex);
+      }
+    }
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the UtcDatePatternConverter class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(UtcDatePatternConverter);
+    /// <summary>
+    /// The fully qualified type of the UtcDatePatternConverter class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(UtcDatePatternConverter);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/PropertiesDictionary.cs b/src/log4net/Util/PropertiesDictionary.cs
index e70fb20..6a37b60 100644
--- a/src/log4net/Util/PropertiesDictionary.cs
+++ b/src/log4net/Util/PropertiesDictionary.cs
@@ -23,311 +23,311 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// String keyed object map.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// While this collection is serializable only member 
-	/// objects that are serializable will
-	/// be serialized along with this collection.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-#if NETCF 
-	public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, IDictionary
+  /// <summary>
+  /// String keyed object map.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// While this collection is serializable only member 
+  /// objects that are serializable will
+  /// be serialized along with this collection.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+#if NETCF
+  public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, IDictionary
 #else
-	[Serializable]
-	public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, ISerializable, IDictionary
+  [Serializable]
+  public sealed class PropertiesDictionary : ReadOnlyPropertiesDictionary, ISerializable, IDictionary
 #endif
-	{
-		#region Public Instance Constructors
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="PropertiesDictionary" /> class.
-		/// </para>
-		/// </remarks>
-		public PropertiesDictionary()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="PropertiesDictionary" /> class.
+    /// </para>
+    /// </remarks>
+    public PropertiesDictionary()
+    {
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="propertiesDictionary">properties to copy</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="PropertiesDictionary" /> class.
-		/// </para>
-		/// </remarks>
-		public PropertiesDictionary(ReadOnlyPropertiesDictionary propertiesDictionary) : base(propertiesDictionary)
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="propertiesDictionary">properties to copy</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="PropertiesDictionary" /> class.
+    /// </para>
+    /// </remarks>
+    public PropertiesDictionary(ReadOnlyPropertiesDictionary propertiesDictionary) : base(propertiesDictionary)
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Private Instance Constructors
+    #region Private Instance Constructors
 
 #if !NETCF
-		/// <summary>
-		/// Initializes a new instance of the <see cref="PropertiesDictionary" /> class 
-		/// with serialized data.
-		/// </summary>
-		/// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
-		/// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
-		/// <remarks>
-		/// <para>
-		/// Because this class is sealed the serialization constructor is private.
-		/// </para>
-		/// </remarks>
-		private PropertiesDictionary(SerializationInfo info, StreamingContext context) : base(info, context)
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="PropertiesDictionary" /> class 
+    /// with serialized data.
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
+    /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
+    /// <remarks>
+    /// <para>
+    /// Because this class is sealed the serialization constructor is private.
+    /// </para>
+    /// </remarks>
+    private PropertiesDictionary(SerializationInfo info, StreamingContext context) : base(info, context)
+    {
+    }
 #endif
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the value of the  property with the specified key.
-		/// </summary>
-		/// <value>
-		/// The value of the property with the specified key.
-		/// </value>
-		/// <param name="key">The key of the property to get or set.</param>
-		/// <remarks>
-		/// <para>
-		/// The property value will only be serialized if it is serializable.
-		/// If it cannot be serialized it will be silently ignored if
-		/// a serialization operation is performed.
-		/// </para>
-		/// </remarks>
-		public override object this[string key]
-		{
-			get { return InnerHashtable[key]; }
-			set { InnerHashtable[key] = value; }
-		}
+    /// <summary>
+    /// Gets or sets the value of the  property with the specified key.
+    /// </summary>
+    /// <value>
+    /// The value of the property with the specified key.
+    /// </value>
+    /// <param name="key">The key of the property to get or set.</param>
+    /// <remarks>
+    /// <para>
+    /// The property value will only be serialized if it is serializable.
+    /// If it cannot be serialized it will be silently ignored if
+    /// a serialization operation is performed.
+    /// </para>
+    /// </remarks>
+    public override object this[string key]
+    {
+      get { return InnerHashtable[key]; }
+      set { InnerHashtable[key] = value; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Remove the entry with the specified key from this dictionary
-		/// </summary>
-		/// <param name="key">the key for the entry to remove</param>
-		/// <remarks>
-		/// <para>
-		/// Remove the entry with the specified key from this dictionary
-		/// </para>
-		/// </remarks>
-		public void Remove(string key)
-		{
-			InnerHashtable.Remove(key);
-		}
+    /// <summary>
+    /// Remove the entry with the specified key from this dictionary
+    /// </summary>
+    /// <param name="key">the key for the entry to remove</param>
+    /// <remarks>
+    /// <para>
+    /// Remove the entry with the specified key from this dictionary
+    /// </para>
+    /// </remarks>
+    public void Remove(string key)
+    {
+      InnerHashtable.Remove(key);
+    }
 
-		#endregion Public Instance Methods
+    #endregion Public Instance Methods
 
-		#region Implementation of IDictionary
+    #region Implementation of IDictionary
 
-		/// <summary>
-		/// See <see cref="IDictionary.GetEnumerator"/>
-		/// </summary>
-		/// <returns>an enumerator</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns a <see cref="IDictionaryEnumerator"/> over the contest of this collection.
-		/// </para>
-		/// </remarks>
-		IDictionaryEnumerator IDictionary.GetEnumerator()
-		{
-			return InnerHashtable.GetEnumerator();
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.GetEnumerator"/>
+    /// </summary>
+    /// <returns>an enumerator</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns a <see cref="IDictionaryEnumerator"/> over the contest of this collection.
+    /// </para>
+    /// </remarks>
+    IDictionaryEnumerator IDictionary.GetEnumerator()
+    {
+      return InnerHashtable.GetEnumerator();
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Remove"/>
-		/// </summary>
-		/// <param name="key">the key to remove</param>
-		/// <remarks>
-		/// <para>
-		/// Remove the entry with the specified key from this dictionary
-		/// </para>
-		/// </remarks>
-		void IDictionary.Remove(object key)
-		{
-			InnerHashtable.Remove(key);
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Remove"/>
+    /// </summary>
+    /// <param name="key">the key to remove</param>
+    /// <remarks>
+    /// <para>
+    /// Remove the entry with the specified key from this dictionary
+    /// </para>
+    /// </remarks>
+    void IDictionary.Remove(object key)
+    {
+      InnerHashtable.Remove(key);
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Contains"/>
-		/// </summary>
-		/// <param name="key">the key to lookup in the collection</param>
-		/// <returns><c>true</c> if the collection contains the specified key</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if this collection contains a specified key.
-		/// </para>
-		/// </remarks>
-		bool IDictionary.Contains(object key)
-		{
-			return InnerHashtable.Contains(key);
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Contains"/>
+    /// </summary>
+    /// <param name="key">the key to lookup in the collection</param>
+    /// <returns><c>true</c> if the collection contains the specified key</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if this collection contains a specified key.
+    /// </para>
+    /// </remarks>
+    bool IDictionary.Contains(object key)
+    {
+      return InnerHashtable.Contains(key);
+    }
 
-		/// <summary>
-		/// Remove all properties from the properties collection
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Remove all properties from the properties collection
-		/// </para>
-		/// </remarks>
-		public override void Clear()
-		{
-			InnerHashtable.Clear();
-		}
+    /// <summary>
+    /// Remove all properties from the properties collection
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Remove all properties from the properties collection
+    /// </para>
+    /// </remarks>
+    public override void Clear()
+    {
+      InnerHashtable.Clear();
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Add"/>
-		/// </summary>
-		/// <param name="key">the key</param>
-		/// <param name="value">the value to store for the key</param>
-		/// <remarks>
-		/// <para>
-		/// Store a value for the specified <see cref="String"/> <paramref name="key"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentException">Thrown if the <paramref name="key"/> is not a string</exception>
-		void IDictionary.Add(object key, object value)
-		{
-			if (!(key is string))
-			{
-				throw new ArgumentException("key must be a string", "key");
-			}
-			InnerHashtable.Add(key, value);
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Add"/>
+    /// </summary>
+    /// <param name="key">the key</param>
+    /// <param name="value">the value to store for the key</param>
+    /// <remarks>
+    /// <para>
+    /// Store a value for the specified <see cref="String"/> <paramref name="key"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentException">Thrown if the <paramref name="key"/> is not a string</exception>
+    void IDictionary.Add(object key, object value)
+    {
+      if (!(key is string))
+      {
+        throw new ArgumentException("key must be a string", "key");
+      }
+      InnerHashtable.Add(key, value);
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.IsReadOnly"/>
-		/// </summary>
-		/// <value>
-		/// <c>false</c>
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This collection is modifiable. This property always
-		/// returns <c>false</c>.
-		/// </para>
-		/// </remarks>
-		bool IDictionary.IsReadOnly
-		{
-			get { return false; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.IsReadOnly"/>
+    /// </summary>
+    /// <value>
+    /// <c>false</c>
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This collection is modifiable. This property always
+    /// returns <c>false</c>.
+    /// </para>
+    /// </remarks>
+    bool IDictionary.IsReadOnly
+    {
+      get { return false; }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.this"/>
-		/// </summary>
-		/// <value>
-		/// The value for the key specified.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Get or set a value for the specified <see cref="String"/> <paramref name="key"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentException">Thrown if the <paramref name="key"/> is not a string</exception>
-		object IDictionary.this[object key]
-		{
-			get
-			{
-				if (!(key is string))
-				{
-					throw new ArgumentException("key must be a string", "key");
-				}
-				return InnerHashtable[key];
-			}
-			set
-			{
-				if (!(key is string))
-				{
-					throw new ArgumentException("key must be a string", "key");
-				}
-				InnerHashtable[key] = value;
-			}
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.this"/>
+    /// </summary>
+    /// <value>
+    /// The value for the key specified.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Get or set a value for the specified <see cref="String"/> <paramref name="key"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentException">Thrown if the <paramref name="key"/> is not a string</exception>
+    object IDictionary.this[object key]
+    {
+      get
+      {
+        if (!(key is string))
+        {
+          throw new ArgumentException("key must be a string", "key");
+        }
+        return InnerHashtable[key];
+      }
+      set
+      {
+        if (!(key is string))
+        {
+          throw new ArgumentException("key must be a string", "key");
+        }
+        InnerHashtable[key] = value;
+      }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Values"/>
-		/// </summary>
-		ICollection IDictionary.Values
-		{
-			get { return InnerHashtable.Values; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Values"/>
+    /// </summary>
+    ICollection IDictionary.Values
+    {
+      get { return InnerHashtable.Values; }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Keys"/>
-		/// </summary>
-		ICollection IDictionary.Keys
-		{
-			get { return InnerHashtable.Keys; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Keys"/>
+    /// </summary>
+    ICollection IDictionary.Keys
+    {
+      get { return InnerHashtable.Keys; }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.IsFixedSize"/>
-		/// </summary>
-		bool IDictionary.IsFixedSize
-		{
-			get { return false; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.IsFixedSize"/>
+    /// </summary>
+    bool IDictionary.IsFixedSize
+    {
+      get { return false; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of ICollection
+    #region Implementation of ICollection
 
-		/// <summary>
-		/// See <see cref="ICollection.CopyTo"/>
-		/// </summary>
-		/// <param name="array"></param>
-		/// <param name="index"></param>
-		void ICollection.CopyTo(Array array, int index)
-		{
-			InnerHashtable.CopyTo(array, index);
-		}
+    /// <summary>
+    /// See <see cref="ICollection.CopyTo"/>
+    /// </summary>
+    /// <param name="array"></param>
+    /// <param name="index"></param>
+    void ICollection.CopyTo(Array array, int index)
+    {
+      InnerHashtable.CopyTo(array, index);
+    }
 
-		/// <summary>
-		/// See <see cref="ICollection.IsSynchronized"/>
-		/// </summary>
-		bool ICollection.IsSynchronized
-		{
-			get { return InnerHashtable.IsSynchronized; }
-		}
+    /// <summary>
+    /// See <see cref="ICollection.IsSynchronized"/>
+    /// </summary>
+    bool ICollection.IsSynchronized
+    {
+      get { return InnerHashtable.IsSynchronized; }
+    }
 
-		/// <summary>
-		/// See <see cref="ICollection.SyncRoot"/>
-		/// </summary>
-		object ICollection.SyncRoot
-		{
-			get { return InnerHashtable.SyncRoot; }
-		}
+    /// <summary>
+    /// See <see cref="ICollection.SyncRoot"/>
+    /// </summary>
+    object ICollection.SyncRoot
+    {
+      get { return InnerHashtable.SyncRoot; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IEnumerable
+    #region Implementation of IEnumerable
 
-		/// <summary>
-		/// See <see cref="IEnumerable.GetEnumerator"/>
-		/// </summary>
-		IEnumerator IEnumerable.GetEnumerator()
-		{
-			return ((IEnumerable)InnerHashtable).GetEnumerator();
-		}
+    /// <summary>
+    /// See <see cref="IEnumerable.GetEnumerator"/>
+    /// </summary>
+    IEnumerator IEnumerable.GetEnumerator()
+    {
+      return ((IEnumerable)InnerHashtable).GetEnumerator();
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
 
diff --git a/src/log4net/Util/PropertyEntry.cs b/src/log4net/Util/PropertyEntry.cs
index 3357d98..379a285 100644
--- a/src/log4net/Util/PropertyEntry.cs
+++ b/src/log4net/Util/PropertyEntry.cs
@@ -21,60 +21,60 @@
 
 namespace log4net.Util
 {
+  /// <summary>
+  /// A class to hold the key and data for a property set in the config file
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A class to hold the key and data for a property set in the config file
+  /// </para>
+  /// </remarks>
+  public class PropertyEntry
+  {
+    private string m_key = null;
+    private object m_value = null;
+
     /// <summary>
-    /// A class to hold the key and data for a property set in the config file
+    /// Property Key
     /// </summary>
+    /// <value>
+    /// Property Key
+    /// </value>
     /// <remarks>
     /// <para>
-    /// A class to hold the key and data for a property set in the config file
+    /// Property Key.
     /// </para>
     /// </remarks>
-    public class PropertyEntry
+    public string Key
     {
-        private string m_key = null;
-        private object m_value = null;
-
-        /// <summary>
-        /// Property Key
-        /// </summary>
-        /// <value>
-        /// Property Key
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Property Key.
-        /// </para>
-        /// </remarks>
-        public string Key
-        {
-            get { return m_key; }
-            set { m_key = value; }
-        }
-
-        /// <summary>
-        /// Property Value
-        /// </summary>
-        /// <value>
-        /// Property Value
-        /// </value>
-        /// <remarks>
-        /// <para>
-        /// Property Value.
-        /// </para>
-        /// </remarks>
-        public object Value
-        {
-            get { return m_value; }
-            set { m_value = value; }
-        }
-
-        /// <summary>
-        /// Override <c>Object.ToString</c> to return sensible debug info
-        /// </summary>
-        /// <returns>string info about this object</returns>
-        public override string ToString()
-        {
-            return "PropertyEntry(Key=" + m_key + ", Value=" + m_value + ")";
-        }
+      get { return m_key; }
+      set { m_key = value; }
     }
+
+    /// <summary>
+    /// Property Value
+    /// </summary>
+    /// <value>
+    /// Property Value
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Property Value.
+    /// </para>
+    /// </remarks>
+    public object Value
+    {
+      get { return m_value; }
+      set { m_value = value; }
+    }
+
+    /// <summary>
+    /// Override <c>Object.ToString</c> to return sensible debug info
+    /// </summary>
+    /// <returns>string info about this object</returns>
+    public override string ToString()
+    {
+      return "PropertyEntry(Key=" + m_key + ", Value=" + m_value + ")";
+    }
+  }
 }
diff --git a/src/log4net/Util/ProtectCloseTextWriter.cs b/src/log4net/Util/ProtectCloseTextWriter.cs
index a90f283..d0c2446 100644
--- a/src/log4net/Util/ProtectCloseTextWriter.cs
+++ b/src/log4net/Util/ProtectCloseTextWriter.cs
@@ -25,69 +25,69 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// A <see cref="TextWriter"/> that ignores the <see cref="Close"/> message
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This writer is used in special cases where it is necessary 
-	/// to protect a writer from being closed by a client.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class ProtectCloseTextWriter : TextWriterAdapter
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// A <see cref="TextWriter"/> that ignores the <see cref="Close"/> message
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This writer is used in special cases where it is necessary 
+  /// to protect a writer from being closed by a client.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class ProtectCloseTextWriter : TextWriterAdapter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="writer">the writer to actually write to</param>
-		/// <remarks>
-		/// <para>
-		/// Create a new ProtectCloseTextWriter using a writer
-		/// </para>
-		/// </remarks>
-		public ProtectCloseTextWriter(TextWriter writer) : base(writer)
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="writer">the writer to actually write to</param>
+    /// <remarks>
+    /// <para>
+    /// Create a new ProtectCloseTextWriter using a writer
+    /// </para>
+    /// </remarks>
+    public ProtectCloseTextWriter(TextWriter writer) : base(writer)
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Properties
+    #region Public Properties
 
-		/// <summary>
-		/// Attach this instance to a different underlying <see cref="TextWriter"/>
-		/// </summary>
-		/// <param name="writer">the writer to attach to</param>
-		/// <remarks>
-		/// <para>
-		/// Attach this instance to a different underlying <see cref="TextWriter"/>
-		/// </para>
-		/// </remarks>
-		public void Attach(TextWriter writer)
-		{
-			this.Writer = writer;
-		}
+    /// <summary>
+    /// Attach this instance to a different underlying <see cref="TextWriter"/>
+    /// </summary>
+    /// <param name="writer">the writer to attach to</param>
+    /// <remarks>
+    /// <para>
+    /// Attach this instance to a different underlying <see cref="TextWriter"/>
+    /// </para>
+    /// </remarks>
+    public void Attach(TextWriter writer)
+    {
+      this.Writer = writer;
+    }
 
-		#endregion
+    #endregion
 
-		#region Override Implementation of TextWriter
+    #region Override Implementation of TextWriter
 
-		/// <summary>
-		/// Does not close the underlying output writer.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Does not close the underlying output writer.
-		/// This method does nothing.
-		/// </para>
-		/// </remarks>
-		public override void Close()
-		{
-			// do nothing
-		}
+    /// <summary>
+    /// Does not close the underlying output writer.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Does not close the underlying output writer.
+    /// This method does nothing.
+    /// </para>
+    /// </remarks>
+    public override void Close()
+    {
+      // do nothing
+    }
 
-		#endregion Public Instance Methods
-	}
+    #endregion Public Instance Methods
+  }
 }
diff --git a/src/log4net/Util/QuietTextWriter.cs b/src/log4net/Util/QuietTextWriter.cs
index 6f3c757..884ce4b 100644
--- a/src/log4net/Util/QuietTextWriter.cs
+++ b/src/log4net/Util/QuietTextWriter.cs
@@ -24,182 +24,182 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// <see cref="TextWriter"/> that does not leak exceptions
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <see cref="QuietTextWriter"/> does not throw exceptions when things go wrong. 
-	/// Instead, it delegates error handling to its <see cref="IErrorHandler"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public class QuietTextWriter : TextWriterAdapter
-	{
-		#region Public Instance Constructors
+  /// <summary>
+  /// <see cref="TextWriter"/> that does not leak exceptions
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <see cref="QuietTextWriter"/> does not throw exceptions when things go wrong. 
+  /// Instead, it delegates error handling to its <see cref="IErrorHandler"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public class QuietTextWriter : TextWriterAdapter
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="writer">the writer to actually write to</param>
-		/// <param name="errorHandler">the error handler to report error to</param>
-		/// <remarks>
-		/// <para>
-		/// Create a new QuietTextWriter using a writer and error handler
-		/// </para>
-		/// </remarks>
-		public QuietTextWriter(TextWriter writer, IErrorHandler errorHandler) : base(writer)
-		{
-			if (errorHandler == null)
-			{
-				throw new ArgumentNullException("errorHandler");
-			}
-			ErrorHandler = errorHandler;
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="writer">the writer to actually write to</param>
+    /// <param name="errorHandler">the error handler to report error to</param>
+    /// <remarks>
+    /// <para>
+    /// Create a new QuietTextWriter using a writer and error handler
+    /// </para>
+    /// </remarks>
+    public QuietTextWriter(TextWriter writer, IErrorHandler errorHandler) : base(writer)
+    {
+      if (errorHandler == null)
+      {
+        throw new ArgumentNullException("errorHandler");
+      }
+      ErrorHandler = errorHandler;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the error handler that all errors are passed to.
-		/// </summary>
-		/// <value>
-		/// The error handler that all errors are passed to.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the error handler that all errors are passed to.
-		/// </para>
-		/// </remarks>
-		public IErrorHandler ErrorHandler
-		{
-			get { return m_errorHandler; }
-			set
-			{
-				if (value == null)
-				{
-					// This is a programming error on the part of the enclosing appender.
-					throw new ArgumentNullException("value");
-				}
-				m_errorHandler = value;
-			}
-		}	
+    /// <summary>
+    /// Gets or sets the error handler that all errors are passed to.
+    /// </summary>
+    /// <value>
+    /// The error handler that all errors are passed to.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the error handler that all errors are passed to.
+    /// </para>
+    /// </remarks>
+    public IErrorHandler ErrorHandler
+    {
+      get { return m_errorHandler; }
+      set
+      {
+        if (value == null)
+        {
+          // This is a programming error on the part of the enclosing appender.
+          throw new ArgumentNullException("value");
+        }
+        m_errorHandler = value;
+      }
+    }
 
-		/// <summary>
-		/// Gets a value indicating whether this writer is closed.
-		/// </summary>
-		/// <value>
-		/// <c>true</c> if this writer is closed, otherwise <c>false</c>.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets a value indicating whether this writer is closed.
-		/// </para>
-		/// </remarks>
-		public bool Closed
-		{
-			get { return m_closed; }
-		}
+    /// <summary>
+    /// Gets a value indicating whether this writer is closed.
+    /// </summary>
+    /// <value>
+    /// <c>true</c> if this writer is closed, otherwise <c>false</c>.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets a value indicating whether this writer is closed.
+    /// </para>
+    /// </remarks>
+    public bool Closed
+    {
+      get { return m_closed; }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Override Implementation of TextWriter
+    #region Override Implementation of TextWriter
 
-		/// <summary>
-		/// Writes a character to the underlying writer
-		/// </summary>
-		/// <param name="value">the char to write</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a character to the underlying writer
-		/// </para>
-		/// </remarks>
-		public override void Write(char value) 
-		{
-			try 
-			{
-				base.Write(value);
-			} 
-			catch(Exception e) 
-			{
-				m_errorHandler.Error("Failed to write [" + value + "].", e, ErrorCode.WriteFailure);
-			}
-		}
-    
-		/// <summary>
-		/// Writes a buffer to the underlying writer
-		/// </summary>
-		/// <param name="buffer">the buffer to write</param>
-		/// <param name="index">the start index to write from</param>
-		/// <param name="count">the number of characters to write</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a buffer to the underlying writer
-		/// </para>
-		/// </remarks>
-		public override void Write(char[] buffer, int index, int count) 
-		{
-			try 
-			{
-				base.Write(buffer, index, count);
-			} 
-			catch(Exception e) 
-			{
-				m_errorHandler.Error("Failed to write buffer.", e, ErrorCode.WriteFailure);
-			}
-		}
-    
-		/// <summary>
-		/// Writes a string to the output.
-		/// </summary>
-		/// <param name="value">The string data to write to the output.</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a string to the output.
-		/// </para>
-		/// </remarks>
-		public override void Write(string value) 
-		{
-			try 
-			{
-				base.Write(value);
-			} 
-			catch(Exception e) 
-			{
-				m_errorHandler.Error("Failed to write [" + value + "].", e, ErrorCode.WriteFailure);
-			}
-		}
+    /// <summary>
+    /// Writes a character to the underlying writer
+    /// </summary>
+    /// <param name="value">the char to write</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a character to the underlying writer
+    /// </para>
+    /// </remarks>
+    public override void Write(char value)
+    {
+      try
+      {
+        base.Write(value);
+      }
+      catch (Exception e)
+      {
+        m_errorHandler.Error("Failed to write [" + value + "].", e, ErrorCode.WriteFailure);
+      }
+    }
 
-		/// <summary>
-		/// Closes the underlying output writer.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Closes the underlying output writer.
-		/// </para>
-		/// </remarks>
-		public override void Close()
-		{
-			m_closed = true;
-			base.Close();
-		}
+    /// <summary>
+    /// Writes a buffer to the underlying writer
+    /// </summary>
+    /// <param name="buffer">the buffer to write</param>
+    /// <param name="index">the start index to write from</param>
+    /// <param name="count">the number of characters to write</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a buffer to the underlying writer
+    /// </para>
+    /// </remarks>
+    public override void Write(char[] buffer, int index, int count)
+    {
+      try
+      {
+        base.Write(buffer, index, count);
+      }
+      catch (Exception e)
+      {
+        m_errorHandler.Error("Failed to write buffer.", e, ErrorCode.WriteFailure);
+      }
+    }
 
-		#endregion Public Instance Methods
+    /// <summary>
+    /// Writes a string to the output.
+    /// </summary>
+    /// <param name="value">The string data to write to the output.</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a string to the output.
+    /// </para>
+    /// </remarks>
+    public override void Write(string value)
+    {
+      try
+      {
+        base.Write(value);
+      }
+      catch (Exception e)
+      {
+        m_errorHandler.Error("Failed to write [" + value + "].", e, ErrorCode.WriteFailure);
+      }
+    }
 
-		#region Private Instance Fields
+    /// <summary>
+    /// Closes the underlying output writer.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Closes the underlying output writer.
+    /// </para>
+    /// </remarks>
+    public override void Close()
+    {
+      m_closed = true;
+      base.Close();
+    }
 
-		/// <summary>
-		/// The error handler instance to pass all errors to
-		/// </summary>
-		private IErrorHandler m_errorHandler;
+    #endregion Public Instance Methods
 
-		/// <summary>
-		/// Flag to indicate if this writer is closed
-		/// </summary>
-		private bool m_closed = false;
+    #region Private Instance Fields
 
-		#endregion Private Instance Fields
-	}
+    /// <summary>
+    /// The error handler instance to pass all errors to
+    /// </summary>
+    private IErrorHandler m_errorHandler;
+
+    /// <summary>
+    /// Flag to indicate if this writer is closed
+    /// </summary>
+    private bool m_closed = false;
+
+    #endregion Private Instance Fields
+  }
 }
diff --git a/src/log4net/Util/ReadOnlyPropertiesDictionary.cs b/src/log4net/Util/ReadOnlyPropertiesDictionary.cs
index be37baf..c59be90 100644
--- a/src/log4net/Util/ReadOnlyPropertiesDictionary.cs
+++ b/src/log4net/Util/ReadOnlyPropertiesDictionary.cs
@@ -27,373 +27,374 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// String keyed object map that is read only.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This collection is readonly and cannot be modified.
-	/// </para>
-	/// <para>
-	/// While this collection is serializable only member 
-	/// objects that are serializable will
-	/// be serialized along with this collection.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// String keyed object map that is read only.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This collection is readonly and cannot be modified.
+  /// </para>
+  /// <para>
+  /// While this collection is serializable only member 
+  /// objects that are serializable will
+  /// be serialized along with this collection.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if NETCF
-	public class ReadOnlyPropertiesDictionary : IDictionary
+  public class ReadOnlyPropertiesDictionary : IDictionary
 #else
-	[Serializable] public class ReadOnlyPropertiesDictionary : ISerializable, IDictionary
+  [Serializable]
+  public class ReadOnlyPropertiesDictionary : ISerializable, IDictionary
 #endif
-	{
-		#region Private Instance Fields
+  {
+    #region Private Instance Fields
 
-		/// <summary>
-		/// The Hashtable used to store the properties data
-		/// </summary>
-		private readonly Hashtable m_hashtable = new Hashtable();
+    /// <summary>
+    /// The Hashtable used to store the properties data
+    /// </summary>
+    private readonly Hashtable m_hashtable = new Hashtable();
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ReadOnlyPropertiesDictionary" /> class.
-		/// </para>
-		/// </remarks>
-		public ReadOnlyPropertiesDictionary()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ReadOnlyPropertiesDictionary" /> class.
+    /// </para>
+    /// </remarks>
+    public ReadOnlyPropertiesDictionary()
+    {
+    }
 
-		/// <summary>
-		/// Copy Constructor
-		/// </summary>
-		/// <param name="propertiesDictionary">properties to copy</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ReadOnlyPropertiesDictionary" /> class.
-		/// </para>
-		/// </remarks>
-		public ReadOnlyPropertiesDictionary(ReadOnlyPropertiesDictionary propertiesDictionary)
-		{
-			foreach(DictionaryEntry entry in propertiesDictionary)
-			{
-				InnerHashtable.Add(entry.Key, entry.Value);
-			}
-		}
+    /// <summary>
+    /// Copy Constructor
+    /// </summary>
+    /// <param name="propertiesDictionary">properties to copy</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ReadOnlyPropertiesDictionary" /> class.
+    /// </para>
+    /// </remarks>
+    public ReadOnlyPropertiesDictionary(ReadOnlyPropertiesDictionary propertiesDictionary)
+    {
+      foreach (DictionaryEntry entry in propertiesDictionary)
+      {
+        InnerHashtable.Add(entry.Key, entry.Value);
+      }
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Private Instance Constructors
+    #region Private Instance Constructors
 
 #if !NETCF
-		/// <summary>
-		/// Deserialization constructor
-		/// </summary>
-		/// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
-		/// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ReadOnlyPropertiesDictionary" /> class 
-		/// with serialized data.
-		/// </para>
-		/// </remarks>
-		protected ReadOnlyPropertiesDictionary(SerializationInfo info, StreamingContext context)
-		{
-			foreach(var entry in info)
-			{
-				// The keys are stored as Xml encoded names
-				InnerHashtable[XmlConvert.DecodeName(entry.Name)] = entry.Value;
-			}
-		}
+    /// <summary>
+    /// Deserialization constructor
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data.</param>
+    /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ReadOnlyPropertiesDictionary" /> class 
+    /// with serialized data.
+    /// </para>
+    /// </remarks>
+    protected ReadOnlyPropertiesDictionary(SerializationInfo info, StreamingContext context)
+    {
+      foreach (var entry in info)
+      {
+        // The keys are stored as Xml encoded names
+        InnerHashtable[XmlConvert.DecodeName(entry.Name)] = entry.Value;
+      }
+    }
 #endif
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the key names.
-		/// </summary>
-		/// <returns>An array of all the keys.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the key names.
-		/// </para>
-		/// </remarks>
-		public string[] GetKeys()
-		{
-			var keys = new String[InnerHashtable.Count];
-			InnerHashtable.Keys.CopyTo(keys, 0);
-			return keys;
-		}
+    /// <summary>
+    /// Gets the key names.
+    /// </summary>
+    /// <returns>An array of all the keys.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the key names.
+    /// </para>
+    /// </remarks>
+    public string[] GetKeys()
+    {
+      var keys = new String[InnerHashtable.Count];
+      InnerHashtable.Keys.CopyTo(keys, 0);
+      return keys;
+    }
 
-		/// <summary>
-		/// Gets or sets the value of the  property with the specified key.
-		/// </summary>
-		/// <value>
-		/// The value of the property with the specified key.
-		/// </value>
-		/// <param name="key">The key of the property to get or set.</param>
-		/// <remarks>
-		/// <para>
-		/// The property value will only be serialized if it is serializable.
-		/// If it cannot be serialized it will be silently ignored if
-		/// a serialization operation is performed.
-		/// </para>
-		/// </remarks>
-		public virtual object this[string key]
-		{
-			get { return InnerHashtable[key]; }
-			set { throw new NotSupportedException("This is a Read Only Dictionary and can not be modified"); }
-		}
+    /// <summary>
+    /// Gets or sets the value of the  property with the specified key.
+    /// </summary>
+    /// <value>
+    /// The value of the property with the specified key.
+    /// </value>
+    /// <param name="key">The key of the property to get or set.</param>
+    /// <remarks>
+    /// <para>
+    /// The property value will only be serialized if it is serializable.
+    /// If it cannot be serialized it will be silently ignored if
+    /// a serialization operation is performed.
+    /// </para>
+    /// </remarks>
+    public virtual object this[string key]
+    {
+      get { return InnerHashtable[key]; }
+      set { throw new NotSupportedException("This is a Read Only Dictionary and can not be modified"); }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Test if the dictionary contains a specified key
-		/// </summary>
-		/// <param name="key">the key to look for</param>
-		/// <returns>true if the dictionary contains the specified key</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if the dictionary contains a specified key
-		/// </para>
-		/// </remarks>
-		public bool Contains(string key)
-		{
-			return InnerHashtable.Contains(key);
-		}
+    /// <summary>
+    /// Test if the dictionary contains a specified key
+    /// </summary>
+    /// <param name="key">the key to look for</param>
+    /// <returns>true if the dictionary contains the specified key</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if the dictionary contains a specified key
+    /// </para>
+    /// </remarks>
+    public bool Contains(string key)
+    {
+      return InnerHashtable.Contains(key);
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// The hashtable used to store the properties
-		/// </summary>
-		/// <value>
-		/// The internal collection used to store the properties
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The hashtable used to store the properties
-		/// </para>
-		/// </remarks>
-		protected Hashtable InnerHashtable
-		{
-			get { return m_hashtable; }
-		}
+    /// <summary>
+    /// The hashtable used to store the properties
+    /// </summary>
+    /// <value>
+    /// The internal collection used to store the properties
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The hashtable used to store the properties
+    /// </para>
+    /// </remarks>
+    protected Hashtable InnerHashtable
+    {
+      get { return m_hashtable; }
+    }
 
-		#region Implementation of ISerializable
+    #region Implementation of ISerializable
 
 #if !NETCF
-		/// <summary>
-		/// Serializes this object into the <see cref="SerializationInfo" /> provided.
-		/// </summary>
-		/// <param name="info">The <see cref="SerializationInfo" /> to populate with data.</param>
-		/// <param name="context">The destination for this serialization.</param>
-		/// <remarks>
-		/// <para>
-		/// Serializes this object into the <see cref="SerializationInfo" /> provided.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Serializes this object into the <see cref="SerializationInfo" /> provided.
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> to populate with data.</param>
+    /// <param name="context">The destination for this serialization.</param>
+    /// <remarks>
+    /// <para>
+    /// Serializes this object into the <see cref="SerializationInfo" /> provided.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0 || NETSTANDARD
         [System.Security.SecurityCritical]
 #endif
 #if !NETCF && !NETSTANDARD1_3
-		[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, SerializationFormatter = true)]
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, SerializationFormatter = true)]
 #endif
-        public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
-		{
-			foreach(DictionaryEntry entry in InnerHashtable.Clone() as IDictionary)
-			{
-				var entryKey = entry.Key as string;
-				if (entryKey is null)
-				{
-					continue;
-				}
+    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
+    {
+      foreach (DictionaryEntry entry in InnerHashtable.Clone() as IDictionary)
+      {
+        var entryKey = entry.Key as string;
+        if (entryKey is null)
+        {
+          continue;
+        }
 
-				var entryValue = entry.Value;
+        var entryValue = entry.Value;
 
-                // If value is serializable then we add it to the list
+        // If value is serializable then we add it to the list
 #if NETSTANDARD1_3
                 var isSerializable = entryValue?.GetType().GetTypeInfo().IsSerializable ?? false;
 #else
-                var isSerializable = entryValue?.GetType().IsSerializable ?? false;
+        var isSerializable = entryValue?.GetType().IsSerializable ?? false;
 #endif
-				if (!isSerializable)
-				{
-					continue;
-				}
+        if (!isSerializable)
+        {
+          continue;
+        }
 
-				// Store the keys as an Xml encoded local name as it may contain colons (':') 
-				// which are NOT escaped by the Xml Serialization framework.
-				// This must be a bug in the serialization framework as we cannot be expected
-				// to know the implementation details of all the possible transport layers.
-				var localKeyName = XmlConvert.EncodeLocalName(entryKey);
-				if (localKeyName is not null)
-				{
-					info.AddValue(localKeyName, entryValue);
-				}
-			}
-		}
+        // Store the keys as an Xml encoded local name as it may contain colons (':') 
+        // which are NOT escaped by the Xml Serialization framework.
+        // This must be a bug in the serialization framework as we cannot be expected
+        // to know the implementation details of all the possible transport layers.
+        var localKeyName = XmlConvert.EncodeLocalName(entryKey);
+        if (localKeyName is not null)
+        {
+          info.AddValue(localKeyName, entryValue);
+        }
+      }
+    }
 #endif
 
-		#endregion Implementation of ISerializable
+    #endregion Implementation of ISerializable
 
-		#region Implementation of IDictionary
+    #region Implementation of IDictionary
 
-		/// <summary>
-		/// See <see cref="IDictionary.GetEnumerator"/>
-		/// </summary>
-		IDictionaryEnumerator IDictionary.GetEnumerator()
-		{
-			return InnerHashtable.GetEnumerator();
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.GetEnumerator"/>
+    /// </summary>
+    IDictionaryEnumerator IDictionary.GetEnumerator()
+    {
+      return InnerHashtable.GetEnumerator();
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Remove"/>
-		/// </summary>
-		/// <param name="key"></param>
-		void IDictionary.Remove(object key)
-		{
-			throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Remove"/>
+    /// </summary>
+    /// <param name="key"></param>
+    void IDictionary.Remove(object key)
+    {
+      throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Contains"/>
-		/// </summary>
-		/// <param name="key"></param>
-		/// <returns></returns>
-		bool IDictionary.Contains(object key)
-		{
-			return InnerHashtable.Contains(key);
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Contains"/>
+    /// </summary>
+    /// <param name="key"></param>
+    /// <returns></returns>
+    bool IDictionary.Contains(object key)
+    {
+      return InnerHashtable.Contains(key);
+    }
 
-		/// <summary>
-		/// Remove all properties from the properties collection
-		/// </summary>
-		public virtual void Clear()
-		{
-			throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
-		}
+    /// <summary>
+    /// Remove all properties from the properties collection
+    /// </summary>
+    public virtual void Clear()
+    {
+      throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Add"/>
-		/// </summary>
-		/// <param name="key"></param>
-		/// <param name="value"></param>
-		void IDictionary.Add(object key, object value)
-		{
-			throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Add"/>
+    /// </summary>
+    /// <param name="key"></param>
+    /// <param name="value"></param>
+    void IDictionary.Add(object key, object value)
+    {
+      throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.IsReadOnly"/>
-		/// </summary>
-		bool IDictionary.IsReadOnly
-		{
-			get { return true; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.IsReadOnly"/>
+    /// </summary>
+    bool IDictionary.IsReadOnly
+    {
+      get { return true; }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.this[object]"/>
-		/// </summary>
-		object IDictionary.this[object key]
-		{
-			get
-			{
-				if (!(key is string)) throw new ArgumentException("key must be a string");
-				return InnerHashtable[key];
-			}
-			set
-			{
-				throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
-			}
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.this[object]"/>
+    /// </summary>
+    object IDictionary.this[object key]
+    {
+      get
+      {
+        if (!(key is string)) throw new ArgumentException("key must be a string");
+        return InnerHashtable[key];
+      }
+      set
+      {
+        throw new NotSupportedException("This is a Read Only Dictionary and can not be modified");
+      }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Values"/>
-		/// </summary>
-		ICollection IDictionary.Values
-		{
-			get { return InnerHashtable.Values; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Values"/>
+    /// </summary>
+    ICollection IDictionary.Values
+    {
+      get { return InnerHashtable.Values; }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.Keys"/>
-		/// </summary>
-		ICollection IDictionary.Keys
-		{
-			get { return InnerHashtable.Keys; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.Keys"/>
+    /// </summary>
+    ICollection IDictionary.Keys
+    {
+      get { return InnerHashtable.Keys; }
+    }
 
-		/// <summary>
-		/// See <see cref="IDictionary.IsFixedSize"/>
-		/// </summary>
-		bool IDictionary.IsFixedSize
-		{
-			get { return InnerHashtable.IsFixedSize; }
-		}
+    /// <summary>
+    /// See <see cref="IDictionary.IsFixedSize"/>
+    /// </summary>
+    bool IDictionary.IsFixedSize
+    {
+      get { return InnerHashtable.IsFixedSize; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of ICollection
+    #region Implementation of ICollection
 
-		/// <summary>
-		/// See <see cref="ICollection.CopyTo"/>
-		/// </summary>
-		/// <param name="array"></param>
-		/// <param name="index"></param>
-		void ICollection.CopyTo(Array array, int index)
-		{
-			InnerHashtable.CopyTo(array, index);
-		}
+    /// <summary>
+    /// See <see cref="ICollection.CopyTo"/>
+    /// </summary>
+    /// <param name="array"></param>
+    /// <param name="index"></param>
+    void ICollection.CopyTo(Array array, int index)
+    {
+      InnerHashtable.CopyTo(array, index);
+    }
 
-		/// <summary>
-		/// See <see cref="ICollection.IsSynchronized"/>
-		/// </summary>
-		bool ICollection.IsSynchronized
-		{
-			get { return InnerHashtable.IsSynchronized; }
-		}
+    /// <summary>
+    /// See <see cref="ICollection.IsSynchronized"/>
+    /// </summary>
+    bool ICollection.IsSynchronized
+    {
+      get { return InnerHashtable.IsSynchronized; }
+    }
 
-		/// <summary>
-		/// The number of properties in this collection
-		/// </summary>
-		public int Count
-		{
-			get { return InnerHashtable.Count; }
-		}
+    /// <summary>
+    /// The number of properties in this collection
+    /// </summary>
+    public int Count
+    {
+      get { return InnerHashtable.Count; }
+    }
 
-		/// <summary>
-		/// See <see cref="ICollection.SyncRoot"/>
-		/// </summary>
-		object ICollection.SyncRoot
-		{
-			get { return InnerHashtable.SyncRoot; }
-		}
+    /// <summary>
+    /// See <see cref="ICollection.SyncRoot"/>
+    /// </summary>
+    object ICollection.SyncRoot
+    {
+      get { return InnerHashtable.SyncRoot; }
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IEnumerable
+    #region Implementation of IEnumerable
 
-		/// <summary>
-		/// See <see cref="IEnumerable.GetEnumerator"/>
-		/// </summary>
-		IEnumerator IEnumerable.GetEnumerator()
-		{
-			return ((IEnumerable)InnerHashtable).GetEnumerator();
-		}
+    /// <summary>
+    /// See <see cref="IEnumerable.GetEnumerator"/>
+    /// </summary>
+    IEnumerator IEnumerable.GetEnumerator()
+    {
+      return ((IEnumerable)InnerHashtable).GetEnumerator();
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
 
diff --git a/src/log4net/Util/ReaderWriterLock.cs b/src/log4net/Util/ReaderWriterLock.cs
index 3c70b9d..abac458 100644
--- a/src/log4net/Util/ReaderWriterLock.cs
+++ b/src/log4net/Util/ReaderWriterLock.cs
@@ -28,164 +28,164 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Defines a lock that supports single writers and multiple readers
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// <c>ReaderWriterLock</c> is used to synchronize access to a resource. 
-	/// At any given time, it allows either concurrent read access for 
-	/// multiple threads, or write access for a single thread. In a 
-	/// situation where a resource is changed infrequently, a 
-	/// <c>ReaderWriterLock</c> provides better throughput than a simple 
-	/// one-at-a-time lock, such as <see cref="System.Threading.Monitor"/>.
-	/// </para>
-	/// <para>
-	/// If a platform does not support a <c>System.Threading.ReaderWriterLock</c> 
-	/// implementation then all readers and writers are serialized. Therefore 
-	/// the caller must not rely on multiple simultaneous readers.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class ReaderWriterLock
-	{
-		#region Instance Constructors
+  /// <summary>
+  /// Defines a lock that supports single writers and multiple readers
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// <c>ReaderWriterLock</c> is used to synchronize access to a resource. 
+  /// At any given time, it allows either concurrent read access for 
+  /// multiple threads, or write access for a single thread. In a 
+  /// situation where a resource is changed infrequently, a 
+  /// <c>ReaderWriterLock</c> provides better throughput than a simple 
+  /// one-at-a-time lock, such as <see cref="System.Threading.Monitor"/>.
+  /// </para>
+  /// <para>
+  /// If a platform does not support a <c>System.Threading.ReaderWriterLock</c> 
+  /// implementation then all readers and writers are serialized. Therefore 
+  /// the caller must not rely on multiple simultaneous readers.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class ReaderWriterLock
+  {
+    #region Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ReaderWriterLock" /> class.
-		/// </para>
-		/// </remarks>
-		public ReaderWriterLock()
-		{
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ReaderWriterLock" /> class.
+    /// </para>
+    /// </remarks>
+    public ReaderWriterLock()
+    {
 
 #if HAS_READERWRITERLOCK
 #if HAS_READERWRITERLOCKSLIM
-			m_lock = new System.Threading.ReaderWriterLockSlim(System.Threading.LockRecursionPolicy.SupportsRecursion);
+      m_lock = new System.Threading.ReaderWriterLockSlim(System.Threading.LockRecursionPolicy.SupportsRecursion);
 #else
-			m_lock = new System.Threading.ReaderWriterLock();
+      m_lock = new System.Threading.ReaderWriterLock();
 #endif
 #endif
-		}
+    }
 
-		#endregion Private Instance Constructors
-  
-		#region Public Methods
+    #endregion Private Instance Constructors
 
-		/// <summary>
-		/// Acquires a reader lock
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <see cref="AcquireReaderLock"/> blocks if a different thread has the writer 
-		/// lock, or if at least one thread is waiting for the writer lock.
-		/// </para>
-		/// </remarks>
-		public void AcquireReaderLock()
-		{
+    #region Public Methods
+
+    /// <summary>
+    /// Acquires a reader lock
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <see cref="AcquireReaderLock"/> blocks if a different thread has the writer 
+    /// lock, or if at least one thread is waiting for the writer lock.
+    /// </para>
+    /// </remarks>
+    public void AcquireReaderLock()
+    {
 #if HAS_READERWRITERLOCK
 #if HAS_READERWRITERLOCKSLIM
                     // prevent ThreadAbort while updating state, see https://issues.apache.org/jira/browse/LOG4NET-443
                     try { } 
                     finally
                     {
-			m_lock.EnterReadLock();
+      m_lock.EnterReadLock();
                     }
 #else
-			m_lock.AcquireReaderLock(-1);
+      m_lock.AcquireReaderLock(-1);
 #endif
 #else
-			System.Threading.Monitor.Enter(this);
+      System.Threading.Monitor.Enter(this);
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Decrements the lock count
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// <see cref="ReleaseReaderLock"/> decrements the lock count. When the count 
-		/// reaches zero, the lock is released.
-		/// </para>
-		/// </remarks>
-		public void ReleaseReaderLock()
-		{
+    /// <summary>
+    /// Decrements the lock count
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// <see cref="ReleaseReaderLock"/> decrements the lock count. When the count 
+    /// reaches zero, the lock is released.
+    /// </para>
+    /// </remarks>
+    public void ReleaseReaderLock()
+    {
 #if HAS_READERWRITERLOCK
 #if HAS_READERWRITERLOCKSLIM
-			m_lock.ExitReadLock();
+      m_lock.ExitReadLock();
 #else
-			m_lock.ReleaseReaderLock();
+      m_lock.ReleaseReaderLock();
 
 #endif
 #else
-			System.Threading.Monitor.Exit(this);
+      System.Threading.Monitor.Exit(this);
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Acquires the writer lock
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This method blocks if another thread has a reader lock or writer lock.
-		/// </para>
-		/// </remarks>
-		public void AcquireWriterLock()
-		{
+    /// <summary>
+    /// Acquires the writer lock
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This method blocks if another thread has a reader lock or writer lock.
+    /// </para>
+    /// </remarks>
+    public void AcquireWriterLock()
+    {
 #if HAS_READERWRITERLOCK
 #if HAS_READERWRITERLOCKSLIM
                     // prevent ThreadAbort while updating state, see https://issues.apache.org/jira/browse/LOG4NET-443
                     try { } 
                     finally
                     {
-			m_lock.EnterWriteLock();
+      m_lock.EnterWriteLock();
                     }
 #else
-			m_lock.AcquireWriterLock(-1);
+      m_lock.AcquireWriterLock(-1);
 #endif
 #else
-			System.Threading.Monitor.Enter(this);
+      System.Threading.Monitor.Enter(this);
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Decrements the lock count on the writer lock
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// ReleaseWriterLock decrements the writer lock count. 
-		/// When the count reaches zero, the writer lock is released.
-		/// </para>
-		/// </remarks>
-		public void ReleaseWriterLock()
-		{
+    /// <summary>
+    /// Decrements the lock count on the writer lock
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// ReleaseWriterLock decrements the writer lock count. 
+    /// When the count reaches zero, the writer lock is released.
+    /// </para>
+    /// </remarks>
+    public void ReleaseWriterLock()
+    {
 #if HAS_READERWRITERLOCK
 #if HAS_READERWRITERLOCKSLIM
-			m_lock.ExitWriteLock();
+      m_lock.ExitWriteLock();
 #else
-			m_lock.ReleaseWriterLock();
+      m_lock.ReleaseWriterLock();
 #endif
 #else
-			System.Threading.Monitor.Exit(this);
+      System.Threading.Monitor.Exit(this);
 #endif
-		}
+    }
 
-		#endregion Public Methods
+    #endregion Public Methods
 
-		#region Private Members
+    #region Private Members
 
 #if HAS_READERWRITERLOCK
 #if HAS_READERWRITERLOCKSLIM
-		private System.Threading.ReaderWriterLockSlim m_lock;
+    private System.Threading.ReaderWriterLockSlim m_lock;
 #else
-		private System.Threading.ReaderWriterLock m_lock;
+    private System.Threading.ReaderWriterLock m_lock;
 #endif
 
 #endif
 
-		#endregion
-	}
+    #endregion
+  }
 }
\ No newline at end of file
diff --git a/src/log4net/Util/ReusableStringWriter.cs b/src/log4net/Util/ReusableStringWriter.cs
index 8c1aad1..f335e2c 100644
--- a/src/log4net/Util/ReusableStringWriter.cs
+++ b/src/log4net/Util/ReusableStringWriter.cs
@@ -23,72 +23,72 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// A <see cref="StringWriter"/> that can be <see cref="Reset"/> and reused
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// A <see cref="StringWriter"/> that can be <see cref="Reset"/> and reused.
-	/// This uses a single buffer for string operations.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public class ReusableStringWriter : StringWriter
-	{
-		#region Constructor
+  /// <summary>
+  /// A <see cref="StringWriter"/> that can be <see cref="Reset"/> and reused
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// A <see cref="StringWriter"/> that can be <see cref="Reset"/> and reused.
+  /// This uses a single buffer for string operations.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public class ReusableStringWriter : StringWriter
+  {
+    #region Constructor
 
-		/// <summary>
-		/// Create an instance of <see cref="ReusableStringWriter"/>
-		/// </summary>
-		/// <param name="formatProvider">the format provider to use</param>
-		/// <remarks>
-		/// <para>
-		/// Create an instance of <see cref="ReusableStringWriter"/>
-		/// </para>
-		/// </remarks>
-		public ReusableStringWriter(IFormatProvider formatProvider) : base(formatProvider) 
-		{
-		}
+    /// <summary>
+    /// Create an instance of <see cref="ReusableStringWriter"/>
+    /// </summary>
+    /// <param name="formatProvider">the format provider to use</param>
+    /// <remarks>
+    /// <para>
+    /// Create an instance of <see cref="ReusableStringWriter"/>
+    /// </para>
+    /// </remarks>
+    public ReusableStringWriter(IFormatProvider formatProvider) : base(formatProvider)
+    {
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Override Dispose to prevent closing of writer
-		/// </summary>
-		/// <param name="disposing">flag</param>
-		/// <remarks>
-		/// <para>
-		/// Override Dispose to prevent closing of writer
-		/// </para>
-		/// </remarks>
-		protected override void Dispose(bool disposing)
-		{
-			// Do not close the writer
-		}
+    /// <summary>
+    /// Override Dispose to prevent closing of writer
+    /// </summary>
+    /// <param name="disposing">flag</param>
+    /// <remarks>
+    /// <para>
+    /// Override Dispose to prevent closing of writer
+    /// </para>
+    /// </remarks>
+    protected override void Dispose(bool disposing)
+    {
+      // Do not close the writer
+    }
 
-		/// <summary>
-		/// Reset this string writer so that it can be reused.
-		/// </summary>
-		/// <param name="maxCapacity">the maximum buffer capacity before it is trimmed</param>
-		/// <param name="defaultSize">the default size to make the buffer</param>
-		/// <remarks>
-		/// <para>
-		/// Reset this string writer so that it can be reused.
-		/// The internal buffers are cleared and reset.
-		/// </para>
-		/// </remarks>
-		public void Reset(int maxCapacity, int defaultSize)
-		{
-			// Reset working string buffer
-			StringBuilder sb = this.GetStringBuilder();
+    /// <summary>
+    /// Reset this string writer so that it can be reused.
+    /// </summary>
+    /// <param name="maxCapacity">the maximum buffer capacity before it is trimmed</param>
+    /// <param name="defaultSize">the default size to make the buffer</param>
+    /// <remarks>
+    /// <para>
+    /// Reset this string writer so that it can be reused.
+    /// The internal buffers are cleared and reset.
+    /// </para>
+    /// </remarks>
+    public void Reset(int maxCapacity, int defaultSize)
+    {
+      // Reset working string buffer
+      StringBuilder sb = this.GetStringBuilder();
 
-			sb.Length = 0;
-			
-			// Check if over max size
-			if (sb.Capacity > maxCapacity) 
-			{
-				sb.Capacity = defaultSize;
-			} 
-		}
-	}
+      sb.Length = 0;
+
+      // Check if over max size
+      if (sb.Capacity > maxCapacity)
+      {
+        sb.Capacity = defaultSize;
+      }
+    }
+  }
 }
diff --git a/src/log4net/Util/SystemInfo.cs b/src/log4net/Util/SystemInfo.cs
index 821a230..5cf7980 100644
--- a/src/log4net/Util/SystemInfo.cs
+++ b/src/log4net/Util/SystemInfo.cs
@@ -29,1307 +29,1307 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Utility class for system specific information.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Utility class of static methods for system specific information.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	/// <author>Alexey Solofnenko</author>
-	public sealed class SystemInfo
-	{
-		#region Private Constants
+  /// <summary>
+  /// Utility class for system specific information.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Utility class of static methods for system specific information.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  /// <author>Alexey Solofnenko</author>
+  public sealed class SystemInfo
+  {
+    #region Private Constants
 
-		private const string DEFAULT_NULL_TEXT = "(null)";
-		private const string DEFAULT_NOT_AVAILABLE_TEXT = "NOT AVAILABLE";
+    private const string DEFAULT_NULL_TEXT = "(null)";
+    private const string DEFAULT_NOT_AVAILABLE_TEXT = "NOT AVAILABLE";
 
-		#endregion
+    #endregion
 
-		#region Private Instance Constructors
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Private constructor to prevent instances.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Only static methods are exposed from this type.
-		/// </para>
-		/// </remarks>
-		private SystemInfo()
-		{
-		}
+    /// <summary>
+    /// Private constructor to prevent instances.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Only static methods are exposed from this type.
+    /// </para>
+    /// </remarks>
+    private SystemInfo()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region Public Static Constructor
+    #region Public Static Constructor
 
-		/// <summary>
-		/// Initialize default values for private static fields.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Only static methods are exposed from this type.
-		/// </para>
-		/// </remarks>
-		static SystemInfo()
-		{
-			string nullText = DEFAULT_NULL_TEXT;
-			string notAvailableText = DEFAULT_NOT_AVAILABLE_TEXT;
+    /// <summary>
+    /// Initialize default values for private static fields.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Only static methods are exposed from this type.
+    /// </para>
+    /// </remarks>
+    static SystemInfo()
+    {
+      string nullText = DEFAULT_NULL_TEXT;
+      string notAvailableText = DEFAULT_NOT_AVAILABLE_TEXT;
 
 #if !NETCF
-			// Look for log4net.NullText in AppSettings
-			string nullTextAppSettingsKey = SystemInfo.GetAppSetting("log4net.NullText");
-			if (nullTextAppSettingsKey != null && nullTextAppSettingsKey.Length > 0)
-			{
-				LogLog.Debug(declaringType, "Initializing NullText value to [" + nullTextAppSettingsKey + "].");
-				nullText = nullTextAppSettingsKey;
-			}
+      // Look for log4net.NullText in AppSettings
+      string nullTextAppSettingsKey = SystemInfo.GetAppSetting("log4net.NullText");
+      if (nullTextAppSettingsKey != null && nullTextAppSettingsKey.Length > 0)
+      {
+        LogLog.Debug(declaringType, "Initializing NullText value to [" + nullTextAppSettingsKey + "].");
+        nullText = nullTextAppSettingsKey;
+      }
 
-			// Look for log4net.NotAvailableText in AppSettings
-			string notAvailableTextAppSettingsKey = SystemInfo.GetAppSetting("log4net.NotAvailableText");
-			if (notAvailableTextAppSettingsKey != null && notAvailableTextAppSettingsKey.Length > 0)
-			{
-				LogLog.Debug(declaringType, "Initializing NotAvailableText value to [" + notAvailableTextAppSettingsKey + "].");
-				notAvailableText = notAvailableTextAppSettingsKey;
-			}
+      // Look for log4net.NotAvailableText in AppSettings
+      string notAvailableTextAppSettingsKey = SystemInfo.GetAppSetting("log4net.NotAvailableText");
+      if (notAvailableTextAppSettingsKey != null && notAvailableTextAppSettingsKey.Length > 0)
+      {
+        LogLog.Debug(declaringType, "Initializing NotAvailableText value to [" + notAvailableTextAppSettingsKey + "].");
+        notAvailableText = notAvailableTextAppSettingsKey;
+      }
 #endif
-			s_notAvailableText = notAvailableText;
-			s_nullText = nullText;
-		}
+      s_notAvailableText = notAvailableText;
+      s_nullText = nullText;
+    }
 
-		#endregion
+    #endregion
 
-		#region Public Static Properties
+    #region Public Static Properties
 
-		/// <summary>
-		/// Gets the system dependent line terminator.
-		/// </summary>
-		/// <value>
-		/// The system dependent line terminator.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the system dependent line terminator.
-		/// </para>
-		/// </remarks>
-		public static string NewLine
-		{
-			get
-			{
+    /// <summary>
+    /// Gets the system dependent line terminator.
+    /// </summary>
+    /// <value>
+    /// The system dependent line terminator.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the system dependent line terminator.
+    /// </para>
+    /// </remarks>
+    public static string NewLine
+    {
+      get
+      {
 #if NETCF
-				return "\r\n";
+        return "\r\n";
 #else
-				return System.Environment.NewLine;
+        return System.Environment.NewLine;
 #endif
-			}
-		}
+      }
+    }
 
-		/// <summary>
-		/// Gets the base directory for this <see cref="AppDomain"/>.
-		/// </summary>
-		/// <value>The base directory path for the current <see cref="AppDomain"/>.</value>
-		/// <remarks>
-		/// <para>
-		/// Gets the base directory for this <see cref="AppDomain"/>.
-		/// </para>
-		/// <para>
-		/// The value returned may be either a local file path or a URI.
-		/// </para>
-		/// </remarks>
-		public static string ApplicationBaseDirectory
-		{
-			get
-			{
+    /// <summary>
+    /// Gets the base directory for this <see cref="AppDomain"/>.
+    /// </summary>
+    /// <value>The base directory path for the current <see cref="AppDomain"/>.</value>
+    /// <remarks>
+    /// <para>
+    /// Gets the base directory for this <see cref="AppDomain"/>.
+    /// </para>
+    /// <para>
+    /// The value returned may be either a local file path or a URI.
+    /// </para>
+    /// </remarks>
+    public static string ApplicationBaseDirectory
+    {
+      get
+      {
 #if NETCF
--				return System.IO.Path.GetDirectoryName(SystemInfo.EntryAssemblyLocation) + System.IO.Path.DirectorySeparatorChar;
+-        return System.IO.Path.GetDirectoryName(SystemInfo.EntryAssemblyLocation) + System.IO.Path.DirectorySeparatorChar;
 #elif NETSTANDARD1_3
-				return Directory.GetCurrentDirectory();
+        return Directory.GetCurrentDirectory();
 #else
-				return AppDomain.CurrentDomain.BaseDirectory;
+        return AppDomain.CurrentDomain.BaseDirectory;
 #endif
-			}
-		}
+      }
+    }
 
-		/// <summary>
-		/// Gets the path to the configuration file for the current <see cref="AppDomain"/>.
-		/// </summary>
-		/// <value>The path to the configuration file for the current <see cref="AppDomain"/>.</value>
-		/// <remarks>
-		/// <para>
-		/// The .NET Compact Framework 1.0 does not have a concept of a configuration
-		/// file. For this runtime, we use the entry assembly location as the root for
-		/// the configuration file name.
-		/// </para>
-		/// <para>
-		/// The value returned may be either a local file path or a URI.
-		/// </para>
-		/// </remarks>
-		public static string ConfigurationFileLocation
-		{
-			get
-			{
+    /// <summary>
+    /// Gets the path to the configuration file for the current <see cref="AppDomain"/>.
+    /// </summary>
+    /// <value>The path to the configuration file for the current <see cref="AppDomain"/>.</value>
+    /// <remarks>
+    /// <para>
+    /// The .NET Compact Framework 1.0 does not have a concept of a configuration
+    /// file. For this runtime, we use the entry assembly location as the root for
+    /// the configuration file name.
+    /// </para>
+    /// <para>
+    /// The value returned may be either a local file path or a URI.
+    /// </para>
+    /// </remarks>
+    public static string ConfigurationFileLocation
+    {
+      get
+      {
 #if NETCF || NETSTANDARD
-				return SystemInfo.EntryAssemblyLocation+".config";
+        return SystemInfo.EntryAssemblyLocation+".config";
 #else
-				return System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
+        return System.AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
 #endif
-			}
-		}
+      }
+    }
 
-		private static string entryAssemblyLocation;
+    private static string entryAssemblyLocation;
 
-		/// <summary>
-		/// Gets the path to the file that first executed in the current <see cref="AppDomain"/>.
-		/// </summary>
-		/// <value>The path to the entry assembly.</value>
-		/// <remarks>
-		/// <para>
-		/// Gets the path to the file that first executed in the current <see cref="AppDomain"/>.
-		/// </para>
-		/// </remarks>
-		public static string EntryAssemblyLocation
-		{
-			get
-			{
-				if (entryAssemblyLocation != null)
-					return entryAssemblyLocation;
+    /// <summary>
+    /// Gets the path to the file that first executed in the current <see cref="AppDomain"/>.
+    /// </summary>
+    /// <value>The path to the entry assembly.</value>
+    /// <remarks>
+    /// <para>
+    /// Gets the path to the file that first executed in the current <see cref="AppDomain"/>.
+    /// </para>
+    /// </remarks>
+    public static string EntryAssemblyLocation
+    {
+      get
+      {
+        if (entryAssemblyLocation != null)
+          return entryAssemblyLocation;
 #if NETCF
-				return entryAssemblyLocation = SystemInfo.NativeEntryAssemblyLocation;
+        return entryAssemblyLocation = SystemInfo.NativeEntryAssemblyLocation;
 #elif NETSTANDARD1_3 // TODO GetEntryAssembly is available for netstandard1.5
-				return entryAssemblyLocation = AppContext.BaseDirectory;
+        return entryAssemblyLocation = AppContext.BaseDirectory;
 #else
-				return entryAssemblyLocation = Assembly.GetEntryAssembly()?.Location
-					?? throw new InvalidOperationException($"Unable to determine EntryAssembly location: EntryAssembly is null. Try explicitly setting {nameof(SystemInfo)}.{nameof(EntryAssemblyLocation)}");
+        return entryAssemblyLocation = Assembly.GetEntryAssembly()?.Location
+          ?? throw new InvalidOperationException($"Unable to determine EntryAssembly location: EntryAssembly is null. Try explicitly setting {nameof(SystemInfo)}.{nameof(EntryAssemblyLocation)}");
 #endif
-			}
-			set => entryAssemblyLocation = value;
-		}
+      }
+      set => entryAssemblyLocation = value;
+    }
 
-		/// <summary>
-		/// Gets the ID of the current thread.
-		/// </summary>
-		/// <value>The ID of the current thread.</value>
-		/// <remarks>
-		/// <para>
-		/// On the .NET framework, the <c>AppDomain.GetCurrentThreadId</c> method
-		/// is used to obtain the thread ID for the current thread. This is the 
-		/// operating system ID for the thread.
-		/// </para>
-		/// <para>
-		/// On the .NET Compact Framework 1.0 it is not possible to get the 
-		/// operating system thread ID for the current thread. The native method 
-		/// <c>GetCurrentThreadId</c> is implemented inline in a header file
-		/// and cannot be called.
-		/// </para>
-		/// <para>
-		/// On the .NET Framework 2.0 the <c>Thread.ManagedThreadId</c> is used as this
-		/// gives a stable id unrelated to the operating system thread ID which may 
-		/// change if the runtime is using fibers.
-		/// </para>
-		/// </remarks>
-		public static int CurrentThreadId
-		{
-			get
-			{
+    /// <summary>
+    /// Gets the ID of the current thread.
+    /// </summary>
+    /// <value>The ID of the current thread.</value>
+    /// <remarks>
+    /// <para>
+    /// On the .NET framework, the <c>AppDomain.GetCurrentThreadId</c> method
+    /// is used to obtain the thread ID for the current thread. This is the 
+    /// operating system ID for the thread.
+    /// </para>
+    /// <para>
+    /// On the .NET Compact Framework 1.0 it is not possible to get the 
+    /// operating system thread ID for the current thread. The native method 
+    /// <c>GetCurrentThreadId</c> is implemented inline in a header file
+    /// and cannot be called.
+    /// </para>
+    /// <para>
+    /// On the .NET Framework 2.0 the <c>Thread.ManagedThreadId</c> is used as this
+    /// gives a stable id unrelated to the operating system thread ID which may 
+    /// change if the runtime is using fibers.
+    /// </para>
+    /// </remarks>
+    public static int CurrentThreadId
+    {
+      get
+      {
 #if NETCF_1_0
-				return System.Threading.Thread.CurrentThread.GetHashCode();
+        return System.Threading.Thread.CurrentThread.GetHashCode();
 #elif NET_2_0 || NETCF_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0 || NETSTANDARD
-				return System.Threading.Thread.CurrentThread.ManagedThreadId;
+        return System.Threading.Thread.CurrentThread.ManagedThreadId;
 #else
-				return AppDomain.GetCurrentThreadId();
+        return AppDomain.GetCurrentThreadId();
 #endif
-			}
-		}
+      }
+    }
 
-		/// <summary>
-		/// Get the host name or machine name for the current machine
-		/// </summary>
-		/// <value>
-		/// The hostname or machine name
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Get the host name or machine name for the current machine
-		/// </para>
-		/// <para>
-		/// The host name (<see cref="System.Net.Dns.GetHostName"/>) or
-		/// the machine name (<c>Environment.MachineName</c>) for
-		/// the current machine, or if neither of these are available
-		/// then <c>NOT AVAILABLE</c> is returned.
-		/// </para>
-		/// </remarks>
-		public static string HostName
-		{
-			get
-			{
-				if (s_hostName == null)
-				{
+    /// <summary>
+    /// Get the host name or machine name for the current machine
+    /// </summary>
+    /// <value>
+    /// The hostname or machine name
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Get the host name or machine name for the current machine
+    /// </para>
+    /// <para>
+    /// The host name (<see cref="System.Net.Dns.GetHostName"/>) or
+    /// the machine name (<c>Environment.MachineName</c>) for
+    /// the current machine, or if neither of these are available
+    /// then <c>NOT AVAILABLE</c> is returned.
+    /// </para>
+    /// </remarks>
+    public static string HostName
+    {
+      get
+      {
+        if (s_hostName == null)
+        {
 
-					// Get the DNS host name of the current machine
-					try
-					{
-						// Lookup the host name
-						s_hostName = System.Net.Dns.GetHostName();
-					}
-					catch (System.Net.Sockets.SocketException)
-					{
-						LogLog.Debug(declaringType, "Socket exception occurred while getting the dns hostname. Error Ignored.");
-					}
-					catch (System.Security.SecurityException)
-					{
-						// We may get a security exception looking up the hostname
-						// You must have Unrestricted DnsPermission to access resource
-						LogLog.Debug(declaringType, "Security exception occurred while getting the dns hostname. Error Ignored.");
-					}
-					catch (Exception ex)
-					{
-						LogLog.Debug(declaringType, "Some other exception occurred while getting the dns hostname. Error Ignored.", ex);
-					}
+          // Get the DNS host name of the current machine
+          try
+          {
+            // Lookup the host name
+            s_hostName = System.Net.Dns.GetHostName();
+          }
+          catch (System.Net.Sockets.SocketException)
+          {
+            LogLog.Debug(declaringType, "Socket exception occurred while getting the dns hostname. Error Ignored.");
+          }
+          catch (System.Security.SecurityException)
+          {
+            // We may get a security exception looking up the hostname
+            // You must have Unrestricted DnsPermission to access resource
+            LogLog.Debug(declaringType, "Security exception occurred while getting the dns hostname. Error Ignored.");
+          }
+          catch (Exception ex)
+          {
+            LogLog.Debug(declaringType, "Some other exception occurred while getting the dns hostname. Error Ignored.", ex);
+          }
 
-					// Get the NETBIOS machine name of the current machine
-					if (s_hostName == null || s_hostName.Length == 0)
-					{
-						try
-						{
+          // Get the NETBIOS machine name of the current machine
+          if (s_hostName == null || s_hostName.Length == 0)
+          {
+            try
+            {
 #if NETSTANDARD1_3
-							s_hostName = Environment.GetEnvironmentVariable("COMPUTERNAME");
+              s_hostName = Environment.GetEnvironmentVariable("COMPUTERNAME");
 #elif (!SSCLI && !NETCF)
-							s_hostName = Environment.MachineName;
+              s_hostName = Environment.MachineName;
 #endif
-						}
-						catch (InvalidOperationException)
-						{
-						}
-						catch (System.Security.SecurityException)
-						{
-							// We may get a security exception looking up the machine name
-							// You must have Unrestricted EnvironmentPermission to access resource
-						}
-					}
+            }
+            catch (InvalidOperationException)
+            {
+            }
+            catch (System.Security.SecurityException)
+            {
+              // We may get a security exception looking up the machine name
+              // You must have Unrestricted EnvironmentPermission to access resource
+            }
+          }
 
-					// Couldn't find a value
-					if (s_hostName == null || s_hostName.Length == 0)
-					{
-						s_hostName = s_notAvailableText;
-						LogLog.Debug(declaringType, "Could not determine the hostname. Error Ignored. Empty host name will be used");
-					}
-				}
-				return s_hostName;
-			}
-		}
+          // Couldn't find a value
+          if (s_hostName == null || s_hostName.Length == 0)
+          {
+            s_hostName = s_notAvailableText;
+            LogLog.Debug(declaringType, "Could not determine the hostname. Error Ignored. Empty host name will be used");
+          }
+        }
+        return s_hostName;
+      }
+    }
 
-		/// <summary>
-		/// Get this application's friendly name
-		/// </summary>
-		/// <value>
-		/// The friendly name of this application as a string
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// If available the name of the application is retrieved from
-		/// the <c>AppDomain</c> using <c>AppDomain.CurrentDomain.FriendlyName</c>.
-		/// </para>
-		/// <para>
-		/// Otherwise the file name of the entry assembly is used.
-		/// </para>
-		/// </remarks>
-		public static string ApplicationFriendlyName
-		{
-			get
-			{
-				if (s_appFriendlyName == null)
-				{
-					try
-					{
+    /// <summary>
+    /// Get this application's friendly name
+    /// </summary>
+    /// <value>
+    /// The friendly name of this application as a string
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// If available the name of the application is retrieved from
+    /// the <c>AppDomain</c> using <c>AppDomain.CurrentDomain.FriendlyName</c>.
+    /// </para>
+    /// <para>
+    /// Otherwise the file name of the entry assembly is used.
+    /// </para>
+    /// </remarks>
+    public static string ApplicationFriendlyName
+    {
+      get
+      {
+        if (s_appFriendlyName == null)
+        {
+          try
+          {
 #if !NETCF && !NETSTANDARD1_3
-						s_appFriendlyName = AppDomain.CurrentDomain.FriendlyName;
+            s_appFriendlyName = AppDomain.CurrentDomain.FriendlyName;
 #endif
-					}
-					catch (System.Security.SecurityException)
-					{
-						// This security exception will occur if the caller does not have 
-						// some undefined set of SecurityPermission flags.
-						LogLog.Debug(declaringType, "Security exception while trying to get current domain friendly name. Error Ignored.");
-					}
+          }
+          catch (System.Security.SecurityException)
+          {
+            // This security exception will occur if the caller does not have 
+            // some undefined set of SecurityPermission flags.
+            LogLog.Debug(declaringType, "Security exception while trying to get current domain friendly name. Error Ignored.");
+          }
 
-					if (s_appFriendlyName == null || s_appFriendlyName.Length == 0)
-					{
-						try
-						{
-							string assemblyLocation = SystemInfo.EntryAssemblyLocation;
-							s_appFriendlyName = System.IO.Path.GetFileName(assemblyLocation);
-						}
-						catch (System.Security.SecurityException)
-						{
-							// Caller needs path discovery permission
-						}
-					}
+          if (s_appFriendlyName == null || s_appFriendlyName.Length == 0)
+          {
+            try
+            {
+              string assemblyLocation = SystemInfo.EntryAssemblyLocation;
+              s_appFriendlyName = System.IO.Path.GetFileName(assemblyLocation);
+            }
+            catch (System.Security.SecurityException)
+            {
+              // Caller needs path discovery permission
+            }
+          }
 
-					if (s_appFriendlyName == null || s_appFriendlyName.Length == 0)
-					{
-						s_appFriendlyName = s_notAvailableText;
-					}
-				}
-				return s_appFriendlyName;
-			}
-		}
+          if (s_appFriendlyName == null || s_appFriendlyName.Length == 0)
+          {
+            s_appFriendlyName = s_notAvailableText;
+          }
+        }
+        return s_appFriendlyName;
+      }
+    }
 
-		/// <summary>
-		/// Get the start time for the current process.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is the time at which the log4net library was loaded into the
-		/// AppDomain. Due to reports of a hang in the call to <c>System.Diagnostics.Process.StartTime</c>
-		/// this is not the start time for the current process.
-		/// </para>
-		/// <para>
-		/// The log4net library should be loaded by an application early during its
-		/// startup, therefore this start time should be a good approximation for
-		/// the actual start time.
-		/// </para>
-		/// <para>
-		/// Note that AppDomains may be loaded and unloaded within the
-		/// same process without the process terminating, however this start time
-		/// will be set per AppDomain.
-		/// </para>
-		/// </remarks>
-		[Obsolete("Use ProcessStartTimeUtc and convert to local time if needed.")]
-		public static DateTime ProcessStartTime
-		{
-			get { return s_processStartTimeUtc.ToLocalTime(); }
-		}
+    /// <summary>
+    /// Get the start time for the current process.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is the time at which the log4net library was loaded into the
+    /// AppDomain. Due to reports of a hang in the call to <c>System.Diagnostics.Process.StartTime</c>
+    /// this is not the start time for the current process.
+    /// </para>
+    /// <para>
+    /// The log4net library should be loaded by an application early during its
+    /// startup, therefore this start time should be a good approximation for
+    /// the actual start time.
+    /// </para>
+    /// <para>
+    /// Note that AppDomains may be loaded and unloaded within the
+    /// same process without the process terminating, however this start time
+    /// will be set per AppDomain.
+    /// </para>
+    /// </remarks>
+    [Obsolete("Use ProcessStartTimeUtc and convert to local time if needed.")]
+    public static DateTime ProcessStartTime
+    {
+      get { return s_processStartTimeUtc.ToLocalTime(); }
+    }
 
-		/// <summary>
-		/// Get the UTC start time for the current process.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is the UTC time at which the log4net library was loaded into the
-		/// AppDomain. Due to reports of a hang in the call to <c>System.Diagnostics.Process.StartTime</c>
-		/// this is not the start time for the current process.
-		/// </para>
-		/// <para>
-		/// The log4net library should be loaded by an application early during its
-		/// startup, therefore this start time should be a good approximation for
-		/// the actual start time.
-		/// </para>
-		/// <para>
-		/// Note that AppDomains may be loaded and unloaded within the
-		/// same process without the process terminating, however this start time
-		/// will be set per AppDomain.
-		/// </para>
-		/// </remarks>
-		public static DateTime ProcessStartTimeUtc
-		{
-			get { return s_processStartTimeUtc; }
-		}
+    /// <summary>
+    /// Get the UTC start time for the current process.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is the UTC time at which the log4net library was loaded into the
+    /// AppDomain. Due to reports of a hang in the call to <c>System.Diagnostics.Process.StartTime</c>
+    /// this is not the start time for the current process.
+    /// </para>
+    /// <para>
+    /// The log4net library should be loaded by an application early during its
+    /// startup, therefore this start time should be a good approximation for
+    /// the actual start time.
+    /// </para>
+    /// <para>
+    /// Note that AppDomains may be loaded and unloaded within the
+    /// same process without the process terminating, however this start time
+    /// will be set per AppDomain.
+    /// </para>
+    /// </remarks>
+    public static DateTime ProcessStartTimeUtc
+    {
+      get { return s_processStartTimeUtc; }
+    }
 
-		/// <summary>
-		/// Text to output when a <c>null</c> is encountered.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Use this value to indicate a <c>null</c> has been encountered while
-		/// outputting a string representation of an item.
-		/// </para>
-		/// <para>
-		/// The default value is <c>(null)</c>. This value can be overridden by specifying
-		/// a value for the <c>log4net.NullText</c> appSetting in the application's
-		/// .config file.
-		/// </para>
-		/// </remarks>
-		public static string NullText
-		{
-			get { return s_nullText; }
-			set { s_nullText = value; }
-		}
+    /// <summary>
+    /// Text to output when a <c>null</c> is encountered.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Use this value to indicate a <c>null</c> has been encountered while
+    /// outputting a string representation of an item.
+    /// </para>
+    /// <para>
+    /// The default value is <c>(null)</c>. This value can be overridden by specifying
+    /// a value for the <c>log4net.NullText</c> appSetting in the application's
+    /// .config file.
+    /// </para>
+    /// </remarks>
+    public static string NullText
+    {
+      get { return s_nullText; }
+      set { s_nullText = value; }
+    }
 
-		/// <summary>
-		/// Text to output when an unsupported feature is requested.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Use this value when an unsupported feature is requested.
-		/// </para>
-		/// <para>
-		/// The default value is <c>NOT AVAILABLE</c>. This value can be overridden by specifying
-		/// a value for the <c>log4net.NotAvailableText</c> appSetting in the application's
-		/// .config file.
-		/// </para>
-		/// </remarks>
-		public static string NotAvailableText
-		{
-			get { return s_notAvailableText; }
-			set { s_notAvailableText = value; }
-		}
+    /// <summary>
+    /// Text to output when an unsupported feature is requested.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Use this value when an unsupported feature is requested.
+    /// </para>
+    /// <para>
+    /// The default value is <c>NOT AVAILABLE</c>. This value can be overridden by specifying
+    /// a value for the <c>log4net.NotAvailableText</c> appSetting in the application's
+    /// .config file.
+    /// </para>
+    /// </remarks>
+    public static string NotAvailableText
+    {
+      get { return s_notAvailableText; }
+      set { s_notAvailableText = value; }
+    }
 
-		#endregion Public Static Properties
+    #endregion Public Static Properties
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Gets the assembly location path for the specified assembly.
-		/// </summary>
-		/// <param name="myAssembly">The assembly to get the location for.</param>
-		/// <returns>The location of the assembly.</returns>
-		/// <remarks>
-		/// <para>
-		/// This method does not guarantee to return the correct path
-		/// to the assembly. If only tries to give an indication as to
-		/// where the assembly was loaded from.
-		/// </para>
-		/// </remarks>
-		public static string AssemblyLocationInfo(Assembly myAssembly)
-		{
+    /// <summary>
+    /// Gets the assembly location path for the specified assembly.
+    /// </summary>
+    /// <param name="myAssembly">The assembly to get the location for.</param>
+    /// <returns>The location of the assembly.</returns>
+    /// <remarks>
+    /// <para>
+    /// This method does not guarantee to return the correct path
+    /// to the assembly. If only tries to give an indication as to
+    /// where the assembly was loaded from.
+    /// </para>
+    /// </remarks>
+    public static string AssemblyLocationInfo(Assembly myAssembly)
+    {
 #if NETCF
-			return "Not supported on Microsoft .NET Compact Framework";
+      return "Not supported on Microsoft .NET Compact Framework";
 #elif NETSTANDARD1_3
-						return "Not supported on .NET Core";
+            return "Not supported on .NET Core";
 #else
-			if (myAssembly.GlobalAssemblyCache)
-			{
-				return "Global Assembly Cache";
-			}
-			else
-			{
-				try
-				{
+      if (myAssembly.GlobalAssemblyCache)
+      {
+        return "Global Assembly Cache";
+      }
+      else
+      {
+        try
+        {
 #if NET_4_0 || MONO_4_0
-					if (myAssembly.IsDynamic)
-					{
-						return "Dynamic Assembly";
-					}
+          if (myAssembly.IsDynamic)
+          {
+            return "Dynamic Assembly";
+          }
 #else
 #if !NETSTANDARD2_0
-					if (myAssembly is System.Reflection.Emit.AssemblyBuilder)
-					{
-						return "Dynamic Assembly";
-					}
+          if (myAssembly is System.Reflection.Emit.AssemblyBuilder)
+          {
+            return "Dynamic Assembly";
+          }
 #endif
 
-					if (myAssembly.GetType().FullName == "System.Reflection.Emit.InternalAssemblyBuilder")
-					{
-						return "Dynamic Assembly";
-					}
+          if (myAssembly.GetType().FullName == "System.Reflection.Emit.InternalAssemblyBuilder")
+          {
+            return "Dynamic Assembly";
+          }
 #endif
-					else
-					{
-						// This call requires FileIOPermission for access to the path
-						// if we don't have permission then we just ignore it and
-						// carry on.
-						return myAssembly.Location;
-					}
-				}
-				catch (NotSupportedException)
-				{
-					// The location information may be unavailable for dynamic assemblies and a NotSupportedException
-					// is thrown in those cases. See: http://msdn.microsoft.com/de-de/library/system.reflection.assembly.location.aspx
-					return "Dynamic Assembly";
-				}
-				catch (TargetInvocationException ex)
-				{
-					return "Location Detect Failed (" + ex.Message + ")";
-				}
-				catch (ArgumentException ex)
-				{
-					return "Location Detect Failed (" + ex.Message + ")";
-				}
-				catch (System.Security.SecurityException)
-				{
-					return "Location Permission Denied";
-				}
-			}
+          else
+          {
+            // This call requires FileIOPermission for access to the path
+            // if we don't have permission then we just ignore it and
+            // carry on.
+            return myAssembly.Location;
+          }
+        }
+        catch (NotSupportedException)
+        {
+          // The location information may be unavailable for dynamic assemblies and a NotSupportedException
+          // is thrown in those cases. See: http://msdn.microsoft.com/de-de/library/system.reflection.assembly.location.aspx
+          return "Dynamic Assembly";
+        }
+        catch (TargetInvocationException ex)
+        {
+          return "Location Detect Failed (" + ex.Message + ")";
+        }
+        catch (ArgumentException ex)
+        {
+          return "Location Detect Failed (" + ex.Message + ")";
+        }
+        catch (System.Security.SecurityException)
+        {
+          return "Location Permission Denied";
+        }
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Gets the fully qualified name of the <see cref="Type" />, including 
-		/// the name of the assembly from which the <see cref="Type" /> was 
-		/// loaded.
-		/// </summary>
-		/// <param name="type">The <see cref="Type" /> to get the fully qualified name for.</param>
-		/// <returns>The fully qualified name for the <see cref="Type" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// This is equivalent to the <c>Type.AssemblyQualifiedName</c> property,
-		/// but this method works on the .NET Compact Framework 1.0 as well as
-		/// the full .NET runtime.
-		/// </para>
-		/// </remarks>
-		public static string AssemblyQualifiedName(Type type)
-		{
-			return type.FullName + ", "
+    /// <summary>
+    /// Gets the fully qualified name of the <see cref="Type" />, including 
+    /// the name of the assembly from which the <see cref="Type" /> was 
+    /// loaded.
+    /// </summary>
+    /// <param name="type">The <see cref="Type" /> to get the fully qualified name for.</param>
+    /// <returns>The fully qualified name for the <see cref="Type" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// This is equivalent to the <c>Type.AssemblyQualifiedName</c> property,
+    /// but this method works on the .NET Compact Framework 1.0 as well as
+    /// the full .NET runtime.
+    /// </para>
+    /// </remarks>
+    public static string AssemblyQualifiedName(Type type)
+    {
+      return type.FullName + ", "
 #if NETSTANDARD1_3
-				+ type.GetTypeInfo().Assembly.FullName;
+        + type.GetTypeInfo().Assembly.FullName;
 #else
-				+ type.Assembly.FullName;
+        + type.Assembly.FullName;
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Gets the short name of the <see cref="Assembly" />.
-		/// </summary>
-		/// <param name="myAssembly">The <see cref="Assembly" /> to get the name for.</param>
-		/// <returns>The short name of the <see cref="Assembly" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// The short name of the assembly is the <see cref="Assembly.FullName" /> 
-		/// without the version, culture, or public key. i.e. it is just the 
-		/// assembly's file name without the extension.
-		/// </para>
-		/// <para>
-		/// Use this rather than <c>Assembly.GetName().Name</c> because that
-		/// is not available on the Compact Framework.
-		/// </para>
-		/// <para>
-		/// Because of a FileIOPermission security demand we cannot do
-		/// the obvious Assembly.GetName().Name. We are allowed to get
-		/// the <see cref="Assembly.FullName" /> of the assembly so we 
-		/// start from there and strip out just the assembly name.
-		/// </para>
-		/// </remarks>
-		public static string AssemblyShortName(Assembly myAssembly)
-		{
-			string name = myAssembly.FullName;
-			int offset = name.IndexOf(',');
-			if (offset > 0)
-			{
-				name = name.Substring(0, offset);
-			}
-			return name.Trim();
+    /// <summary>
+    /// Gets the short name of the <see cref="Assembly" />.
+    /// </summary>
+    /// <param name="myAssembly">The <see cref="Assembly" /> to get the name for.</param>
+    /// <returns>The short name of the <see cref="Assembly" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// The short name of the assembly is the <see cref="Assembly.FullName" /> 
+    /// without the version, culture, or public key. i.e. it is just the 
+    /// assembly's file name without the extension.
+    /// </para>
+    /// <para>
+    /// Use this rather than <c>Assembly.GetName().Name</c> because that
+    /// is not available on the Compact Framework.
+    /// </para>
+    /// <para>
+    /// Because of a FileIOPermission security demand we cannot do
+    /// the obvious Assembly.GetName().Name. We are allowed to get
+    /// the <see cref="Assembly.FullName" /> of the assembly so we 
+    /// start from there and strip out just the assembly name.
+    /// </para>
+    /// </remarks>
+    public static string AssemblyShortName(Assembly myAssembly)
+    {
+      string name = myAssembly.FullName;
+      int offset = name.IndexOf(',');
+      if (offset > 0)
+      {
+        name = name.Substring(0, offset);
+      }
+      return name.Trim();
 
-			// TODO: Do we need to unescape the assembly name string? 
-			// Doc says '\' is an escape char but has this already been 
-			// done by the string loader?
-		}
+      // TODO: Do we need to unescape the assembly name string? 
+      // Doc says '\' is an escape char but has this already been 
+      // done by the string loader?
+    }
 
-		/// <summary>
-		/// Gets the file name portion of the <see cref="Assembly" />, including the extension.
-		/// </summary>
-		/// <param name="myAssembly">The <see cref="Assembly" /> to get the file name for.</param>
-		/// <returns>The file name of the assembly.</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the file name portion of the <see cref="Assembly" />, including the extension.
-		/// </para>
-		/// </remarks>
-		public static string AssemblyFileName(Assembly myAssembly)
-		{
+    /// <summary>
+    /// Gets the file name portion of the <see cref="Assembly" />, including the extension.
+    /// </summary>
+    /// <param name="myAssembly">The <see cref="Assembly" /> to get the file name for.</param>
+    /// <returns>The file name of the assembly.</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the file name portion of the <see cref="Assembly" />, including the extension.
+    /// </para>
+    /// </remarks>
+    public static string AssemblyFileName(Assembly myAssembly)
+    {
 #if NETCF || NETSTANDARD1_3 // TODO Assembly.Location is in netstandard1.5 System.Reflection
-			// This is not very good because it assumes that only
-			// the entry assembly can be an EXE. In fact multiple
-			// EXEs can be loaded in to a process.
+      // This is not very good because it assumes that only
+      // the entry assembly can be an EXE. In fact multiple
+      // EXEs can be loaded in to a process.
 
-			string assemblyShortName = SystemInfo.AssemblyShortName(myAssembly);
-			string entryAssemblyShortName = System.IO.Path.GetFileNameWithoutExtension(SystemInfo.EntryAssemblyLocation);
+      string assemblyShortName = SystemInfo.AssemblyShortName(myAssembly);
+      string entryAssemblyShortName = System.IO.Path.GetFileNameWithoutExtension(SystemInfo.EntryAssemblyLocation);
 
-			if (string.Compare(assemblyShortName, entryAssemblyShortName, true) == 0)
-			{
-				// assembly is entry assembly
-				return assemblyShortName + ".exe";
-			}
-			else
-			{
-				// assembly is not entry assembly
-				return assemblyShortName + ".dll";
-			}
+      if (string.Compare(assemblyShortName, entryAssemblyShortName, true) == 0)
+      {
+        // assembly is entry assembly
+        return assemblyShortName + ".exe";
+      }
+      else
+      {
+        // assembly is not entry assembly
+        return assemblyShortName + ".dll";
+      }
 #else
-			return System.IO.Path.GetFileName(myAssembly.Location);
+      return System.IO.Path.GetFileName(myAssembly.Location);
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Loads the type specified in the type string.
-		/// </summary>
-		/// <param name="relativeType">A sibling type to use to load the type.</param>
-		/// <param name="typeName">The name of the type to load.</param>
-		/// <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
-		/// <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
-		/// <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>
-		/// <remarks>
-		/// <para>
-		/// If the type name is fully qualified, i.e. if contains an assembly name in 
-		/// the type name, the type will be loaded from the system using 
-		/// <see cref="M:Type.GetType(string,bool)"/>.
-		/// </para>
-		/// <para>
-		/// If the type name is not fully qualified, it will be loaded from the assembly
-		/// containing the specified relative type. If the type is not found in the assembly 
-		/// then all the loaded assemblies will be searched for the type.
-		/// </para>
-		/// </remarks>
-		public static Type GetTypeFromString(Type relativeType, string typeName, bool throwOnError, bool ignoreCase)
-		{
+    /// <summary>
+    /// Loads the type specified in the type string.
+    /// </summary>
+    /// <param name="relativeType">A sibling type to use to load the type.</param>
+    /// <param name="typeName">The name of the type to load.</param>
+    /// <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
+    /// <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
+    /// <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>
+    /// <remarks>
+    /// <para>
+    /// If the type name is fully qualified, i.e. if contains an assembly name in 
+    /// the type name, the type will be loaded from the system using 
+    /// <see cref="M:Type.GetType(string,bool)"/>.
+    /// </para>
+    /// <para>
+    /// If the type name is not fully qualified, it will be loaded from the assembly
+    /// containing the specified relative type. If the type is not found in the assembly 
+    /// then all the loaded assemblies will be searched for the type.
+    /// </para>
+    /// </remarks>
+    public static Type GetTypeFromString(Type relativeType, string typeName, bool throwOnError, bool ignoreCase)
+    {
 #if NETSTANDARD1_3
-			return GetTypeFromString(relativeType.GetTypeInfo().Assembly, typeName, throwOnError, ignoreCase);
+      return GetTypeFromString(relativeType.GetTypeInfo().Assembly, typeName, throwOnError, ignoreCase);
 #else
-			return GetTypeFromString(relativeType.Assembly, typeName, throwOnError, ignoreCase);
+      return GetTypeFromString(relativeType.Assembly, typeName, throwOnError, ignoreCase);
 #endif
-		}
+    }
 
 #if !NETSTANDARD1_3
-		/// <summary>
-		/// Loads the type specified in the type string.
-		/// </summary>
-		/// <param name="typeName">The name of the type to load.</param>
-		/// <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
-		/// <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
-		/// <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>		
-		/// <remarks>
-		/// <para>
-		/// If the type name is fully qualified, i.e. if contains an assembly name in 
-		/// the type name, the type will be loaded from the system using 
-		/// <see cref="M:Type.GetType(string,bool)"/>.
-		/// </para>
-		/// <para>
-		/// If the type name is not fully qualified it will be loaded from the
-		/// assembly that is directly calling this method. If the type is not found 
-		/// in the assembly then all the loaded assemblies will be searched for the type.
-		/// </para>
-		/// </remarks>
-		public static Type GetTypeFromString(string typeName, bool throwOnError, bool ignoreCase)
-		{
-			return GetTypeFromString(Assembly.GetCallingAssembly(), typeName, throwOnError, ignoreCase);
-		}
+    /// <summary>
+    /// Loads the type specified in the type string.
+    /// </summary>
+    /// <param name="typeName">The name of the type to load.</param>
+    /// <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
+    /// <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
+    /// <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>    
+    /// <remarks>
+    /// <para>
+    /// If the type name is fully qualified, i.e. if contains an assembly name in 
+    /// the type name, the type will be loaded from the system using 
+    /// <see cref="M:Type.GetType(string,bool)"/>.
+    /// </para>
+    /// <para>
+    /// If the type name is not fully qualified it will be loaded from the
+    /// assembly that is directly calling this method. If the type is not found 
+    /// in the assembly then all the loaded assemblies will be searched for the type.
+    /// </para>
+    /// </remarks>
+    public static Type GetTypeFromString(string typeName, bool throwOnError, bool ignoreCase)
+    {
+      return GetTypeFromString(Assembly.GetCallingAssembly(), typeName, throwOnError, ignoreCase);
+    }
 #endif
 
-		/// <summary>
-		/// Loads the type specified in the type string.
-		/// </summary>
-		/// <param name="relativeAssembly">An assembly to load the type from.</param>
-		/// <param name="typeName">The name of the type to load.</param>
-		/// <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
-		/// <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
-		/// <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>
-		/// <remarks>
-		/// <para>
-		/// If the type name is fully qualified, i.e. if contains an assembly name in 
-		/// the type name, the type will be loaded from the system using 
-		/// <see cref="M:Type.GetType(string,bool)"/>.
-		/// </para>
-		/// <para>
-		/// If the type name is not fully qualified it will be loaded from the specified
-		/// assembly. If the type is not found in the assembly then all the loaded assemblies 
-		/// will be searched for the type.
-		/// </para>
-		/// </remarks>
-		public static Type GetTypeFromString(Assembly relativeAssembly, string typeName, bool throwOnError, bool ignoreCase)
-		{
-			// Check if the type name specifies the assembly name
-			if (typeName.IndexOf(',') == -1)
-			{
-				//LogLog.Debug(declaringType, "SystemInfo: Loading type ["+typeName+"] from assembly ["+relativeAssembly.FullName+"]");
+    /// <summary>
+    /// Loads the type specified in the type string.
+    /// </summary>
+    /// <param name="relativeAssembly">An assembly to load the type from.</param>
+    /// <param name="typeName">The name of the type to load.</param>
+    /// <param name="throwOnError">Flag set to <c>true</c> to throw an exception if the type cannot be loaded.</param>
+    /// <param name="ignoreCase"><c>true</c> to ignore the case of the type name; otherwise, <c>false</c></param>
+    /// <returns>The type loaded or <c>null</c> if it could not be loaded.</returns>
+    /// <remarks>
+    /// <para>
+    /// If the type name is fully qualified, i.e. if contains an assembly name in 
+    /// the type name, the type will be loaded from the system using 
+    /// <see cref="M:Type.GetType(string,bool)"/>.
+    /// </para>
+    /// <para>
+    /// If the type name is not fully qualified it will be loaded from the specified
+    /// assembly. If the type is not found in the assembly then all the loaded assemblies 
+    /// will be searched for the type.
+    /// </para>
+    /// </remarks>
+    public static Type GetTypeFromString(Assembly relativeAssembly, string typeName, bool throwOnError, bool ignoreCase)
+    {
+      // Check if the type name specifies the assembly name
+      if (typeName.IndexOf(',') == -1)
+      {
+        //LogLog.Debug(declaringType, "SystemInfo: Loading type ["+typeName+"] from assembly ["+relativeAssembly.FullName+"]");
 #if NETSTANDARD1_3
-				return relativeAssembly.GetType(typeName, throwOnError, ignoreCase);
+        return relativeAssembly.GetType(typeName, throwOnError, ignoreCase);
 #elif NETCF
-				return relativeAssembly.GetType(typeName, throwOnError);
+        return relativeAssembly.GetType(typeName, throwOnError);
 #else
-				// Attempt to lookup the type from the relativeAssembly
-				Type type = relativeAssembly.GetType(typeName, false, ignoreCase);
-				if (type != null)
-				{
-					// Found type in relative assembly
-					//LogLog.Debug(declaringType, "SystemInfo: Loaded type ["+typeName+"] from assembly ["+relativeAssembly.FullName+"]");
-					return type;
-				}
+        // Attempt to lookup the type from the relativeAssembly
+        Type type = relativeAssembly.GetType(typeName, false, ignoreCase);
+        if (type != null)
+        {
+          // Found type in relative assembly
+          //LogLog.Debug(declaringType, "SystemInfo: Loaded type ["+typeName+"] from assembly ["+relativeAssembly.FullName+"]");
+          return type;
+        }
 
-				Assembly[] loadedAssemblies = null;
-				try
-				{
-					loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
-				}
-				catch (System.Security.SecurityException)
-				{
-					// Insufficient permissions to get the list of loaded assemblies
-				}
+        Assembly[] loadedAssemblies = null;
+        try
+        {
+          loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
+        }
+        catch (System.Security.SecurityException)
+        {
+          // Insufficient permissions to get the list of loaded assemblies
+        }
 
-				if (loadedAssemblies != null)
-				{
-					Type fallback = null;
-					// Search the loaded assemblies for the type
-					foreach (Assembly assembly in loadedAssemblies)
-					{
-						Type t = assembly.GetType(typeName, false, ignoreCase);
-						if (t != null)
-						{
-							// Found type in loaded assembly
-							LogLog.Debug(declaringType, "Loaded type [" + typeName + "] from assembly [" + assembly.FullName + "] by searching loaded assemblies.");
-							if (assembly.GlobalAssemblyCache)
-							{
-								fallback = t;
-							}
-							else
-							{
-								return t;
-							}
-						}
-					}
-					if (fallback != null)
-					{
-						return fallback;
-					}
-				}
+        if (loadedAssemblies != null)
+        {
+          Type fallback = null;
+          // Search the loaded assemblies for the type
+          foreach (Assembly assembly in loadedAssemblies)
+          {
+            Type t = assembly.GetType(typeName, false, ignoreCase);
+            if (t != null)
+            {
+              // Found type in loaded assembly
+              LogLog.Debug(declaringType, "Loaded type [" + typeName + "] from assembly [" + assembly.FullName + "] by searching loaded assemblies.");
+              if (assembly.GlobalAssemblyCache)
+              {
+                fallback = t;
+              }
+              else
+              {
+                return t;
+              }
+            }
+          }
+          if (fallback != null)
+          {
+            return fallback;
+          }
+        }
 
-				// Didn't find the type
-				if (throwOnError)
-				{
-					throw new TypeLoadException("Could not load type [" + typeName + "]. Tried assembly [" + relativeAssembly.FullName + "] and all loaded assemblies");
-				}
-				return null;
+        // Didn't find the type
+        if (throwOnError)
+        {
+          throw new TypeLoadException("Could not load type [" + typeName + "]. Tried assembly [" + relativeAssembly.FullName + "] and all loaded assemblies");
+        }
+        return null;
 #endif
-			}
-			else
-			{
-				// Includes explicit assembly name
-				//LogLog.Debug(declaringType, "SystemInfo: Loading type ["+typeName+"] from global Type");
+      }
+      else
+      {
+        // Includes explicit assembly name
+        //LogLog.Debug(declaringType, "SystemInfo: Loading type ["+typeName+"] from global Type");
 
 #if NETCF
-				// In NETCF 2 and 3 arg versions seem to behave differently
-				// https://issues.apache.org/jira/browse/LOG4NET-113
-				return Type.GetType(typeName, throwOnError);
+        // In NETCF 2 and 3 arg versions seem to behave differently
+        // https://issues.apache.org/jira/browse/LOG4NET-113
+        return Type.GetType(typeName, throwOnError);
 #else
-				return Type.GetType(typeName, throwOnError, ignoreCase);
+        return Type.GetType(typeName, throwOnError, ignoreCase);
 #endif
-			}
-		}
+      }
+    }
 
 
-		/// <summary>
-		/// Generate a new guid
-		/// </summary>
-		/// <returns>A new Guid</returns>
-		/// <remarks>
-		/// <para>
-		/// Generate a new guid
-		/// </para>
-		/// </remarks>
-		public static Guid NewGuid()
-		{
+    /// <summary>
+    /// Generate a new guid
+    /// </summary>
+    /// <returns>A new Guid</returns>
+    /// <remarks>
+    /// <para>
+    /// Generate a new guid
+    /// </para>
+    /// </remarks>
+    public static Guid NewGuid()
+    {
 #if NETCF_1_0
-			return PocketGuid.NewGuid();
+      return PocketGuid.NewGuid();
 #else
-			return Guid.NewGuid();
+      return Guid.NewGuid();
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Create an <see cref="ArgumentOutOfRangeException"/>
-		/// </summary>
-		/// <param name="parameterName">The name of the parameter that caused the exception</param>
-		/// <param name="actualValue">The value of the argument that causes this exception</param>
-		/// <param name="message">The message that describes the error</param>
-		/// <returns>the ArgumentOutOfRangeException object</returns>
-		/// <remarks>
-		/// <para>
-		/// Create a new instance of the <see cref="ArgumentOutOfRangeException"/> class 
-		/// with a specified error message, the parameter name, and the value 
-		/// of the argument.
-		/// </para>
-		/// <para>
-		/// The Compact Framework does not support the 3 parameter constructor for the
-		/// <see cref="ArgumentOutOfRangeException"/> type. This method provides an
-		/// implementation that works for all platforms.
-		/// </para>
-		/// </remarks>
-		public static ArgumentOutOfRangeException CreateArgumentOutOfRangeException(string parameterName, object actualValue, string message)
-		{
+    /// <summary>
+    /// Create an <see cref="ArgumentOutOfRangeException"/>
+    /// </summary>
+    /// <param name="parameterName">The name of the parameter that caused the exception</param>
+    /// <param name="actualValue">The value of the argument that causes this exception</param>
+    /// <param name="message">The message that describes the error</param>
+    /// <returns>the ArgumentOutOfRangeException object</returns>
+    /// <remarks>
+    /// <para>
+    /// Create a new instance of the <see cref="ArgumentOutOfRangeException"/> class 
+    /// with a specified error message, the parameter name, and the value 
+    /// of the argument.
+    /// </para>
+    /// <para>
+    /// The Compact Framework does not support the 3 parameter constructor for the
+    /// <see cref="ArgumentOutOfRangeException"/> type. This method provides an
+    /// implementation that works for all platforms.
+    /// </para>
+    /// </remarks>
+    public static ArgumentOutOfRangeException CreateArgumentOutOfRangeException(string parameterName, object actualValue, string message)
+    {
 #if NETCF_1_0
-			return new ArgumentOutOfRangeException(message + " [param=" + parameterName + "] [value=" + actualValue + "]");
+      return new ArgumentOutOfRangeException(message + " [param=" + parameterName + "] [value=" + actualValue + "]");
 #elif NETCF_2_0
-			return new ArgumentOutOfRangeException(parameterName, message + " [value=" + actualValue + "]");
+      return new ArgumentOutOfRangeException(parameterName, message + " [value=" + actualValue + "]");
 #else
-			return new ArgumentOutOfRangeException(parameterName, actualValue, message);
+      return new ArgumentOutOfRangeException(parameterName, actualValue, message);
 #endif
-		}
+    }
 
 
-		/// <summary>
-		/// Parse a string into an <see cref="Int32"/> value
-		/// </summary>
-		/// <param name="s">the string to parse</param>
-		/// <param name="val">out param where the parsed value is placed</param>
-		/// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
-		/// <remarks>
-		/// <para>
-		/// Attempts to parse the string into an integer. If the string cannot
-		/// be parsed then this method returns <c>false</c>. The method does not throw an exception.
-		/// </para>
-		/// </remarks>
-		public static bool TryParse(string s, out int val)
-		{
+    /// <summary>
+    /// Parse a string into an <see cref="Int32"/> value
+    /// </summary>
+    /// <param name="s">the string to parse</param>
+    /// <param name="val">out param where the parsed value is placed</param>
+    /// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
+    /// <remarks>
+    /// <para>
+    /// Attempts to parse the string into an integer. If the string cannot
+    /// be parsed then this method returns <c>false</c>. The method does not throw an exception.
+    /// </para>
+    /// </remarks>
+    public static bool TryParse(string s, out int val)
+    {
 #if NETCF
-			val = 0;
-			try
-			{
-				val = int.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
-				return true;
-			}
-			catch
-			{
-			}
+      val = 0;
+      try
+      {
+        val = int.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
+        return true;
+      }
+      catch
+      {
+      }
 
-			return false;
+      return false;
 #else
-			// Initialise out param
-			val = 0;
+      // Initialise out param
+      val = 0;
 
-			try
-			{
-				double doubleVal;
-				if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
-				{
-					val = Convert.ToInt32(doubleVal);
-					return true;
-				}
-			}
-			catch
-			{
-				// Ignore exception, just return false
-			}
+      try
+      {
+        double doubleVal;
+        if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
+        {
+          val = Convert.ToInt32(doubleVal);
+          return true;
+        }
+      }
+      catch
+      {
+        // Ignore exception, just return false
+      }
 
-			return false;
+      return false;
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Parse a string into an <see cref="Int64"/> value
-		/// </summary>
-		/// <param name="s">the string to parse</param>
-		/// <param name="val">out param where the parsed value is placed</param>
-		/// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
-		/// <remarks>
-		/// <para>
-		/// Attempts to parse the string into an integer. If the string cannot
-		/// be parsed then this method returns <c>false</c>. The method does not throw an exception.
-		/// </para>
-		/// </remarks>
-		public static bool TryParse(string s, out long val)
-		{
+    /// <summary>
+    /// Parse a string into an <see cref="Int64"/> value
+    /// </summary>
+    /// <param name="s">the string to parse</param>
+    /// <param name="val">out param where the parsed value is placed</param>
+    /// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
+    /// <remarks>
+    /// <para>
+    /// Attempts to parse the string into an integer. If the string cannot
+    /// be parsed then this method returns <c>false</c>. The method does not throw an exception.
+    /// </para>
+    /// </remarks>
+    public static bool TryParse(string s, out long val)
+    {
 #if NETCF
-			val = 0;
-			try
-			{
-				val = long.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
-				return true;
-			}
-			catch
-			{
-			}
+      val = 0;
+      try
+      {
+        val = long.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
+        return true;
+      }
+      catch
+      {
+      }
 
-			return false;
+      return false;
 #else
-			// Initialise out param
-			val = 0;
+      // Initialise out param
+      val = 0;
 
-			try
-			{
-				double doubleVal;
-				if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
-				{
-					val = Convert.ToInt64(doubleVal);
-					return true;
-				}
-			}
-			catch
-			{
-				// Ignore exception, just return false
-			}
+      try
+      {
+        double doubleVal;
+        if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
+        {
+          val = Convert.ToInt64(doubleVal);
+          return true;
+        }
+      }
+      catch
+      {
+        // Ignore exception, just return false
+      }
 
-			return false;
+      return false;
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Parse a string into an <see cref="Int16"/> value
-		/// </summary>
-		/// <param name="s">the string to parse</param>
-		/// <param name="val">out param where the parsed value is placed</param>
-		/// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
-		/// <remarks>
-		/// <para>
-		/// Attempts to parse the string into an integer. If the string cannot
-		/// be parsed then this method returns <c>false</c>. The method does not throw an exception.
-		/// </para>
-		/// </remarks>
-		public static bool TryParse(string s, out short val)
-		{
+    /// <summary>
+    /// Parse a string into an <see cref="Int16"/> value
+    /// </summary>
+    /// <param name="s">the string to parse</param>
+    /// <param name="val">out param where the parsed value is placed</param>
+    /// <returns><c>true</c> if the string was able to be parsed into an integer</returns>
+    /// <remarks>
+    /// <para>
+    /// Attempts to parse the string into an integer. If the string cannot
+    /// be parsed then this method returns <c>false</c>. The method does not throw an exception.
+    /// </para>
+    /// </remarks>
+    public static bool TryParse(string s, out short val)
+    {
 #if NETCF
-			val = 0;
-			try
-			{
-				val = short.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
-				return true;
-			}
-			catch
-			{
-			}
+      val = 0;
+      try
+      {
+        val = short.Parse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture);
+        return true;
+      }
+      catch
+      {
+      }
 
-			return false;
+      return false;
 #else
-			// Initialise out param
-			val = 0;
+      // Initialise out param
+      val = 0;
 
-			try
-			{
-				double doubleVal;
-				if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
-				{
-					val = Convert.ToInt16(doubleVal);
-					return true;
-				}
-			}
-			catch
-			{
-				// Ignore exception, just return false
-			}
+      try
+      {
+        double doubleVal;
+        if (Double.TryParse(s, System.Globalization.NumberStyles.Integer, System.Globalization.CultureInfo.InvariantCulture, out doubleVal))
+        {
+          val = Convert.ToInt16(doubleVal);
+          return true;
+        }
+      }
+      catch
+      {
+        // Ignore exception, just return false
+      }
 
-			return false;
+      return false;
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Lookup an application setting
-		/// </summary>
-		/// <param name="key">the application settings key to lookup</param>
-		/// <returns>the value for the key, or <c>null</c></returns>
-		/// <remarks>
-		/// <para>
-		/// Configuration APIs are not supported under the Compact Framework
-		/// </para>
-		/// </remarks>
-		public static string GetAppSetting(string key)
-		{
-			try
-			{
+    /// <summary>
+    /// Lookup an application setting
+    /// </summary>
+    /// <param name="key">the application settings key to lookup</param>
+    /// <returns>the value for the key, or <c>null</c></returns>
+    /// <remarks>
+    /// <para>
+    /// Configuration APIs are not supported under the Compact Framework
+    /// </para>
+    /// </remarks>
+    public static string GetAppSetting(string key)
+    {
+      try
+      {
 #if NETCF || NETSTANDARD1_3
-				// Configuration APIs are not suported under the Compact Framework
+        // Configuration APIs are not suported under the Compact Framework
 #elif NET_2_0 || NETSTANDARD2_0
-				return ConfigurationManager.AppSettings[key];
+        return ConfigurationManager.AppSettings[key];
 #else
-				return ConfigurationSettings.AppSettings[key];
+        return ConfigurationSettings.AppSettings[key];
 #endif
-			}
-			catch (Exception ex)
-			{
-				// If an exception is thrown here then it looks like the config file does not parse correctly.
-				LogLog.Error(declaringType, "Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex);
-			}
-			return null;
-		}
+      }
+      catch (Exception ex)
+      {
+        // If an exception is thrown here then it looks like the config file does not parse correctly.
+        LogLog.Error(declaringType, "Exception while reading ConfigurationSettings. Check your .config file is well formed XML.", ex);
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Convert a path into a fully qualified local file path.
-		/// </summary>
-		/// <param name="path">The path to convert.</param>
-		/// <returns>The fully qualified path.</returns>
-		/// <remarks>
-		/// <para>
-		/// Converts the path specified to a fully
-		/// qualified path. If the path is relative it is
-		/// taken as relative from the application base 
-		/// directory.
-		/// </para>
-		/// <para>
-		/// The path specified must be a local file path, a URI is not supported.
-		/// </para>
-		/// </remarks>
-		public static string ConvertToFullPath(string path)
-		{
-			if (path == null)
-			{
-				throw new ArgumentNullException("path");
-			}
+    /// <summary>
+    /// Convert a path into a fully qualified local file path.
+    /// </summary>
+    /// <param name="path">The path to convert.</param>
+    /// <returns>The fully qualified path.</returns>
+    /// <remarks>
+    /// <para>
+    /// Converts the path specified to a fully
+    /// qualified path. If the path is relative it is
+    /// taken as relative from the application base 
+    /// directory.
+    /// </para>
+    /// <para>
+    /// The path specified must be a local file path, a URI is not supported.
+    /// </para>
+    /// </remarks>
+    public static string ConvertToFullPath(string path)
+    {
+      if (path == null)
+      {
+        throw new ArgumentNullException("path");
+      }
 
-			string baseDirectory = "";
-			try
-			{
-				string applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
-				if (applicationBaseDirectory != null)
-				{
-					// applicationBaseDirectory may be a URI not a local file path
-					Uri applicationBaseDirectoryUri = new Uri(applicationBaseDirectory);
-					if (applicationBaseDirectoryUri.IsFile)
-					{
-						baseDirectory = applicationBaseDirectoryUri.LocalPath;
-					}
-				}
-			}
-			catch
-			{
-				// Ignore URI exceptions & SecurityExceptions from SystemInfo.ApplicationBaseDirectory
-			}
+      string baseDirectory = "";
+      try
+      {
+        string applicationBaseDirectory = SystemInfo.ApplicationBaseDirectory;
+        if (applicationBaseDirectory != null)
+        {
+          // applicationBaseDirectory may be a URI not a local file path
+          Uri applicationBaseDirectoryUri = new Uri(applicationBaseDirectory);
+          if (applicationBaseDirectoryUri.IsFile)
+          {
+            baseDirectory = applicationBaseDirectoryUri.LocalPath;
+          }
+        }
+      }
+      catch
+      {
+        // Ignore URI exceptions & SecurityExceptions from SystemInfo.ApplicationBaseDirectory
+      }
 
-			if (baseDirectory != null && baseDirectory.Length > 0)
-			{
-				// Note that Path.Combine will return the second path if it is rooted
-				return Path.GetFullPath(Path.Combine(baseDirectory, path));
-			}
-			return Path.GetFullPath(path);
-		}
+      if (baseDirectory != null && baseDirectory.Length > 0)
+      {
+        // Note that Path.Combine will return the second path if it is rooted
+        return Path.GetFullPath(Path.Combine(baseDirectory, path));
+      }
+      return Path.GetFullPath(path);
+    }
 
-		/// <summary>
-		/// Creates a new case-insensitive instance of the <see cref="Hashtable"/> class with the default initial capacity. 
-		/// </summary>
-		/// <returns>A new case-insensitive instance of the <see cref="Hashtable"/> class with the default initial capacity</returns>
-		/// <remarks>
-		/// <para>
-		/// The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer.
-		/// </para>
-		/// </remarks>
-		public static Hashtable CreateCaseInsensitiveHashtable()
-		{
+    /// <summary>
+    /// Creates a new case-insensitive instance of the <see cref="Hashtable"/> class with the default initial capacity. 
+    /// </summary>
+    /// <returns>A new case-insensitive instance of the <see cref="Hashtable"/> class with the default initial capacity</returns>
+    /// <remarks>
+    /// <para>
+    /// The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer.
+    /// </para>
+    /// </remarks>
+    public static Hashtable CreateCaseInsensitiveHashtable()
+    {
 #if NETCF_1_0
-			return new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
+      return new Hashtable(CaseInsensitiveHashCodeProvider.Default, CaseInsensitiveComparer.Default);
 #elif NETCF_2_0 || NET_2_0 || MONO_2_0 || MONO_3_5 || MONO_4_0
-			return new Hashtable(StringComparer.OrdinalIgnoreCase);
+      return new Hashtable(StringComparer.OrdinalIgnoreCase);
 #else
-			return System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable();
+      return System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable();
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Tests two strings for equality, the ignoring case.
-		/// </summary>
-		/// <remarks>
-		/// If the platform permits, culture information is ignored completely (ordinal comparison).
-		/// The aim of this method is to provide a fast comparison that deals with <c>null</c> and ignores different casing.
-		/// It is not supposed to deal with various, culture-specific habits.
-		/// Use it to compare against pure ASCII constants, like keywords etc.
-		/// </remarks>
-		/// <param name="a">The one string.</param>
-		/// <param name="b">The other string.</param>
-		/// <returns><c>true</c> if the strings are equal, <c>false</c> otherwise.</returns>
-		public static Boolean EqualsIgnoringCase(String a, String b)
-		{
+    /// <summary>
+    /// Tests two strings for equality, the ignoring case.
+    /// </summary>
+    /// <remarks>
+    /// If the platform permits, culture information is ignored completely (ordinal comparison).
+    /// The aim of this method is to provide a fast comparison that deals with <c>null</c> and ignores different casing.
+    /// It is not supposed to deal with various, culture-specific habits.
+    /// Use it to compare against pure ASCII constants, like keywords etc.
+    /// </remarks>
+    /// <param name="a">The one string.</param>
+    /// <param name="b">The other string.</param>
+    /// <returns><c>true</c> if the strings are equal, <c>false</c> otherwise.</returns>
+    public static Boolean EqualsIgnoringCase(String a, String b)
+    {
 #if NET_1_0 || NET_1_1 || NETCF_1_0
-						return string.Compare(a, b, true, System.Globalization.CultureInfo.InvariantCulture) == 0
+            return string.Compare(a, b, true, System.Globalization.CultureInfo.InvariantCulture) == 0
 #elif NETSTANDARD1_3
-						return CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.IgnoreCase) == 0;
+            return CultureInfo.InvariantCulture.CompareInfo.Compare(a, b, CompareOptions.IgnoreCase) == 0;
 #else // >= .NET-2.0
-			return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
+      return String.Equals(a, b, StringComparison.OrdinalIgnoreCase);
 #endif
-		}
+    }
 
-		#endregion Public Static Methods
+    #endregion Public Static Methods
 
-		#region Private Static Methods
+    #region Private Static Methods
 
 #if NETCF
-		private static string NativeEntryAssemblyLocation 
-		{
-			get 
-			{
-				StringBuilder moduleName = null;
+    private static string NativeEntryAssemblyLocation 
+    {
+      get 
+      {
+        StringBuilder moduleName = null;
 
-				IntPtr moduleHandle = GetModuleHandle(IntPtr.Zero);
+        IntPtr moduleHandle = GetModuleHandle(IntPtr.Zero);
 
-				if (moduleHandle != IntPtr.Zero) 
-				{
-					moduleName = new StringBuilder(255);
-					if (GetModuleFileName(moduleHandle, moduleName,	moduleName.Capacity) == 0) 
-					{
-						throw new NotSupportedException(NativeError.GetLastError().ToString());
-					}
-				} 
-				else 
-				{
-					throw new NotSupportedException(NativeError.GetLastError().ToString());
-				}
+        if (moduleHandle != IntPtr.Zero) 
+        {
+          moduleName = new StringBuilder(255);
+          if (GetModuleFileName(moduleHandle, moduleName,  moduleName.Capacity) == 0) 
+          {
+            throw new NotSupportedException(NativeError.GetLastError().ToString());
+          }
+        } 
+        else 
+        {
+          throw new NotSupportedException(NativeError.GetLastError().ToString());
+        }
 
-				return moduleName.ToString();
-			}
-		}
+        return moduleName.ToString();
+      }
+    }
 
-		[DllImport("CoreDll.dll", SetLastError=true, CharSet=CharSet.Unicode)]
-		private static extern IntPtr GetModuleHandle(IntPtr ModuleName);
+    [DllImport("CoreDll.dll", SetLastError=true, CharSet=CharSet.Unicode)]
+    private static extern IntPtr GetModuleHandle(IntPtr ModuleName);
 
-		[DllImport("CoreDll.dll", SetLastError=true, CharSet=CharSet.Unicode)]
-		private static extern Int32 GetModuleFileName(
-			IntPtr hModule,
-			StringBuilder ModuleName,
-			Int32 cch);
+    [DllImport("CoreDll.dll", SetLastError=true, CharSet=CharSet.Unicode)]
+    private static extern Int32 GetModuleFileName(
+      IntPtr hModule,
+      StringBuilder ModuleName,
+      Int32 cch);
 
 #endif
 
-		#endregion Private Static Methods
+    #endregion Private Static Methods
 
-		#region Public Static Fields
+    #region Public Static Fields
 
-		/// <summary>
-		/// Gets an empty array of types.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The <c>Type.EmptyTypes</c> field is not available on
-		/// the .NET Compact Framework 1.0.
-		/// </para>
-		/// </remarks>
-		public static readonly Type[] EmptyTypes = new Type[0];
+    /// <summary>
+    /// Gets an empty array of types.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The <c>Type.EmptyTypes</c> field is not available on
+    /// the .NET Compact Framework 1.0.
+    /// </para>
+    /// </remarks>
+    public static readonly Type[] EmptyTypes = new Type[0];
 
-		#endregion Public Static Fields
+    #endregion Public Static Fields
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-		/// <summary>
-		/// The fully qualified type of the SystemInfo class.
-		/// </summary>
-		/// <remarks>
-		/// Used by the internal logger to record the Type of the
-		/// log message.
-		/// </remarks>
-		private static readonly Type declaringType = typeof(SystemInfo);
+    /// <summary>
+    /// The fully qualified type of the SystemInfo class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(SystemInfo);
 
-		/// <summary>
-		/// Cache the host name for the current machine
-		/// </summary>
-		private static string s_hostName;
+    /// <summary>
+    /// Cache the host name for the current machine
+    /// </summary>
+    private static string s_hostName;
 
-		/// <summary>
-		/// Cache the application friendly name
-		/// </summary>
-		private static string s_appFriendlyName;
+    /// <summary>
+    /// Cache the application friendly name
+    /// </summary>
+    private static string s_appFriendlyName;
 
-		/// <summary>
-		/// Text to output when a <c>null</c> is encountered.
-		/// </summary>
-		private static string s_nullText;
+    /// <summary>
+    /// Text to output when a <c>null</c> is encountered.
+    /// </summary>
+    private static string s_nullText;
 
-		/// <summary>
-		/// Text to output when an unsupported feature is requested.
-		/// </summary>
-		private static string s_notAvailableText;
+    /// <summary>
+    /// Text to output when an unsupported feature is requested.
+    /// </summary>
+    private static string s_notAvailableText;
 
-		/// <summary>
-		/// Start time for the current process.
-		/// </summary>
-		private static DateTime s_processStartTimeUtc = DateTime.UtcNow;
+    /// <summary>
+    /// Start time for the current process.
+    /// </summary>
+    private static DateTime s_processStartTimeUtc = DateTime.UtcNow;
 
-		#endregion
+    #endregion
 
-		#region Compact Framework Helper Classes
+    #region Compact Framework Helper Classes
 #if NETCF_1_0
-		/// <summary>
-		/// Generate GUIDs on the .NET Compact Framework.
-		/// </summary>
-		public class PocketGuid
-		{
-			// guid variant types
-			private enum GuidVariant
-			{
-				ReservedNCS = 0x00,
-				Standard = 0x02,
-				ReservedMicrosoft = 0x06,
-				ReservedFuture = 0x07
-			}
+    /// <summary>
+    /// Generate GUIDs on the .NET Compact Framework.
+    /// </summary>
+    public class PocketGuid
+    {
+      // guid variant types
+      private enum GuidVariant
+      {
+        ReservedNCS = 0x00,
+        Standard = 0x02,
+        ReservedMicrosoft = 0x06,
+        ReservedFuture = 0x07
+      }
 
-			// guid version types
-			private enum GuidVersion
-			{
-				TimeBased = 0x01,
-				Reserved = 0x02,
-				NameBased = 0x03,
-				Random = 0x04
-			}
+      // guid version types
+      private enum GuidVersion
+      {
+        TimeBased = 0x01,
+        Reserved = 0x02,
+        NameBased = 0x03,
+        Random = 0x04
+      }
 
-			// constants that are used in the class
-			private class Const
-			{
-				// number of bytes in guid
-				public const int ByteArraySize = 16;
+      // constants that are used in the class
+      private class Const
+      {
+        // number of bytes in guid
+        public const int ByteArraySize = 16;
 
-				// multiplex variant info
-				public const int VariantByte = 8;
-				public const int VariantByteMask = 0x3f;
-				public const int VariantByteShift = 6;
+        // multiplex variant info
+        public const int VariantByte = 8;
+        public const int VariantByteMask = 0x3f;
+        public const int VariantByteShift = 6;
 
-				// multiplex version info
-				public const int VersionByte = 7;
-				public const int VersionByteMask = 0x0f;
-				public const int VersionByteShift = 4;
-			}
+        // multiplex version info
+        public const int VersionByte = 7;
+        public const int VersionByteMask = 0x0f;
+        public const int VersionByteShift = 4;
+      }
 
-			// imports for the crypto api functions
-			private class WinApi
-			{
-				public const uint PROV_RSA_FULL = 1;
-				public const uint CRYPT_VERIFYCONTEXT = 0xf0000000;
+      // imports for the crypto api functions
+      private class WinApi
+      {
+        public const uint PROV_RSA_FULL = 1;
+        public const uint CRYPT_VERIFYCONTEXT = 0xf0000000;
 
-				[DllImport("CoreDll.dll")] 
-				public static extern bool CryptAcquireContext(
-					ref IntPtr phProv, string pszContainer, string pszProvider,
-					uint dwProvType, uint dwFlags);
+        [DllImport("CoreDll.dll")] 
+        public static extern bool CryptAcquireContext(
+          ref IntPtr phProv, string pszContainer, string pszProvider,
+          uint dwProvType, uint dwFlags);
 
-				[DllImport("CoreDll.dll")] 
-				public static extern bool CryptReleaseContext( 
-					IntPtr hProv, uint dwFlags);
+        [DllImport("CoreDll.dll")] 
+        public static extern bool CryptReleaseContext( 
+          IntPtr hProv, uint dwFlags);
 
-				[DllImport("CoreDll.dll")] 
-				public static extern bool CryptGenRandom(
-					IntPtr hProv, int dwLen, byte[] pbBuffer);
-			}
+        [DllImport("CoreDll.dll")] 
+        public static extern bool CryptGenRandom(
+          IntPtr hProv, int dwLen, byte[] pbBuffer);
+      }
 
-			// all static methods
-			private PocketGuid()
-			{
-			}
+      // all static methods
+      private PocketGuid()
+      {
+      }
 
-			/// <summary>
-			/// Return a new System.Guid object.
-			/// </summary>
-			public static Guid NewGuid()
-			{
-				IntPtr hCryptProv = IntPtr.Zero;
-				Guid guid = Guid.Empty;
+      /// <summary>
+      /// Return a new System.Guid object.
+      /// </summary>
+      public static Guid NewGuid()
+      {
+        IntPtr hCryptProv = IntPtr.Zero;
+        Guid guid = Guid.Empty;
 
-				try
-				{
-					// holds random bits for guid
-					byte[] bits = new byte[Const.ByteArraySize];
+        try
+        {
+          // holds random bits for guid
+          byte[] bits = new byte[Const.ByteArraySize];
 
-					// get crypto provider handle
-					if (!WinApi.CryptAcquireContext(ref hCryptProv, null, null, 
-						WinApi.PROV_RSA_FULL, WinApi.CRYPT_VERIFYCONTEXT))
-					{
-						throw new SystemException(
-							"Failed to acquire cryptography handle.");
-					}
+          // get crypto provider handle
+          if (!WinApi.CryptAcquireContext(ref hCryptProv, null, null, 
+            WinApi.PROV_RSA_FULL, WinApi.CRYPT_VERIFYCONTEXT))
+          {
+            throw new SystemException(
+              "Failed to acquire cryptography handle.");
+          }
 
-					// generate a 128 bit (16 byte) cryptographically random number
-					if (!WinApi.CryptGenRandom(hCryptProv, bits.Length, bits))
-					{
-						throw new SystemException(
-							"Failed to generate cryptography random bytes.");
-					}
+          // generate a 128 bit (16 byte) cryptographically random number
+          if (!WinApi.CryptGenRandom(hCryptProv, bits.Length, bits))
+          {
+            throw new SystemException(
+              "Failed to generate cryptography random bytes.");
+          }
 
-					// set the variant
-					bits[Const.VariantByte] &= Const.VariantByteMask;
-					bits[Const.VariantByte] |= 
-						((int)GuidVariant.Standard << Const.VariantByteShift);
+          // set the variant
+          bits[Const.VariantByte] &= Const.VariantByteMask;
+          bits[Const.VariantByte] |= 
+            ((int)GuidVariant.Standard << Const.VariantByteShift);
 
-					// set the version
-					bits[Const.VersionByte] &= Const.VersionByteMask;
-					bits[Const.VersionByte] |= 
-						((int)GuidVersion.Random << Const.VersionByteShift);
+          // set the version
+          bits[Const.VersionByte] &= Const.VersionByteMask;
+          bits[Const.VersionByte] |= 
+            ((int)GuidVersion.Random << Const.VersionByteShift);
 
-					// create the new System.Guid object
-					guid = new Guid(bits);
-				}
-				finally
-				{
-					// release the crypto provider handle
-					if (hCryptProv != IntPtr.Zero)
-						WinApi.CryptReleaseContext(hCryptProv, 0);
-				}
+          // create the new System.Guid object
+          guid = new Guid(bits);
+        }
+        finally
+        {
+          // release the crypto provider handle
+          if (hCryptProv != IntPtr.Zero)
+            WinApi.CryptReleaseContext(hCryptProv, 0);
+        }
 
-				return guid;
-			}
-		}
+        return guid;
+      }
+    }
 #endif
-		#endregion Compact Framework Helper Classes
-	}
+    #endregion Compact Framework Helper Classes
+  }
 }
diff --git a/src/log4net/Util/SystemStringFormat.cs b/src/log4net/Util/SystemStringFormat.cs
index f28f077..0d75e89 100644
--- a/src/log4net/Util/SystemStringFormat.cs
+++ b/src/log4net/Util/SystemStringFormat.cs
@@ -24,222 +24,222 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Utility class that represents a format string.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Utility class that represents a format string.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class SystemStringFormat
-	{
-		private readonly IFormatProvider m_provider;
+  /// <summary>
+  /// Utility class that represents a format string.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Utility class that represents a format string.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class SystemStringFormat
+  {
+    private readonly IFormatProvider m_provider;
 
-		/// <summary>
-		/// Format
-		/// </summary>
-		public string Format { get; set; }
+    /// <summary>
+    /// Format
+    /// </summary>
+    public string Format { get; set; }
 
-		/// <summary>
-		/// Args
-		/// </summary>
-		public object[] Args { get; set; }
+    /// <summary>
+    /// Args
+    /// </summary>
+    public object[] Args { get; set; }
 
-		#region Constructor
+    #region Constructor
 
-		/// <summary>
-		/// Initialise the <see cref="SystemStringFormat"/>
-		/// </summary>
-		/// <param name="provider">An <see cref="System.IFormatProvider"/> that supplies culture-specific formatting information.</param>
-		/// <param name="format">A <see cref="System.String"/> containing zero or more format items.</param>
-		/// <param name="args">An <see cref="System.Object"/> array containing zero or more objects to format.</param>
-		public SystemStringFormat(IFormatProvider provider, string format, params object[] args)
-		{
-			m_provider = provider;
-			Format = format;
-			Args = args;
-		}
+    /// <summary>
+    /// Initialise the <see cref="SystemStringFormat"/>
+    /// </summary>
+    /// <param name="provider">An <see cref="System.IFormatProvider"/> that supplies culture-specific formatting information.</param>
+    /// <param name="format">A <see cref="System.String"/> containing zero or more format items.</param>
+    /// <param name="args">An <see cref="System.Object"/> array containing zero or more objects to format.</param>
+    public SystemStringFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      m_provider = provider;
+      Format = format;
+      Args = args;
+    }
 
-		#endregion Constructor
+    #endregion Constructor
 
-		/// <summary>
-		/// Format the string and arguments
-		/// </summary>
-		/// <returns>the formatted string</returns>
-		public override string ToString()
-		{
-			return StringFormat(m_provider, Format, Args);
-		}
+    /// <summary>
+    /// Format the string and arguments
+    /// </summary>
+    /// <returns>the formatted string</returns>
+    public override string ToString()
+    {
+      return StringFormat(m_provider, Format, Args);
+    }
 
-		#region StringFormat
+    #region StringFormat
 
-		/// <summary>
-		/// Replaces the format item in a specified <see cref="System.String"/> with the text equivalent 
-		/// of the value of a corresponding <see cref="System.Object"/> instance in a specified array.
-		/// A specified parameter supplies culture-specific formatting information.
-		/// </summary>
-		/// <param name="provider">An <see cref="System.IFormatProvider"/> that supplies culture-specific formatting information.</param>
-		/// <param name="format">A <see cref="System.String"/> containing zero or more format items.</param>
-		/// <param name="args">An <see cref="System.Object"/> array containing zero or more objects to format.</param>
-		/// <returns>
-		/// A copy of format in which the format items have been replaced by the <see cref="System.String"/> 
-		/// equivalent of the corresponding instances of <see cref="System.Object"/> in args.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// This method does not throw exceptions. If an exception thrown while formatting the result the
-		/// exception and arguments are returned in the result string.
-		/// </para>
-		/// </remarks>
-		private static string StringFormat(IFormatProvider provider, string format, params object[] args)
-		{
-			try
-			{
-				// The format is missing, log null value
-				if (format == null)
-				{
-					return null;
-				}
+    /// <summary>
+    /// Replaces the format item in a specified <see cref="System.String"/> with the text equivalent 
+    /// of the value of a corresponding <see cref="System.Object"/> instance in a specified array.
+    /// A specified parameter supplies culture-specific formatting information.
+    /// </summary>
+    /// <param name="provider">An <see cref="System.IFormatProvider"/> that supplies culture-specific formatting information.</param>
+    /// <param name="format">A <see cref="System.String"/> containing zero or more format items.</param>
+    /// <param name="args">An <see cref="System.Object"/> array containing zero or more objects to format.</param>
+    /// <returns>
+    /// A copy of format in which the format items have been replaced by the <see cref="System.String"/> 
+    /// equivalent of the corresponding instances of <see cref="System.Object"/> in args.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// This method does not throw exceptions. If an exception thrown while formatting the result the
+    /// exception and arguments are returned in the result string.
+    /// </para>
+    /// </remarks>
+    private static string StringFormat(IFormatProvider provider, string format, params object[] args)
+    {
+      try
+      {
+        // The format is missing, log null value
+        if (format == null)
+        {
+          return null;
+        }
 
-				// The args are missing - should not happen unless we are called explicitly with a null array
-				if (args == null)
-				{
-					return format;
-				}
+        // The args are missing - should not happen unless we are called explicitly with a null array
+        if (args == null)
+        {
+          return format;
+        }
 
-				// Try to format the string
-				return String.Format(provider, format, args);
-			}
-			catch(Exception ex)
-			{
-				log4net.Util.LogLog.Warn(declaringType, "Exception while rendering format ["+format+"]", ex);
-				return StringFormatError(ex, format, args);
-			}
+        // Try to format the string
+        return String.Format(provider, format, args);
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Warn(declaringType, "Exception while rendering format [" + format + "]", ex);
+        return StringFormatError(ex, format, args);
+      }
 #if !NET_2_0 && !MONO_2_0 && !MONO_3_5 && !MONO_4_0 && !NETSTANDARD
-			catch
-			{
-				log4net.Util.LogLog.Warn(declaringType, "Exception while rendering format ["+format+"]");
-				return StringFormatError(null, format, args);
-			}
+      catch
+      {
+        log4net.Util.LogLog.Warn(declaringType, "Exception while rendering format ["+format+"]");
+        return StringFormatError(null, format, args);
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Process an error during StringFormat
-		/// </summary>
-		private static string StringFormatError(Exception formatException, string format, object[] args)
-		{
-			try
-			{
-				StringBuilder buf = new StringBuilder("<log4net.Error>");
+    /// <summary>
+    /// Process an error during StringFormat
+    /// </summary>
+    private static string StringFormatError(Exception formatException, string format, object[] args)
+    {
+      try
+      {
+        StringBuilder buf = new StringBuilder("<log4net.Error>");
 
-				if (formatException != null)
-				{
-					buf.Append("Exception during StringFormat: ").Append(formatException.Message);
-				}
-				else
-				{
-					buf.Append("Exception during StringFormat");
-				}
-				buf.Append(" <format>").Append(format).Append("</format>");
-				buf.Append("<args>");
-				RenderArray(args, buf);
-				buf.Append("</args>");
-				buf.Append("</log4net.Error>");
+        if (formatException != null)
+        {
+          buf.Append("Exception during StringFormat: ").Append(formatException.Message);
+        }
+        else
+        {
+          buf.Append("Exception during StringFormat");
+        }
+        buf.Append(" <format>").Append(format).Append("</format>");
+        buf.Append("<args>");
+        RenderArray(args, buf);
+        buf.Append("</args>");
+        buf.Append("</log4net.Error>");
 
-				return buf.ToString();
-			}
-			catch(Exception ex)
-			{
-				log4net.Util.LogLog.Error(declaringType, "INTERNAL ERROR during StringFormat error handling", ex);
-				return "<log4net.Error>Exception during StringFormat. See Internal Log.</log4net.Error>";
-			}
+        return buf.ToString();
+      }
+      catch (Exception ex)
+      {
+        log4net.Util.LogLog.Error(declaringType, "INTERNAL ERROR during StringFormat error handling", ex);
+        return "<log4net.Error>Exception during StringFormat. See Internal Log.</log4net.Error>";
+      }
 #if !NET_2_0 && !MONO_2_0 && !MONO_3_5 && !MONO_4_0 && !NETSTANDARD
-			catch
-			{
-				log4net.Util.LogLog.Error(declaringType, "INTERNAL ERROR during StringFormat error handling");
-				return "<log4net.Error>Exception during StringFormat. See Internal Log.</log4net.Error>";
-			}
+      catch
+      {
+        log4net.Util.LogLog.Error(declaringType, "INTERNAL ERROR during StringFormat error handling");
+        return "<log4net.Error>Exception during StringFormat. See Internal Log.</log4net.Error>";
+      }
 #endif
-		}
+    }
 
-		/// <summary>
-		/// Dump the contents of an array into a string builder
-		/// </summary>
-		private static void RenderArray(Array array, StringBuilder buffer)
-		{
-			if (array == null)
-			{
-				buffer.Append(SystemInfo.NullText);
-			}
-			else
-			{
-				if (array.Rank != 1)
-				{
-					buffer.Append(array.ToString());
-				}
-				else
-				{
-					buffer.Append("{");
-					int len = array.Length;
+    /// <summary>
+    /// Dump the contents of an array into a string builder
+    /// </summary>
+    private static void RenderArray(Array array, StringBuilder buffer)
+    {
+      if (array == null)
+      {
+        buffer.Append(SystemInfo.NullText);
+      }
+      else
+      {
+        if (array.Rank != 1)
+        {
+          buffer.Append(array.ToString());
+        }
+        else
+        {
+          buffer.Append("{");
+          int len = array.Length;
 
-					if (len > 0)
-					{
-						RenderObject(array.GetValue(0), buffer);
-						for (int i = 1; i < len; i++)
-						{
-							buffer.Append(", ");
-							RenderObject(array.GetValue(i), buffer);
-						}
-					}
-					buffer.Append("}");
-				}
-			}
-		}
+          if (len > 0)
+          {
+            RenderObject(array.GetValue(0), buffer);
+            for (int i = 1; i < len; i++)
+            {
+              buffer.Append(", ");
+              RenderObject(array.GetValue(i), buffer);
+            }
+          }
+          buffer.Append("}");
+        }
+      }
+    }
 
-		/// <summary>
-		/// Dump an object to a string
-		/// </summary>
-		private static void RenderObject(Object obj, StringBuilder buffer)
-		{
-			if (obj == null)
-			{
-				buffer.Append(SystemInfo.NullText);
-			}
-			else
-			{
-				try
-				{
-					buffer.Append(obj);
-				}
-				catch(Exception ex)
-				{
-					buffer.Append("<Exception: ").Append(ex.Message).Append(">");
-				}
+    /// <summary>
+    /// Dump an object to a string
+    /// </summary>
+    private static void RenderObject(Object obj, StringBuilder buffer)
+    {
+      if (obj == null)
+      {
+        buffer.Append(SystemInfo.NullText);
+      }
+      else
+      {
+        try
+        {
+          buffer.Append(obj);
+        }
+        catch (Exception ex)
+        {
+          buffer.Append("<Exception: ").Append(ex.Message).Append(">");
+        }
 #if !NET_2_0 && !MONO_2_0 && !MONO_3_5 && !MONO_4_0 && !NETSTANDARD
-				catch
-				{
-					buffer.Append("<Exception>");
-				}
+        catch
+        {
+          buffer.Append("<Exception>");
+        }
 #endif
-			}
-		}
+      }
+    }
 
-		#endregion StringFormat
+    #endregion StringFormat
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the SystemStringFormat class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(SystemStringFormat);
+    /// <summary>
+    /// The fully qualified type of the SystemStringFormat class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(SystemStringFormat);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/TextWriterAdapter.cs b/src/log4net/Util/TextWriterAdapter.cs
index 851eac4..24304f0 100644
--- a/src/log4net/Util/TextWriterAdapter.cs
+++ b/src/log4net/Util/TextWriterAdapter.cs
@@ -24,216 +24,216 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Adapter that extends <see cref="TextWriter"/> and forwards all
-	/// messages to an instance of <see cref="TextWriter"/>.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Adapter that extends <see cref="TextWriter"/> and forwards all
-	/// messages to an instance of <see cref="TextWriter"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public abstract class TextWriterAdapter : TextWriter
-	{
-		#region Private Member Variables
+  /// <summary>
+  /// Adapter that extends <see cref="TextWriter"/> and forwards all
+  /// messages to an instance of <see cref="TextWriter"/>.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Adapter that extends <see cref="TextWriter"/> and forwards all
+  /// messages to an instance of <see cref="TextWriter"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public abstract class TextWriterAdapter : TextWriter
+  {
+    #region Private Member Variables
 
-		/// <summary>
-		/// The writer to forward messages to
-		/// </summary>
-		private TextWriter m_writer;
+    /// <summary>
+    /// The writer to forward messages to
+    /// </summary>
+    private TextWriter m_writer;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Create an instance of <see cref="TextWriterAdapter"/> that forwards all
-		/// messages to a <see cref="TextWriter"/>.
-		/// </summary>
-		/// <param name="writer">The <see cref="TextWriter"/> to forward to</param>
-		/// <remarks>
-		/// <para>
-		/// Create an instance of <see cref="TextWriterAdapter"/> that forwards all
-		/// messages to a <see cref="TextWriter"/>.
-		/// </para>
-		/// </remarks>
-		protected TextWriterAdapter(TextWriter writer) :  base(CultureInfo.InvariantCulture)
-		{
-			m_writer = writer;
-		}
+    /// <summary>
+    /// Create an instance of <see cref="TextWriterAdapter"/> that forwards all
+    /// messages to a <see cref="TextWriter"/>.
+    /// </summary>
+    /// <param name="writer">The <see cref="TextWriter"/> to forward to</param>
+    /// <remarks>
+    /// <para>
+    /// Create an instance of <see cref="TextWriterAdapter"/> that forwards all
+    /// messages to a <see cref="TextWriter"/>.
+    /// </para>
+    /// </remarks>
+    protected TextWriterAdapter(TextWriter writer) : base(CultureInfo.InvariantCulture)
+    {
+      m_writer = writer;
+    }
 
-		#endregion
+    #endregion
 
-		#region Protected Instance Properties
+    #region Protected Instance Properties
 
-		/// <summary>
-		/// Gets or sets the underlying <see cref="TextWriter" />.
-		/// </summary>
-		/// <value>
-		/// The underlying <see cref="TextWriter" />.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the underlying <see cref="TextWriter" />.
-		/// </para>
-		/// </remarks>
-		protected TextWriter Writer 
-		{
-			get { return m_writer; }
-			set { m_writer = value; }
-		}
+    /// <summary>
+    /// Gets or sets the underlying <see cref="TextWriter" />.
+    /// </summary>
+    /// <value>
+    /// The underlying <see cref="TextWriter" />.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the underlying <see cref="TextWriter" />.
+    /// </para>
+    /// </remarks>
+    protected TextWriter Writer
+    {
+      get { return m_writer; }
+      set { m_writer = value; }
+    }
 
-		#endregion Protected Instance Properties
+    #endregion Protected Instance Properties
 
-		#region Public Properties
-    
-		/// <summary>
-		/// The Encoding in which the output is written
-		/// </summary>
-		/// <value>
-		/// The <see cref="Encoding"/>
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The Encoding in which the output is written
-		/// </para>
-		/// </remarks>
-		public override Encoding Encoding 
-		{
-			get { return m_writer.Encoding; }
-		}
+    #region Public Properties
 
-		/// <summary>
-		/// Gets an object that controls formatting
-		/// </summary>
-		/// <value>
-		/// The format provider
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets an object that controls formatting
-		/// </para>
-		/// </remarks>
-		public override IFormatProvider FormatProvider 
-		{
-			get { return m_writer.FormatProvider; }
-		}
+    /// <summary>
+    /// The Encoding in which the output is written
+    /// </summary>
+    /// <value>
+    /// The <see cref="Encoding"/>
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The Encoding in which the output is written
+    /// </para>
+    /// </remarks>
+    public override Encoding Encoding
+    {
+      get { return m_writer.Encoding; }
+    }
 
-		/// <summary>
-		/// Gets or sets the line terminator string used by the TextWriter
-		/// </summary>
-		/// <value>
-		/// The line terminator to use
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the line terminator string used by the TextWriter
-		/// </para>
-		/// </remarks>
-		public override String NewLine 
-		{
-			get { return m_writer.NewLine; }
-			set { m_writer.NewLine = value; }
-		}
+    /// <summary>
+    /// Gets an object that controls formatting
+    /// </summary>
+    /// <value>
+    /// The format provider
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets an object that controls formatting
+    /// </para>
+    /// </remarks>
+    public override IFormatProvider FormatProvider
+    {
+      get { return m_writer.FormatProvider; }
+    }
 
-		#endregion
+    /// <summary>
+    /// Gets or sets the line terminator string used by the TextWriter
+    /// </summary>
+    /// <value>
+    /// The line terminator to use
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the line terminator string used by the TextWriter
+    /// </para>
+    /// </remarks>
+    public override String NewLine
+    {
+      get { return m_writer.NewLine; }
+      set { m_writer.NewLine = value; }
+    }
 
-		#region Public Methods
+    #endregion
 
-		/// <summary>
-		/// Closes the writer and releases any system resources associated with the writer
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// </para>
-		/// </remarks>
+    #region Public Methods
+
+    /// <summary>
+    /// Closes the writer and releases any system resources associated with the writer
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// </para>
+    /// </remarks>
 #if !NETSTANDARD1_3
-		override
+    override
 #else
-		virtual
+    virtual
 #endif
-		public void Close() 
-		{
-			m_writer.Close();
-		}
+    public void Close()
+    {
+      m_writer.Close();
+    }
 
-		/// <summary>
-		/// Dispose this writer
-		/// </summary>
-		/// <param name="disposing">flag indicating if we are being disposed</param>
-		/// <remarks>
-		/// <para>
-		/// Dispose this writer
-		/// </para>
-		/// </remarks>
-		protected override void Dispose(bool disposing)
-		{
-			if (disposing)
-			{
-				((IDisposable)m_writer).Dispose();
-			}
-		}
+    /// <summary>
+    /// Dispose this writer
+    /// </summary>
+    /// <param name="disposing">flag indicating if we are being disposed</param>
+    /// <remarks>
+    /// <para>
+    /// Dispose this writer
+    /// </para>
+    /// </remarks>
+    protected override void Dispose(bool disposing)
+    {
+      if (disposing)
+      {
+        ((IDisposable)m_writer).Dispose();
+      }
+    }
 
-		/// <summary>
-		/// Flushes any buffered output
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clears all buffers for the writer and causes any buffered data to be written 
-		/// to the underlying device
-		/// </para>
-		/// </remarks>
-		public override void Flush() 
-		{
-			m_writer.Flush();
-		}
+    /// <summary>
+    /// Flushes any buffered output
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clears all buffers for the writer and causes any buffered data to be written 
+    /// to the underlying device
+    /// </para>
+    /// </remarks>
+    public override void Flush()
+    {
+      m_writer.Flush();
+    }
 
-		/// <summary>
-		/// Writes a character to the wrapped TextWriter
-		/// </summary>
-		/// <param name="value">the value to write to the TextWriter</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a character to the wrapped TextWriter
-		/// </para>
-		/// </remarks>
-		public override void Write(char value) 
-		{
-			m_writer.Write(value);
-		}
-    
-		/// <summary>
-		/// Writes a character buffer to the wrapped TextWriter
-		/// </summary>
-		/// <param name="buffer">the data buffer</param>
-		/// <param name="index">the start index</param>
-		/// <param name="count">the number of characters to write</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a character buffer to the wrapped TextWriter
-		/// </para>
-		/// </remarks>
-		public override void Write(char[] buffer, int index, int count) 
-		{
-			m_writer.Write(buffer, index, count);
-		}
-    
-		/// <summary>
-		/// Writes a string to the wrapped TextWriter
-		/// </summary>
-		/// <param name="value">the value to write to the TextWriter</param>
-		/// <remarks>
-		/// <para>
-		/// Writes a string to the wrapped TextWriter
-		/// </para>
-		/// </remarks>
-		public override void Write(String value) 
-		{
-			m_writer.Write(value);
-		}
+    /// <summary>
+    /// Writes a character to the wrapped TextWriter
+    /// </summary>
+    /// <param name="value">the value to write to the TextWriter</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a character to the wrapped TextWriter
+    /// </para>
+    /// </remarks>
+    public override void Write(char value)
+    {
+      m_writer.Write(value);
+    }
 
-		#endregion
-	}
+    /// <summary>
+    /// Writes a character buffer to the wrapped TextWriter
+    /// </summary>
+    /// <param name="buffer">the data buffer</param>
+    /// <param name="index">the start index</param>
+    /// <param name="count">the number of characters to write</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a character buffer to the wrapped TextWriter
+    /// </para>
+    /// </remarks>
+    public override void Write(char[] buffer, int index, int count)
+    {
+      m_writer.Write(buffer, index, count);
+    }
+
+    /// <summary>
+    /// Writes a string to the wrapped TextWriter
+    /// </summary>
+    /// <param name="value">the value to write to the TextWriter</param>
+    /// <remarks>
+    /// <para>
+    /// Writes a string to the wrapped TextWriter
+    /// </para>
+    /// </remarks>
+    public override void Write(String value)
+    {
+      m_writer.Write(value);
+    }
+
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/ThreadContextProperties.cs b/src/log4net/Util/ThreadContextProperties.cs
index e002c1b..0fbeef6 100644
--- a/src/log4net/Util/ThreadContextProperties.cs
+++ b/src/log4net/Util/ThreadContextProperties.cs
@@ -24,177 +24,177 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implementation of Properties collection for the <see cref="log4net.ThreadContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Class implements a collection of properties that is specific to each thread.
-	/// The class is not synchronized as each thread has its own <see cref="PropertiesDictionary"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class ThreadContextProperties : ContextPropertiesBase
-	{
-		#region Private Instance Fields
+  /// <summary>
+  /// Implementation of Properties collection for the <see cref="log4net.ThreadContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Class implements a collection of properties that is specific to each thread.
+  /// The class is not synchronized as each thread has its own <see cref="PropertiesDictionary"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class ThreadContextProperties : ContextPropertiesBase
+  {
+    #region Private Instance Fields
 
 #if NETCF
-		/// <summary>
-		/// The thread local data slot to use to store a PropertiesDictionary.
-		/// </summary>
-		private readonly static LocalDataStoreSlot s_threadLocalSlot = System.Threading.Thread.AllocateDataSlot();
+    /// <summary>
+    /// The thread local data slot to use to store a PropertiesDictionary.
+    /// </summary>
+    private readonly static LocalDataStoreSlot s_threadLocalSlot = System.Threading.Thread.AllocateDataSlot();
 #else
-		/// <summary>
-		/// Each thread will automatically have its instance.
-		/// </summary>
-		[ThreadStatic]
-		private static PropertiesDictionary _dictionary;
+    /// <summary>
+    /// Each thread will automatically have its instance.
+    /// </summary>
+    [ThreadStatic]
+    private static PropertiesDictionary _dictionary;
 #endif
 
-		#endregion Private Instance Fields
+    #endregion Private Instance Fields
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Internal constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ThreadContextProperties" /> class.
-		/// </para>
-		/// </remarks>
-		internal ThreadContextProperties()
-		{
-		}
+    /// <summary>
+    /// Internal constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ThreadContextProperties" /> class.
+    /// </para>
+    /// </remarks>
+    internal ThreadContextProperties()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets or sets the value of a property
-		/// </summary>
-		/// <value>
-		/// The value for the property with the specified key
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets or sets the value of a property
-		/// </para>
-		/// </remarks>
-		public override object this[string key]
-		{
-			get
-			{
+    /// <summary>
+    /// Gets or sets the value of a property
+    /// </summary>
+    /// <value>
+    /// The value for the property with the specified key
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets or sets the value of a property
+    /// </para>
+    /// </remarks>
+    public override object this[string key]
+    {
+      get
+      {
 #if NETCF
-				PropertiesDictionary _dictionary = GetProperties(false);
+        PropertiesDictionary _dictionary = GetProperties(false);
 #endif
-				if (_dictionary != null)
-				{
-					return _dictionary[key];
-				}
-				return null;
-			}
-			set
-			{
-				GetProperties(true)[key] = value;
-			}
-		}
+        if (_dictionary != null)
+        {
+          return _dictionary[key];
+        }
+        return null;
+      }
+      set
+      {
+        GetProperties(true)[key] = value;
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-		#region Public Instance Methods
+    #region Public Instance Methods
 
-		/// <summary>
-		/// Remove a property
-		/// </summary>
-		/// <param name="key">the key for the entry to remove</param>
-		/// <remarks>
-		/// <para>
-		/// Remove a property
-		/// </para>
-		/// </remarks>
-		public void Remove(string key)
-		{
+    /// <summary>
+    /// Remove a property
+    /// </summary>
+    /// <param name="key">the key for the entry to remove</param>
+    /// <remarks>
+    /// <para>
+    /// Remove a property
+    /// </para>
+    /// </remarks>
+    public void Remove(string key)
+    {
 #if NETCF
-			PropertiesDictionary _dictionary = GetProperties(false);
+      PropertiesDictionary _dictionary = GetProperties(false);
 #endif
-			if (_dictionary != null)
-			{
-				_dictionary.Remove(key);
-			}
-		}
+      if (_dictionary != null)
+      {
+        _dictionary.Remove(key);
+      }
+    }
 
-		/// <summary>
-		/// Get the keys stored in the properties.
-		/// </summary>
-		/// <para>
-		/// Gets the keys stored in the properties.
-		/// </para>
-		/// <returns>a set of the defined keys</returns>
-		public string[] GetKeys()
-		{
+    /// <summary>
+    /// Get the keys stored in the properties.
+    /// </summary>
+    /// <para>
+    /// Gets the keys stored in the properties.
+    /// </para>
+    /// <returns>a set of the defined keys</returns>
+    public string[] GetKeys()
+    {
 #if NETCF
-			PropertiesDictionary _dictionary = GetProperties(false);
+      PropertiesDictionary _dictionary = GetProperties(false);
 #endif
-			if (_dictionary != null)
-			{
-				return _dictionary.GetKeys();
-			}
-			return null;
-		}
+      if (_dictionary != null)
+      {
+        return _dictionary.GetKeys();
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Clear all properties
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clear all properties
-		/// </para>
-		/// </remarks>
-		public void Clear()
-		{
+    /// <summary>
+    /// Clear all properties
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clear all properties
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
 #if NETCF
-			PropertiesDictionary _dictionary = GetProperties(false);
+      PropertiesDictionary _dictionary = GetProperties(false);
 #endif
-			if (_dictionary != null)
-			{
-				_dictionary.Clear();
-			}
-		}
+      if (_dictionary != null)
+      {
+        _dictionary.Clear();
+      }
+    }
 
-		#endregion Public Instance Methods
+    #endregion Public Instance Methods
 
-		#region Internal Instance Methods
+    #region Internal Instance Methods
 
-		/// <summary>
-		/// Get the <c>PropertiesDictionary</c> for this thread.
-		/// </summary>
-		/// <param name="create">create the dictionary if it does not exist, otherwise return null if does not exist</param>
-		/// <returns>the properties for this thread</returns>
-		/// <remarks>
-		/// <para>
-		/// The collection returned is only to be used on the calling thread. If the
-		/// caller needs to share the collection between different threads then the 
-		/// caller must clone the collection before doing so.
-		/// </para>
-		/// </remarks>
-		internal PropertiesDictionary GetProperties(bool create)
-		{
+    /// <summary>
+    /// Get the <c>PropertiesDictionary</c> for this thread.
+    /// </summary>
+    /// <param name="create">create the dictionary if it does not exist, otherwise return null if does not exist</param>
+    /// <returns>the properties for this thread</returns>
+    /// <remarks>
+    /// <para>
+    /// The collection returned is only to be used on the calling thread. If the
+    /// caller needs to share the collection between different threads then the 
+    /// caller must clone the collection before doing so.
+    /// </para>
+    /// </remarks>
+    internal PropertiesDictionary GetProperties(bool create)
+    {
 #if NETCF
-			PropertiesDictionary _dictionary = (PropertiesDictionary)System.Threading.Thread.GetData(s_threadLocalSlot);
+      PropertiesDictionary _dictionary = (PropertiesDictionary)System.Threading.Thread.GetData(s_threadLocalSlot);
 #endif
-			if (_dictionary == null && create)
-			{
-				_dictionary  = new PropertiesDictionary();
+      if (_dictionary == null && create)
+      {
+        _dictionary = new PropertiesDictionary();
 #if NETCF
-				System.Threading.Thread.SetData(s_threadLocalSlot, _dictionary);
+        System.Threading.Thread.SetData(s_threadLocalSlot, _dictionary);
 #endif
-			}
-			return _dictionary;
-		}
+      }
+      return _dictionary;
+    }
 
-		#endregion Internal Instance Methods
-	}
+    #endregion Internal Instance Methods
+  }
 }
 
diff --git a/src/log4net/Util/ThreadContextStack.cs b/src/log4net/Util/ThreadContextStack.cs
index 53d6fba..37ed907 100644
--- a/src/log4net/Util/ThreadContextStack.cs
+++ b/src/log4net/Util/ThreadContextStack.cs
@@ -27,429 +27,429 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implementation of Stack for the <see cref="log4net.ThreadContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Implementation of Stack for the <see cref="log4net.ThreadContext"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class ThreadContextStack : IFixingRequired
-	{
-		#region Private Static Fields
+  /// <summary>
+  /// Implementation of Stack for the <see cref="log4net.ThreadContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Implementation of Stack for the <see cref="log4net.ThreadContext"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class ThreadContextStack : IFixingRequired
+  {
+    #region Private Static Fields
 
-		/// <summary>
-		/// The stack store.
-		/// </summary>
-		private Stack m_stack = new Stack();
+    /// <summary>
+    /// The stack store.
+    /// </summary>
+    private Stack m_stack = new Stack();
 
-		#endregion Private Static Fields
+    #endregion Private Static Fields
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Internal constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ThreadContextStack" /> class. 
-		/// </para>
-		/// </remarks>
-		internal ThreadContextStack()
-		{
-		}
+    /// <summary>
+    /// Internal constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ThreadContextStack" /> class. 
+    /// </para>
+    /// </remarks>
+    internal ThreadContextStack()
+    {
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Properties
+    #region Public Properties
 
-		/// <summary>
-		/// The number of messages in the stack
-		/// </summary>
-		/// <value>
-		/// The current number of messages in the stack
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The current number of messages in the stack. That is
-		/// the number of times <see cref="Push"/> has been called
-		/// minus the number of times <see cref="Pop"/> has been called.
-		/// </para>
-		/// </remarks>
-		public int Count
-		{
-			get { return m_stack.Count; }
-		}
+    /// <summary>
+    /// The number of messages in the stack
+    /// </summary>
+    /// <value>
+    /// The current number of messages in the stack
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The current number of messages in the stack. That is
+    /// the number of times <see cref="Push"/> has been called
+    /// minus the number of times <see cref="Pop"/> has been called.
+    /// </para>
+    /// </remarks>
+    public int Count
+    {
+      get { return m_stack.Count; }
+    }
 
-		#endregion // Public Properties
+    #endregion // Public Properties
 
-		#region Public Methods
+    #region Public Methods
 
-		/// <summary>
-		/// Clears all the contextual information held in this stack.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Clears all the contextual information held in this stack.
-		/// Only call this if you think that this tread is being reused after
-		/// a previous call execution which may not have completed correctly.
-		/// You do not need to use this method if you always guarantee to call
-		/// the <see cref="IDisposable.Dispose"/> method of the <see cref="IDisposable"/>
-		/// returned from <see cref="Push"/> even in exceptional circumstances,
-		/// for example by using the <c>using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message"))</c> 
-		/// syntax.
-		/// </para>
-		/// </remarks>
-		public void Clear() 
-		{
-			m_stack.Clear();
-		}
+    /// <summary>
+    /// Clears all the contextual information held in this stack.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Clears all the contextual information held in this stack.
+    /// Only call this if you think that this tread is being reused after
+    /// a previous call execution which may not have completed correctly.
+    /// You do not need to use this method if you always guarantee to call
+    /// the <see cref="IDisposable.Dispose"/> method of the <see cref="IDisposable"/>
+    /// returned from <see cref="Push"/> even in exceptional circumstances,
+    /// for example by using the <c>using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message"))</c> 
+    /// syntax.
+    /// </para>
+    /// </remarks>
+    public void Clear()
+    {
+      m_stack.Clear();
+    }
 
-		/// <summary>
-		/// Removes the top context from this stack.
-		/// </summary>
-		/// <returns>The message in the context that was removed from the top of this stack.</returns>
-		/// <remarks>
-		/// <para>
-		/// Remove the top context from this stack, and return
-		/// it to the caller. If this stack is empty then an
-		/// empty string (not <see langword="null"/>) is returned.
-		/// </para>
-		/// </remarks>
-		public string Pop() 
-		{
-			Stack stack = m_stack;
-			if (stack.Count > 0)
-			{
-				return ((StackFrame)(stack.Pop())).Message;
-			}
-			return "";
-		}
+    /// <summary>
+    /// Removes the top context from this stack.
+    /// </summary>
+    /// <returns>The message in the context that was removed from the top of this stack.</returns>
+    /// <remarks>
+    /// <para>
+    /// Remove the top context from this stack, and return
+    /// it to the caller. If this stack is empty then an
+    /// empty string (not <see langword="null"/>) is returned.
+    /// </para>
+    /// </remarks>
+    public string Pop()
+    {
+      Stack stack = m_stack;
+      if (stack.Count > 0)
+      {
+        return ((StackFrame)(stack.Pop())).Message;
+      }
+      return "";
+    }
 
-		/// <summary>
-		/// Pushes a new context message into this stack.
-		/// </summary>
-		/// <param name="message">The new context message.</param>
-		/// <returns>
-		/// An <see cref="IDisposable"/> that can be used to clean up the context stack.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Pushes a new context onto this stack. An <see cref="IDisposable"/>
-		/// is returned that can be used to clean up this stack. This
-		/// can be easily combined with the <c>using</c> keyword to scope the
-		/// context.
-		/// </para>
-		/// </remarks>
-		/// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
-		/// <code lang="C#">
-		/// using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message"))
-		/// {
-		///		log.Warn("This should have an ThreadContext Stack message");
-		///	}
-		/// </code>
-		/// </example>
-		public IDisposable Push(string message) 
-		{
-			Stack stack = m_stack;
-			stack.Push(new StackFrame(message, (stack.Count>0) ? (StackFrame)stack.Peek() : null));
+    /// <summary>
+    /// Pushes a new context message into this stack.
+    /// </summary>
+    /// <param name="message">The new context message.</param>
+    /// <returns>
+    /// An <see cref="IDisposable"/> that can be used to clean up the context stack.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Pushes a new context onto this stack. An <see cref="IDisposable"/>
+    /// is returned that can be used to clean up this stack. This
+    /// can be easily combined with the <c>using</c> keyword to scope the
+    /// context.
+    /// </para>
+    /// </remarks>
+    /// <example>Simple example of using the <c>Push</c> method with the <c>using</c> keyword.
+    /// <code lang="C#">
+    /// using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message"))
+    /// {
+    ///    log.Warn("This should have an ThreadContext Stack message");
+    ///  }
+    /// </code>
+    /// </example>
+    public IDisposable Push(string message)
+    {
+      Stack stack = m_stack;
+      stack.Push(new StackFrame(message, (stack.Count > 0) ? (StackFrame)stack.Peek() : null));
 
-			return new AutoPopStackFrame(stack, stack.Count - 1);
-		}
+      return new AutoPopStackFrame(stack, stack.Count - 1);
+    }
 
-		/// <summary>
-		/// Returns the top context from this stack.
-		/// </summary>
-		/// <returns>The message in the context from the top of this stack.</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns the top context from this stack. If this stack is empty then an
-		/// empty string (not <see langword="null"/>) is returned.
-		/// </para>
-		/// </remarks>
-		public string Peek()
-		{
-			Stack stack = m_stack;
-			if (stack.Count > 0)
-			{
-				return ((StackFrame)stack.Peek()).Message;
-			}
-			return "";
-		}
+    /// <summary>
+    /// Returns the top context from this stack.
+    /// </summary>
+    /// <returns>The message in the context from the top of this stack.</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns the top context from this stack. If this stack is empty then an
+    /// empty string (not <see langword="null"/>) is returned.
+    /// </para>
+    /// </remarks>
+    public string Peek()
+    {
+      Stack stack = m_stack;
+      if (stack.Count > 0)
+      {
+        return ((StackFrame)stack.Peek()).Message;
+      }
+      return "";
+    }
 
-		#endregion Public Methods
+    #endregion Public Methods
 
-		#region Internal Methods
+    #region Internal Methods
 
-		/// <summary>
-		/// Gets the current context information for this stack.
-		/// </summary>
-		/// <returns>The current context information.</returns>
-		internal string GetFullMessage() 
-		{
-			Stack stack = m_stack;
-			if (stack.Count > 0)
-			{
-				return ((StackFrame)(stack.Peek())).FullMessage;
-			}
-			return null;
-		}
+    /// <summary>
+    /// Gets the current context information for this stack.
+    /// </summary>
+    /// <returns>The current context information.</returns>
+    internal string GetFullMessage()
+    {
+      Stack stack = m_stack;
+      if (stack.Count > 0)
+      {
+        return ((StackFrame)(stack.Peek())).FullMessage;
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Gets and sets the internal stack used by this <see cref="ThreadContextStack"/>
-		/// </summary>
-		/// <value>The internal storage stack</value>
-		/// <remarks>
-		/// <para>
-		/// This property is provided only to support backward compatability 
-		/// of the <see cref="NDC"/>. Tytpically the internal stack should not
-		/// be modified.
-		/// </para>
-		/// </remarks>
-		internal Stack InternalStack
-		{
-			get { return m_stack; }
-			set { m_stack = value; }
-		}
-  
-		#endregion Internal Methods
+    /// <summary>
+    /// Gets and sets the internal stack used by this <see cref="ThreadContextStack"/>
+    /// </summary>
+    /// <value>The internal storage stack</value>
+    /// <remarks>
+    /// <para>
+    /// This property is provided only to support backward compatability 
+    /// of the <see cref="NDC"/>. Tytpically the internal stack should not
+    /// be modified.
+    /// </para>
+    /// </remarks>
+    internal Stack InternalStack
+    {
+      get { return m_stack; }
+      set { m_stack = value; }
+    }
 
-		/// <summary>
-		/// Gets the current context information for this stack.
-		/// </summary>
-		/// <returns>Gets the current context information</returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the current context information for this stack.
-		/// </para>
-		/// </remarks>
-		public override string ToString()
-		{
-			return GetFullMessage();
-		}
+    #endregion Internal Methods
 
-		/// <summary>
-		/// Get a portable version of this object
-		/// </summary>
-		/// <returns>the portable instance of this object</returns>
-		/// <remarks>
-		/// <para>
-		/// Get a cross thread portable version of this object
-		/// </para>
-		/// </remarks>
-		object IFixingRequired.GetFixedObject()
-		{
-			return GetFullMessage();
-		}
+    /// <summary>
+    /// Gets the current context information for this stack.
+    /// </summary>
+    /// <returns>Gets the current context information</returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the current context information for this stack.
+    /// </para>
+    /// </remarks>
+    public override string ToString()
+    {
+      return GetFullMessage();
+    }
 
-		/// <summary>
-		/// Inner class used to represent a single context frame in the stack.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Inner class used to represent a single context frame in the stack.
-		/// </para>
-		/// </remarks>
-		private sealed class StackFrame 
-		{
-			#region Private Instance Fields
+    /// <summary>
+    /// Get a portable version of this object
+    /// </summary>
+    /// <returns>the portable instance of this object</returns>
+    /// <remarks>
+    /// <para>
+    /// Get a cross thread portable version of this object
+    /// </para>
+    /// </remarks>
+    object IFixingRequired.GetFixedObject()
+    {
+      return GetFullMessage();
+    }
 
-			private readonly string m_message;
-			private readonly StackFrame m_parent;
-			private string m_fullMessage = null;
-    
-			#endregion
+    /// <summary>
+    /// Inner class used to represent a single context frame in the stack.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Inner class used to represent a single context frame in the stack.
+    /// </para>
+    /// </remarks>
+    private sealed class StackFrame
+    {
+      #region Private Instance Fields
 
-			#region Internal Instance Constructors
+      private readonly string m_message;
+      private readonly StackFrame m_parent;
+      private string m_fullMessage = null;
 
-			/// <summary>
-			/// Constructor
-			/// </summary>
-			/// <param name="message">The message for this context.</param>
-			/// <param name="parent">The parent context in the chain.</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="StackFrame" /> class
-			/// with the specified message and parent context.
-			/// </para>
-			/// </remarks>
-			internal StackFrame(string message, StackFrame parent) 
-			{
-				m_message = message;
-				m_parent = parent;
+      #endregion
 
-				if (parent == null) 
-				{
-					m_fullMessage = message;
-				} 
-			}
+      #region Internal Instance Constructors
 
-			#endregion Internal Instance Constructors
+      /// <summary>
+      /// Constructor
+      /// </summary>
+      /// <param name="message">The message for this context.</param>
+      /// <param name="parent">The parent context in the chain.</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="StackFrame" /> class
+      /// with the specified message and parent context.
+      /// </para>
+      /// </remarks>
+      internal StackFrame(string message, StackFrame parent)
+      {
+        m_message = message;
+        m_parent = parent;
 
-			#region Internal Instance Properties
+        if (parent == null)
+        {
+          m_fullMessage = message;
+        }
+      }
 
-			/// <summary>
-			/// Get the message.
-			/// </summary>
-			/// <value>The message.</value>
-			/// <remarks>
-			/// <para>
-			/// Get the message.
-			/// </para>
-			/// </remarks>
-			internal string Message
-			{
-				get { return m_message; }
-			}
+      #endregion Internal Instance Constructors
 
-			/// <summary>
-			/// Gets the full text of the context down to the root level.
-			/// </summary>
-			/// <value>
-			/// The full text of the context down to the root level.
-			/// </value>
-			/// <remarks>
-			/// <para>
-			/// Gets the full text of the context down to the root level.
-			/// </para>
-			/// </remarks>
-			internal string FullMessage
-			{
-				get 
-				{
-					if (m_fullMessage == null && m_parent != null)
-					{
-						m_fullMessage = string.Concat(m_parent.FullMessage, " ", m_message);
-					}
-					return m_fullMessage; 
-				}
-			}
+      #region Internal Instance Properties
 
-			#endregion Internal Instance Properties
-		}
+      /// <summary>
+      /// Get the message.
+      /// </summary>
+      /// <value>The message.</value>
+      /// <remarks>
+      /// <para>
+      /// Get the message.
+      /// </para>
+      /// </remarks>
+      internal string Message
+      {
+        get { return m_message; }
+      }
 
-		/// <summary>
-		/// Struct returned from the <see cref="ThreadContextStack.Push"/> method.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This struct implements the <see cref="IDisposable"/> and is designed to be used
-		/// with the <see langword="using"/> pattern to remove the stack frame at the end of the scope.
-		/// </para>
-		/// </remarks>
-		private struct AutoPopStackFrame : IDisposable
-		{
-			#region Private Instance Fields
+      /// <summary>
+      /// Gets the full text of the context down to the root level.
+      /// </summary>
+      /// <value>
+      /// The full text of the context down to the root level.
+      /// </value>
+      /// <remarks>
+      /// <para>
+      /// Gets the full text of the context down to the root level.
+      /// </para>
+      /// </remarks>
+      internal string FullMessage
+      {
+        get
+        {
+          if (m_fullMessage == null && m_parent != null)
+          {
+            m_fullMessage = string.Concat(m_parent.FullMessage, " ", m_message);
+          }
+          return m_fullMessage;
+        }
+      }
 
-			/// <summary>
-			/// The ThreadContextStack internal stack
-			/// </summary>
-			private Stack m_frameStack;
+      #endregion Internal Instance Properties
+    }
 
-			/// <summary>
-			/// The depth to trim the stack to when this instance is disposed
-			/// </summary>
-			private int m_frameDepth;
+    /// <summary>
+    /// Struct returned from the <see cref="ThreadContextStack.Push"/> method.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This struct implements the <see cref="IDisposable"/> and is designed to be used
+    /// with the <see langword="using"/> pattern to remove the stack frame at the end of the scope.
+    /// </para>
+    /// </remarks>
+    private struct AutoPopStackFrame : IDisposable
+    {
+      #region Private Instance Fields
 
-			#endregion Private Instance Fields
+      /// <summary>
+      /// The ThreadContextStack internal stack
+      /// </summary>
+      private Stack m_frameStack;
 
-			#region Internal Instance Constructors
+      /// <summary>
+      /// The depth to trim the stack to when this instance is disposed
+      /// </summary>
+      private int m_frameDepth;
 
-			/// <summary>
-			/// Constructor
-			/// </summary>
-			/// <param name="frameStack">The internal stack used by the ThreadContextStack.</param>
-			/// <param name="frameDepth">The depth to return the stack to when this object is disposed.</param>
-			/// <remarks>
-			/// <para>
-			/// Initializes a new instance of the <see cref="AutoPopStackFrame" /> class with
-			/// the specified stack and return depth.
-			/// </para>
-			/// </remarks>
-			internal AutoPopStackFrame(Stack frameStack, int frameDepth)
-			{
-				m_frameStack = frameStack;
-				m_frameDepth = frameDepth;
-			}
+      #endregion Private Instance Fields
 
-			#endregion Internal Instance Constructors
+      #region Internal Instance Constructors
 
-			#region Implementation of IDisposable
+      /// <summary>
+      /// Constructor
+      /// </summary>
+      /// <param name="frameStack">The internal stack used by the ThreadContextStack.</param>
+      /// <param name="frameDepth">The depth to return the stack to when this object is disposed.</param>
+      /// <remarks>
+      /// <para>
+      /// Initializes a new instance of the <see cref="AutoPopStackFrame" /> class with
+      /// the specified stack and return depth.
+      /// </para>
+      /// </remarks>
+      internal AutoPopStackFrame(Stack frameStack, int frameDepth)
+      {
+        m_frameStack = frameStack;
+        m_frameDepth = frameDepth;
+      }
 
-			/// <summary>
-			/// Returns the stack to the correct depth.
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Returns the stack to the correct depth.
-			/// </para>
-			/// </remarks>
-			public void Dispose()
-			{
-				if (m_frameDepth >= 0 && m_frameStack != null)
-				{
-					while(m_frameStack.Count > m_frameDepth)
-					{
-						m_frameStack.Pop();
-					}
-				}
-			}
+      #endregion Internal Instance Constructors
 
-			#endregion Implementation of IDisposable
-		}
+      #region Implementation of IDisposable
+
+      /// <summary>
+      /// Returns the stack to the correct depth.
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Returns the stack to the correct depth.
+      /// </para>
+      /// </remarks>
+      public void Dispose()
+      {
+        if (m_frameDepth >= 0 && m_frameStack != null)
+        {
+          while (m_frameStack.Count > m_frameDepth)
+          {
+            m_frameStack.Pop();
+          }
+        }
+      }
+
+      #endregion Implementation of IDisposable
+    }
 
 #if NETCF_1_0
-		/// <summary>
-		/// Subclass of <see cref="System.Collections.Stack"/> to
-		/// provide missing methods.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// The Compact Framework version of the <see cref="System.Collections.Stack"/>
-		/// class is missing the <c>Clear</c> and <c>Clone</c> methods.
-		/// This subclass adds implementations of those missing methods.
-		/// </para>
-		/// </remarks>
-		public class Stack : System.Collections.Stack
-		{
-			/// <summary>
-			/// Clears the stack of all elements.
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Clears the stack of all elements.
-			/// </para>
-			/// </remarks>
-			public void Clear()
-			{
-				while(Count > 0)
-				{
-					Pop();
-				}
-			}
+    /// <summary>
+    /// Subclass of <see cref="System.Collections.Stack"/> to
+    /// provide missing methods.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// The Compact Framework version of the <see cref="System.Collections.Stack"/>
+    /// class is missing the <c>Clear</c> and <c>Clone</c> methods.
+    /// This subclass adds implementations of those missing methods.
+    /// </para>
+    /// </remarks>
+    public class Stack : System.Collections.Stack
+    {
+      /// <summary>
+      /// Clears the stack of all elements.
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Clears the stack of all elements.
+      /// </para>
+      /// </remarks>
+      public void Clear()
+      {
+        while(Count > 0)
+        {
+          Pop();
+        }
+      }
 
-			/// <summary>
-			/// Makes a shallow copy of the stack's elements.
-			/// </summary>
-			/// <returns>A new stack that has a shallow copy of the stack's elements.</returns>
-			/// <remarks>
-			/// <para>
-			/// Makes a shallow copy of the stack's elements.
-			/// </para>
-			/// </remarks>
-			public Stack Clone()
-			{
-				Stack res = new Stack();
-				object[] items = ToArray();
-				foreach(object item in items)
-				{
-					res.Push(item);
-				}
-				return res;
-			}
-		}
+      /// <summary>
+      /// Makes a shallow copy of the stack's elements.
+      /// </summary>
+      /// <returns>A new stack that has a shallow copy of the stack's elements.</returns>
+      /// <remarks>
+      /// <para>
+      /// Makes a shallow copy of the stack's elements.
+      /// </para>
+      /// </remarks>
+      public Stack Clone()
+      {
+        Stack res = new Stack();
+        object[] items = ToArray();
+        foreach(object item in items)
+        {
+          res.Push(item);
+        }
+        return res;
+      }
+    }
 #endif
-	}
+  }
 }
diff --git a/src/log4net/Util/ThreadContextStacks.cs b/src/log4net/Util/ThreadContextStacks.cs
index 0e9c198..6997636 100644
--- a/src/log4net/Util/ThreadContextStacks.cs
+++ b/src/log4net/Util/ThreadContextStacks.cs
@@ -22,103 +22,103 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Implementation of Stacks collection for the <see cref="log4net.ThreadContext"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Implementation of Stacks collection for the <see cref="log4net.ThreadContext"/>
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public sealed class ThreadContextStacks
-	{
-		private readonly ContextPropertiesBase m_properties;
+  /// <summary>
+  /// Implementation of Stacks collection for the <see cref="log4net.ThreadContext"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Implementation of Stacks collection for the <see cref="log4net.ThreadContext"/>
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public sealed class ThreadContextStacks
+  {
+    private readonly ContextPropertiesBase m_properties;
 
-		#region Public Instance Constructors
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Internal constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ThreadContextStacks" /> class.
-		/// </para>
-		/// </remarks>
-		internal ThreadContextStacks(ContextPropertiesBase properties)
-		{
-			m_properties = properties;
-		}
+    /// <summary>
+    /// Internal constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ThreadContextStacks" /> class.
+    /// </para>
+    /// </remarks>
+    internal ThreadContextStacks(ContextPropertiesBase properties)
+    {
+      m_properties = properties;
+    }
 
-		#endregion Public Instance Constructors
+    #endregion Public Instance Constructors
 
-		#region Public Instance Properties
+    #region Public Instance Properties
 
-		/// <summary>
-		/// Gets the named thread context stack
-		/// </summary>
-		/// <value>
-		/// The named stack
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Gets the named thread context stack
-		/// </para>
-		/// </remarks>
-		public ThreadContextStack this[string key]
-		{
-			get 
-			{
-				ThreadContextStack stack = null;
+    /// <summary>
+    /// Gets the named thread context stack
+    /// </summary>
+    /// <value>
+    /// The named stack
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Gets the named thread context stack
+    /// </para>
+    /// </remarks>
+    public ThreadContextStack this[string key]
+    {
+      get
+      {
+        ThreadContextStack stack = null;
 
-				object propertyValue = m_properties[key];
-				if (propertyValue == null)
-				{
-					// Stack does not exist, create
-					stack = new ThreadContextStack();
-					m_properties[key] = stack;
-				}
-				else
-				{
-					// Look for existing stack
-					stack = propertyValue as ThreadContextStack;
-					if (stack == null)
-					{
-						// Property is not set to a stack!
-						string propertyValueString = SystemInfo.NullText;
+        object propertyValue = m_properties[key];
+        if (propertyValue == null)
+        {
+          // Stack does not exist, create
+          stack = new ThreadContextStack();
+          m_properties[key] = stack;
+        }
+        else
+        {
+          // Look for existing stack
+          stack = propertyValue as ThreadContextStack;
+          if (stack == null)
+          {
+            // Property is not set to a stack!
+            string propertyValueString = SystemInfo.NullText;
 
-						try
-						{
-							propertyValueString = propertyValue.ToString();
-						}
-						catch
-						{
-						}
+            try
+            {
+              propertyValueString = propertyValue.ToString();
+            }
+            catch
+            {
+            }
 
-						LogLog.Error(declaringType, "ThreadContextStacks: Request for stack named ["+key+"] failed because a property with the same name exists which is a ["+propertyValue.GetType().Name+"] with value ["+propertyValueString+"]");
+            LogLog.Error(declaringType, "ThreadContextStacks: Request for stack named [" + key + "] failed because a property with the same name exists which is a [" + propertyValue.GetType().Name + "] with value [" + propertyValueString + "]");
 
-						stack = new ThreadContextStack();
-					}
-				}
+            stack = new ThreadContextStack();
+          }
+        }
 
-				return stack;
-			}
-		}
+        return stack;
+      }
+    }
 
-		#endregion Public Instance Properties
+    #endregion Public Instance Properties
 
-	    #region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the ThreadContextStacks class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(ThreadContextStacks);
+    /// <summary>
+    /// The fully qualified type of the ThreadContextStacks class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(ThreadContextStacks);
 
-	    #endregion Private Static Fields
-	}
+    #endregion Private Static Fields
+  }
 }
 
diff --git a/src/log4net/Util/Transform.cs b/src/log4net/Util/Transform.cs
index 7e8f408..662720c 100644
--- a/src/log4net/Util/Transform.cs
+++ b/src/log4net/Util/Transform.cs
@@ -24,177 +24,177 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Utility class for transforming strings.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Utility class for transforming strings.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class Transform
-	{
-		#region Private Instance Constructors
+  /// <summary>
+  /// Utility class for transforming strings.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Utility class for transforming strings.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class Transform
+  {
+    #region Private Instance Constructors
 
-		/// <summary>
-		/// Initializes a new instance of the <see cref="Transform" /> class. 
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Uses a private access modifier to prevent instantiation of this class.
-		/// </para>
-		/// </remarks>
-		private Transform()
-		{
-		}
+    /// <summary>
+    /// Initializes a new instance of the <see cref="Transform" /> class. 
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Uses a private access modifier to prevent instantiation of this class.
+    /// </para>
+    /// </remarks>
+    private Transform()
+    {
+    }
 
-		#endregion Private Instance Constructors
+    #endregion Private Instance Constructors
 
-		#region XML String Methods
+    #region XML String Methods
 
-		/// <summary>
-		/// Write a string to an <see cref="XmlWriter"/>
-		/// </summary>
-		/// <param name="writer">the writer to write to</param>
-		/// <param name="textData">the string to write</param>
-		/// <param name="invalidCharReplacement">The string to replace non XML compliant chars with</param>
-		/// <remarks>
-		/// <para>
-		/// The test is escaped either using XML escape entities
-		/// or using CDATA sections.
-		/// </para>
-		/// </remarks>
-		public static void WriteEscapedXmlString(XmlWriter writer, string textData, string invalidCharReplacement)
-		{
-			string stringData = MaskXmlInvalidCharacters(textData, invalidCharReplacement);
-			// Write either escaped text or CDATA sections
+    /// <summary>
+    /// Write a string to an <see cref="XmlWriter"/>
+    /// </summary>
+    /// <param name="writer">the writer to write to</param>
+    /// <param name="textData">the string to write</param>
+    /// <param name="invalidCharReplacement">The string to replace non XML compliant chars with</param>
+    /// <remarks>
+    /// <para>
+    /// The test is escaped either using XML escape entities
+    /// or using CDATA sections.
+    /// </para>
+    /// </remarks>
+    public static void WriteEscapedXmlString(XmlWriter writer, string textData, string invalidCharReplacement)
+    {
+      string stringData = MaskXmlInvalidCharacters(textData, invalidCharReplacement);
+      // Write either escaped text or CDATA sections
 
-			int weightCData = 12 * (1 + CountSubstrings(stringData, CDATA_END));
-			int weightStringEscapes = 3*(CountSubstrings(stringData, "<") + CountSubstrings(stringData, ">")) + 4*CountSubstrings(stringData, "&");
+      int weightCData = 12 * (1 + CountSubstrings(stringData, CDATA_END));
+      int weightStringEscapes = 3 * (CountSubstrings(stringData, "<") + CountSubstrings(stringData, ">")) + 4 * CountSubstrings(stringData, "&");
 
-			if (weightStringEscapes <= weightCData)
-			{
-				// Write string using string escapes
-				writer.WriteString(stringData);
-			}
-			else
-			{
-				// Write string using CDATA section
+      if (weightStringEscapes <= weightCData)
+      {
+        // Write string using string escapes
+        writer.WriteString(stringData);
+      }
+      else
+      {
+        // Write string using CDATA section
 
-				int end = stringData.IndexOf(CDATA_END);
-	
-				if (end < 0) 
-				{
-					writer.WriteCData(stringData);
-				}
-				else
-				{
-					int start = 0;
-					while (end > -1) 
-					{
-						writer.WriteCData(stringData.Substring(start, end - start));
-						if (end == stringData.Length - 3)
-						{
-							start = stringData.Length;
-							writer.WriteString(CDATA_END);
-							break;
-						}
-						else
-						{
-							writer.WriteString(CDATA_UNESCAPABLE_TOKEN);
-							start = end + 2;
-							end = stringData.IndexOf(CDATA_END, start);
-						}
-					}
-	
-					if (start < stringData.Length)
-					{
-						writer.WriteCData(stringData.Substring(start));
-					}
-				}
-			}
-		}
+        int end = stringData.IndexOf(CDATA_END);
 
-		/// <summary>
-		/// Replace invalid XML characters in text string
-		/// </summary>
-		/// <param name="textData">the XML text input string</param>
-		/// <param name="mask">the string to use in place of invalid characters</param>
-		/// <returns>A string that does not contain invalid XML characters.</returns>
-		/// <remarks>
-		/// <para>
-		/// Certain Unicode code points are not allowed in the XML InfoSet, for
-		/// details see: <a href="http://www.w3.org/TR/REC-xml/#charsets">http://www.w3.org/TR/REC-xml/#charsets</a>.
-		/// </para>
-		/// <para>
-		/// This method replaces any illegal characters in the input string
-		/// with the mask string specified.
-		/// </para>
-		/// </remarks>
-		public static string MaskXmlInvalidCharacters(string textData, string mask)
-		{
-			return INVALIDCHARS.Replace(textData, mask);
-		}
+        if (end < 0)
+        {
+          writer.WriteCData(stringData);
+        }
+        else
+        {
+          int start = 0;
+          while (end > -1)
+          {
+            writer.WriteCData(stringData.Substring(start, end - start));
+            if (end == stringData.Length - 3)
+            {
+              start = stringData.Length;
+              writer.WriteString(CDATA_END);
+              break;
+            }
+            else
+            {
+              writer.WriteString(CDATA_UNESCAPABLE_TOKEN);
+              start = end + 2;
+              end = stringData.IndexOf(CDATA_END, start);
+            }
+          }
 
-		#endregion XML String Methods
+          if (start < stringData.Length)
+          {
+            writer.WriteCData(stringData.Substring(start));
+          }
+        }
+      }
+    }
 
-		#region Private Helper Methods
+    /// <summary>
+    /// Replace invalid XML characters in text string
+    /// </summary>
+    /// <param name="textData">the XML text input string</param>
+    /// <param name="mask">the string to use in place of invalid characters</param>
+    /// <returns>A string that does not contain invalid XML characters.</returns>
+    /// <remarks>
+    /// <para>
+    /// Certain Unicode code points are not allowed in the XML InfoSet, for
+    /// details see: <a href="http://www.w3.org/TR/REC-xml/#charsets">http://www.w3.org/TR/REC-xml/#charsets</a>.
+    /// </para>
+    /// <para>
+    /// This method replaces any illegal characters in the input string
+    /// with the mask string specified.
+    /// </para>
+    /// </remarks>
+    public static string MaskXmlInvalidCharacters(string textData, string mask)
+    {
+      return INVALIDCHARS.Replace(textData, mask);
+    }
 
-		/// <summary>
-		/// Count the number of times that the substring occurs in the text
-		/// </summary>
-		/// <param name="text">the text to search</param>
-		/// <param name="substring">the substring to find</param>
-		/// <returns>the number of times the substring occurs in the text</returns>
-		/// <remarks>
-		/// <para>
-		/// The substring is assumed to be non repeating within itself.
-		/// </para>
-		/// </remarks>
-		private static int CountSubstrings(string text, string substring)
-		{
-			int count = 0;
-			int offset = 0;
-			int length = text.Length;
-			int substringLength = substring.Length;
+    #endregion XML String Methods
 
-			if (length == 0)
-			{
-				return 0;
-			}
-			if (substringLength == 0)
-			{
-				return 0;
-			}
+    #region Private Helper Methods
 
-			while(offset < length)
-			{
-				int index = text.IndexOf(substring, offset);
+    /// <summary>
+    /// Count the number of times that the substring occurs in the text
+    /// </summary>
+    /// <param name="text">the text to search</param>
+    /// <param name="substring">the substring to find</param>
+    /// <returns>the number of times the substring occurs in the text</returns>
+    /// <remarks>
+    /// <para>
+    /// The substring is assumed to be non repeating within itself.
+    /// </para>
+    /// </remarks>
+    private static int CountSubstrings(string text, string substring)
+    {
+      int count = 0;
+      int offset = 0;
+      int length = text.Length;
+      int substringLength = substring.Length;
 
-				if (index == -1)
-				{
-					break;
-				}
+      if (length == 0)
+      {
+        return 0;
+      }
+      if (substringLength == 0)
+      {
+        return 0;
+      }
 
-				count++;
-				offset = index + substringLength;
-			}
-			return count;
-		}
+      while (offset < length)
+      {
+        int index = text.IndexOf(substring, offset);
 
-		#endregion
+        if (index == -1)
+        {
+          break;
+        }
 
-		#region Private Static Fields
+        count++;
+        offset = index + substringLength;
+      }
+      return count;
+    }
 
-		private const string CDATA_END	= "]]>";
-		private const string CDATA_UNESCAPABLE_TOKEN	= "]]";
+    #endregion
 
-        /// <summary>
-        /// Characters illegal in XML 1.0
-        /// </summary>
-		private static Regex INVALIDCHARS=new Regex(@"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD]",RegexOptions.Compiled);
-		#endregion Private Static Fields
-	}
+    #region Private Static Fields
+
+    private const string CDATA_END = "]]>";
+    private const string CDATA_UNESCAPABLE_TOKEN = "]]";
+
+    /// <summary>
+    /// Characters illegal in XML 1.0
+    /// </summary>
+    private static Regex INVALIDCHARS = new Regex(@"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD]", RegexOptions.Compiled);
+    #endregion Private Static Fields
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/BooleanConverter.cs b/src/log4net/Util/TypeConverters/BooleanConverter.cs
index 7853c45..ca50001 100644
--- a/src/log4net/Util/TypeConverters/BooleanConverter.cs
+++ b/src/log4net/Util/TypeConverters/BooleanConverter.cs
@@ -21,65 +21,65 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Type converter for Boolean.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Supports conversion from string to <c>bool</c> type.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="ConverterRegistry"/>
-	/// <seealso cref="IConvertFrom"/>
-	/// <seealso cref="IConvertTo"/>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	internal class BooleanConverter : IConvertFrom
-	{
-		#region Implementation of IConvertFrom
+  /// <summary>
+  /// Type converter for Boolean.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Supports conversion from string to <c>bool</c> type.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="ConverterRegistry"/>
+  /// <seealso cref="IConvertFrom"/>
+  /// <seealso cref="IConvertTo"/>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  internal class BooleanConverter : IConvertFrom
+  {
+    #region Implementation of IConvertFrom
 
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="sourceType"/> is
-		/// the <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(Type sourceType)
-		{
-			return (sourceType == typeof(string));
-		}
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="sourceType"/> is
+    /// the <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(Type sourceType)
+    {
+      return (sourceType == typeof(string));
+    }
 
-		/// <summary>
-		/// Convert the source object to the type supported by this object
-		/// </summary>
-		/// <param name="source">the object to convert</param>
-		/// <returns>the converted object</returns>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="Boolean.Parse"/> method to convert the
-		/// <see cref="String"/> argument to a <see cref="Boolean"/>.
-		/// </para>
-		/// </remarks>
- 		/// <exception cref="ConversionNotSupportedException">
- 		/// The <paramref name="source"/> object cannot be converted to the
- 		/// target type. To check for this condition use the <see cref="CanConvertFrom"/>
- 		/// method.
- 		/// </exception>
-		public object ConvertFrom(object source)
-		{
-			string str = source as string;
-			if (str != null)
-			{
-				return bool.Parse(str);
-			}
-			throw ConversionNotSupportedException.Create(typeof(bool), source);
-		}
+    /// <summary>
+    /// Convert the source object to the type supported by this object
+    /// </summary>
+    /// <param name="source">the object to convert</param>
+    /// <returns>the converted object</returns>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="Boolean.Parse"/> method to convert the
+    /// <see cref="String"/> argument to a <see cref="Boolean"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
+    /// method.
+    /// </exception>
+    public object ConvertFrom(object source)
+    {
+      string str = source as string;
+      if (str != null)
+      {
+        return bool.Parse(str);
+      }
+      throw ConversionNotSupportedException.Create(typeof(bool), source);
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/ConversionNotSupportedException.cs b/src/log4net/Util/TypeConverters/ConversionNotSupportedException.cs
index 717e8bc..61bd750 100644
--- a/src/log4net/Util/TypeConverters/ConversionNotSupportedException.cs
+++ b/src/log4net/Util/TypeConverters/ConversionNotSupportedException.cs
@@ -24,135 +24,135 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Exception base type for conversion errors.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This type extends <see cref="ApplicationException"/>. It
-	/// does not add any new functionality but does differentiate the
-	/// type of exception being thrown.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
+  /// <summary>
+  /// Exception base type for conversion errors.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This type extends <see cref="ApplicationException"/>. It
+  /// does not add any new functionality but does differentiate the
+  /// type of exception being thrown.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
 #if !NETCF
-	[Serializable]
+  [Serializable]
 #endif
 #if NETSTANDARD1_3
-	public class ConversionNotSupportedException : Exception
+  public class ConversionNotSupportedException : Exception
 #else
-	public class ConversionNotSupportedException : ApplicationException 
+  public class ConversionNotSupportedException : ApplicationException
 #endif
-	{
-		#region Public Instance Constructors
+  {
+    #region Public Instance Constructors
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class.
-		/// </para>
-		/// </remarks>
-		public ConversionNotSupportedException()
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class.
+    /// </para>
+    /// </remarks>
+    public ConversionNotSupportedException()
+    {
+    }
 
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="message">A message to include with the exception.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class
-		/// with the specified message.
-		/// </para>
-		/// </remarks>
-		public ConversionNotSupportedException(String message) : base(message) 
-		{
-		}
-		
-		/// <summary>
-		/// Constructor
-		/// </summary>
-		/// <param name="message">A message to include with the exception.</param>
-		/// <param name="innerException">A nested exception to include.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class
-		/// with the specified message and inner exception.
-		/// </para>
-		/// </remarks>
-		public ConversionNotSupportedException(String message, Exception innerException) : base(message, innerException) 
-		{
-		}
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="message">A message to include with the exception.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class
+    /// with the specified message.
+    /// </para>
+    /// </remarks>
+    public ConversionNotSupportedException(String message) : base(message)
+    {
+    }
 
-		#endregion Public Instance Constructors
+    /// <summary>
+    /// Constructor
+    /// </summary>
+    /// <param name="message">A message to include with the exception.</param>
+    /// <param name="innerException">A nested exception to include.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class
+    /// with the specified message and inner exception.
+    /// </para>
+    /// </remarks>
+    public ConversionNotSupportedException(String message, Exception innerException) : base(message, innerException)
+    {
+    }
 
-		#region Protected Instance Constructors
+    #endregion Public Instance Constructors
+
+    #region Protected Instance Constructors
 
 #if !NETCF && !NETSTANDARD1_3
-		/// <summary>
-		/// Serialization constructor
-		/// </summary>
-		/// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data about the exception being thrown.</param>
-		/// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
-		/// <remarks>
-		/// <para>
-		/// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class 
-		/// with serialized data.
-		/// </para>
-		/// </remarks>
-		protected ConversionNotSupportedException(SerializationInfo info, StreamingContext context) : base(info, context) 
-		{
-		}
+    /// <summary>
+    /// Serialization constructor
+    /// </summary>
+    /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data about the exception being thrown.</param>
+    /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information about the source or destination.</param>
+    /// <remarks>
+    /// <para>
+    /// Initializes a new instance of the <see cref="ConversionNotSupportedException" /> class 
+    /// with serialized data.
+    /// </para>
+    /// </remarks>
+    protected ConversionNotSupportedException(SerializationInfo info, StreamingContext context) : base(info, context)
+    {
+    }
 #endif
 
-		#endregion Protected Instance Constructors
+    #endregion Protected Instance Constructors
 
-		#region  Public Static Methods
+    #region  Public Static Methods
 
-		/// <summary>
-		/// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
-		/// </summary>
-		/// <param name="destinationType">The conversion destination type.</param>
-		/// <param name="sourceValue">The value to convert.</param>
-		/// <returns>An instance of the <see cref="ConversionNotSupportedException" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
-		/// </para>
-		/// </remarks>
-		public static ConversionNotSupportedException Create(Type destinationType, object sourceValue)
-		{
-			return Create(destinationType, sourceValue, null);
-		}
+    /// <summary>
+    /// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
+    /// </summary>
+    /// <param name="destinationType">The conversion destination type.</param>
+    /// <param name="sourceValue">The value to convert.</param>
+    /// <returns>An instance of the <see cref="ConversionNotSupportedException" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
+    /// </para>
+    /// </remarks>
+    public static ConversionNotSupportedException Create(Type destinationType, object sourceValue)
+    {
+      return Create(destinationType, sourceValue, null);
+    }
 
-		/// <summary>
-		/// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
-		/// </summary>
-		/// <param name="destinationType">The conversion destination type.</param>
-		/// <param name="sourceValue">The value to convert.</param>
-		/// <param name="innerException">A nested exception to include.</param>
-		/// <returns>An instance of the <see cref="ConversionNotSupportedException" />.</returns>
-		/// <remarks>
-		/// <para>
-		/// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
-		/// </para>
-		/// </remarks>
-		public static ConversionNotSupportedException Create(Type destinationType, object sourceValue, Exception innerException)
-		{
-			if (sourceValue == null)
-			{
-				return new ConversionNotSupportedException("Cannot convert value [null] to type ["+destinationType+"]", innerException);
-			}
-			else
-			{
-				return new ConversionNotSupportedException("Cannot convert from type ["+sourceValue.GetType()+"] value ["+sourceValue+"] to type ["+destinationType+"]", innerException);
-			}
-		}
+    /// <summary>
+    /// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
+    /// </summary>
+    /// <param name="destinationType">The conversion destination type.</param>
+    /// <param name="sourceValue">The value to convert.</param>
+    /// <param name="innerException">A nested exception to include.</param>
+    /// <returns>An instance of the <see cref="ConversionNotSupportedException" />.</returns>
+    /// <remarks>
+    /// <para>
+    /// Creates a new instance of the <see cref="ConversionNotSupportedException" /> class.
+    /// </para>
+    /// </remarks>
+    public static ConversionNotSupportedException Create(Type destinationType, object sourceValue, Exception innerException)
+    {
+      if (sourceValue == null)
+      {
+        return new ConversionNotSupportedException("Cannot convert value [null] to type [" + destinationType + "]", innerException);
+      }
+      else
+      {
+        return new ConversionNotSupportedException("Cannot convert from type [" + sourceValue.GetType() + "] value [" + sourceValue + "] to type [" + destinationType + "]", innerException);
+      }
+    }
 
-		#endregion  Public Static Methods
-	}
+    #endregion  Public Static Methods
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/ConverterRegistry.cs b/src/log4net/Util/TypeConverters/ConverterRegistry.cs
index e20bbd5..ec3e59b 100644
--- a/src/log4net/Util/TypeConverters/ConverterRegistry.cs
+++ b/src/log4net/Util/TypeConverters/ConverterRegistry.cs
@@ -25,280 +25,280 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Register of type converters for specific types.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Maintains a registry of type converters used to convert between
-	/// types.
-	/// </para>
-	/// <para>
-	/// Use the <see cref="M:AddConverter(Type, object)"/> and 
-	/// <see cref="M:AddConverter(Type, Type)"/> methods to register new converters.
-	/// The <see cref="GetConvertTo"/> and <see cref="GetConvertFrom"/> methods
-	/// lookup appropriate converters to use.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="IConvertFrom"/>
-	/// <seealso cref="IConvertTo"/>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public sealed class ConverterRegistry
-	{
-		#region Private Constructors
+  /// <summary>
+  /// Register of type converters for specific types.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Maintains a registry of type converters used to convert between
+  /// types.
+  /// </para>
+  /// <para>
+  /// Use the <see cref="M:AddConverter(Type, object)"/> and 
+  /// <see cref="M:AddConverter(Type, Type)"/> methods to register new converters.
+  /// The <see cref="GetConvertTo"/> and <see cref="GetConvertFrom"/> methods
+  /// lookup appropriate converters to use.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="IConvertFrom"/>
+  /// <seealso cref="IConvertTo"/>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public sealed class ConverterRegistry
+  {
+    #region Private Constructors
 
-		/// <summary>
-		/// Private constructor
-		/// </summary>
-		/// <remarks>
-		/// Initializes a new instance of the <see cref="ConverterRegistry" /> class.
-		/// </remarks>
-		private ConverterRegistry() 
-		{
-		}
+    /// <summary>
+    /// Private constructor
+    /// </summary>
+    /// <remarks>
+    /// Initializes a new instance of the <see cref="ConverterRegistry" /> class.
+    /// </remarks>
+    private ConverterRegistry()
+    {
+    }
 
-		#endregion Private Constructors
+    #endregion Private Constructors
 
-		#region Static Constructor
+    #region Static Constructor
 
-		/// <summary>
-		/// Static constructor.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This constructor defines the intrinsic type converters.
-		/// </para>
-		/// </remarks>
-		static ConverterRegistry()
-		{
-			// Add predefined converters here
-			AddConverter(typeof(bool), typeof(BooleanConverter));
-			AddConverter(typeof(System.Text.Encoding), typeof(EncodingConverter));
-			AddConverter(typeof(System.Type), typeof(TypeConverter));
-			AddConverter(typeof(log4net.Layout.PatternLayout), typeof(PatternLayoutConverter));
-			AddConverter(typeof(log4net.Util.PatternString), typeof(PatternStringConverter));
-			AddConverter(typeof(System.Net.IPAddress), typeof(IPAddressConverter));
-		}
+    /// <summary>
+    /// Static constructor.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This constructor defines the intrinsic type converters.
+    /// </para>
+    /// </remarks>
+    static ConverterRegistry()
+    {
+      // Add predefined converters here
+      AddConverter(typeof(bool), typeof(BooleanConverter));
+      AddConverter(typeof(System.Text.Encoding), typeof(EncodingConverter));
+      AddConverter(typeof(System.Type), typeof(TypeConverter));
+      AddConverter(typeof(log4net.Layout.PatternLayout), typeof(PatternLayoutConverter));
+      AddConverter(typeof(log4net.Util.PatternString), typeof(PatternStringConverter));
+      AddConverter(typeof(System.Net.IPAddress), typeof(IPAddressConverter));
+    }
 
-		#endregion Static Constructor
+    #endregion Static Constructor
 
-		#region Public Static Methods
+    #region Public Static Methods
 
-		/// <summary>
-		/// Adds a converter for a specific type.
-		/// </summary>
-		/// <param name="destinationType">The type being converted to.</param>
-		/// <param name="converter">The type converter to use to convert to the destination type.</param>
-		/// <remarks>
-		/// <para>
-		/// Adds a converter instance for a specific type.
-		/// </para>
-		/// </remarks>
-		public static void AddConverter(Type destinationType, object converter)
-		{
-			if (destinationType != null && converter != null)
-			{
-				lock(s_type2converter)
-				{
-					s_type2converter[destinationType] = converter;
-				}
-			}
-		}
+    /// <summary>
+    /// Adds a converter for a specific type.
+    /// </summary>
+    /// <param name="destinationType">The type being converted to.</param>
+    /// <param name="converter">The type converter to use to convert to the destination type.</param>
+    /// <remarks>
+    /// <para>
+    /// Adds a converter instance for a specific type.
+    /// </para>
+    /// </remarks>
+    public static void AddConverter(Type destinationType, object converter)
+    {
+      if (destinationType != null && converter != null)
+      {
+        lock (s_type2converter)
+        {
+          s_type2converter[destinationType] = converter;
+        }
+      }
+    }
 
-		/// <summary>
-		/// Adds a converter for a specific type.
-		/// </summary>
-		/// <param name="destinationType">The type being converted to.</param>
-		/// <param name="converterType">The type of the type converter to use to convert to the destination type.</param>
-		/// <remarks>
-		/// <para>
-		/// Adds a converter <see cref="Type"/> for a specific type.
-		/// </para>
-		/// </remarks>
-		public static void AddConverter(Type destinationType, Type converterType)
-		{
-			AddConverter(destinationType, CreateConverterInstance(converterType));
-		}
+    /// <summary>
+    /// Adds a converter for a specific type.
+    /// </summary>
+    /// <param name="destinationType">The type being converted to.</param>
+    /// <param name="converterType">The type of the type converter to use to convert to the destination type.</param>
+    /// <remarks>
+    /// <para>
+    /// Adds a converter <see cref="Type"/> for a specific type.
+    /// </para>
+    /// </remarks>
+    public static void AddConverter(Type destinationType, Type converterType)
+    {
+      AddConverter(destinationType, CreateConverterInstance(converterType));
+    }
 
-		/// <summary>
-		/// Gets the type converter to use to convert values to the destination type.
-		/// </summary>
-		/// <param name="sourceType">The type being converted from.</param>
-		/// <param name="destinationType">The type being converted to.</param>
-		/// <returns>
-		/// The type converter instance to use for type conversions or <c>null</c> 
-		/// if no type converter is found.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the type converter to use to convert values to the destination type.
-		/// </para>
-		/// </remarks>
-		public static IConvertTo GetConvertTo(Type sourceType, Type destinationType)
-		{
-			// TODO: Support inheriting type converters.
-			// i.e. getting a type converter for a base of sourceType
+    /// <summary>
+    /// Gets the type converter to use to convert values to the destination type.
+    /// </summary>
+    /// <param name="sourceType">The type being converted from.</param>
+    /// <param name="destinationType">The type being converted to.</param>
+    /// <returns>
+    /// The type converter instance to use for type conversions or <c>null</c> 
+    /// if no type converter is found.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the type converter to use to convert values to the destination type.
+    /// </para>
+    /// </remarks>
+    public static IConvertTo GetConvertTo(Type sourceType, Type destinationType)
+    {
+      // TODO: Support inheriting type converters.
+      // i.e. getting a type converter for a base of sourceType
 
-			// TODO: Is destinationType required? We don't use it for anything.
+      // TODO: Is destinationType required? We don't use it for anything.
 
-			lock(s_type2converter)
-			{
-				// Lookup in the static registry
-				IConvertTo converter = s_type2converter[sourceType] as IConvertTo;
+      lock (s_type2converter)
+      {
+        // Lookup in the static registry
+        IConvertTo converter = s_type2converter[sourceType] as IConvertTo;
 
-				if (converter == null)
-				{
-					// Lookup using attributes
-					converter = GetConverterFromAttribute(sourceType) as IConvertTo;
+        if (converter == null)
+        {
+          // Lookup using attributes
+          converter = GetConverterFromAttribute(sourceType) as IConvertTo;
 
-					if (converter != null)
-					{
-						// Store in registry
-						s_type2converter[sourceType] = converter;
-					}
-				}
+          if (converter != null)
+          {
+            // Store in registry
+            s_type2converter[sourceType] = converter;
+          }
+        }
 
-				return converter;
-			}
-		}
+        return converter;
+      }
+    }
 
-		/// <summary>
-		/// Gets the type converter to use to convert values to the destination type.
-		/// </summary>
-		/// <param name="destinationType">The type being converted to.</param>
-		/// <returns>
-		/// The type converter instance to use for type conversions or <c>null</c> 
-		/// if no type converter is found.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Gets the type converter to use to convert values to the destination type.
-		/// </para>
-		/// </remarks>
-		public static IConvertFrom GetConvertFrom(Type destinationType)
-		{
-			// TODO: Support inheriting type converters.
-			// i.e. getting a type converter for a base of destinationType
+    /// <summary>
+    /// Gets the type converter to use to convert values to the destination type.
+    /// </summary>
+    /// <param name="destinationType">The type being converted to.</param>
+    /// <returns>
+    /// The type converter instance to use for type conversions or <c>null</c> 
+    /// if no type converter is found.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Gets the type converter to use to convert values to the destination type.
+    /// </para>
+    /// </remarks>
+    public static IConvertFrom GetConvertFrom(Type destinationType)
+    {
+      // TODO: Support inheriting type converters.
+      // i.e. getting a type converter for a base of destinationType
 
-			lock(s_type2converter)
-			{
-				// Lookup in the static registry
-				IConvertFrom converter = s_type2converter[destinationType] as IConvertFrom;
+      lock (s_type2converter)
+      {
+        // Lookup in the static registry
+        IConvertFrom converter = s_type2converter[destinationType] as IConvertFrom;
 
-				if (converter == null)
-				{
-					// Lookup using attributes
-					converter = GetConverterFromAttribute(destinationType) as IConvertFrom;
+        if (converter == null)
+        {
+          // Lookup using attributes
+          converter = GetConverterFromAttribute(destinationType) as IConvertFrom;
 
-					if (converter != null)
-					{
-						// Store in registry
-						s_type2converter[destinationType] = converter;
-					}
-				}
+          if (converter != null)
+          {
+            // Store in registry
+            s_type2converter[destinationType] = converter;
+          }
+        }
 
-				return converter;
-			}
-		}
-		
-		/// <summary>
-		/// Lookups the type converter to use as specified by the attributes on the 
-		/// destination type.
-		/// </summary>
-		/// <param name="destinationType">The type being converted to.</param>
-		/// <returns>
-		/// The type converter instance to use for type conversions or <c>null</c> 
-		/// if no type converter is found.
-		/// </returns>
-		private static object GetConverterFromAttribute(Type destinationType)
-		{
-			// Look for an attribute on the destination type
-			var attributes = destinationType
+        return converter;
+      }
+    }
+
+    /// <summary>
+    /// Lookups the type converter to use as specified by the attributes on the 
+    /// destination type.
+    /// </summary>
+    /// <param name="destinationType">The type being converted to.</param>
+    /// <returns>
+    /// The type converter instance to use for type conversions or <c>null</c> 
+    /// if no type converter is found.
+    /// </returns>
+    private static object GetConverterFromAttribute(Type destinationType)
+    {
+      // Look for an attribute on the destination type
+      var attributes = destinationType
 #if NETSTANDARD1_3
-					.GetTypeInfo()
+          .GetTypeInfo()
 #endif
-				.GetCustomAttributes(typeof(TypeConverterAttribute), true);
-			if (attributes is null)
-			{
-				// I assume the original null check is perhaps for CF or older .NET versions -- please leave in place
-				return null;
-			}
+        .GetCustomAttributes(typeof(TypeConverterAttribute), true);
+      if (attributes is null)
+      {
+        // I assume the original null check is perhaps for CF or older .NET versions -- please leave in place
+        return null;
+      }
 
-			foreach (var attribute in attributes)
-			{
-				var tcAttr = attribute as TypeConverterAttribute;
-				if (tcAttr != null)
-				{
-					var converterType = SystemInfo.GetTypeFromString(destinationType, tcAttr.ConverterTypeName, false, true);
-					return CreateConverterInstance(converterType);
-				}
-			}
+      foreach (var attribute in attributes)
+      {
+        var tcAttr = attribute as TypeConverterAttribute;
+        if (tcAttr != null)
+        {
+          var converterType = SystemInfo.GetTypeFromString(destinationType, tcAttr.ConverterTypeName, false, true);
+          return CreateConverterInstance(converterType);
+        }
+      }
 
-			// Not found converter using attributes
-			return null;
-		}
+      // Not found converter using attributes
+      return null;
+    }
 
-		/// <summary>
-		/// Creates the instance of the type converter.
-		/// </summary>
-		/// <param name="converterType">The type of the type converter.</param>
-		/// <returns>
-		/// The type converter instance to use for type conversions or <c>null</c> 
-		/// if no type converter is found.
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// The type specified for the type converter must implement 
-		/// the <see cref="IConvertFrom"/> or <see cref="IConvertTo"/> interfaces 
-		/// and must have a public default (no argument) constructor.
-		/// </para>
-		/// </remarks>
-		private static object CreateConverterInstance(Type converterType)
-		{
-			if (converterType == null)
-			{
-				throw new ArgumentNullException("converterType", "CreateConverterInstance cannot create instance, converterType is null");
-			}
+    /// <summary>
+    /// Creates the instance of the type converter.
+    /// </summary>
+    /// <param name="converterType">The type of the type converter.</param>
+    /// <returns>
+    /// The type converter instance to use for type conversions or <c>null</c> 
+    /// if no type converter is found.
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// The type specified for the type converter must implement 
+    /// the <see cref="IConvertFrom"/> or <see cref="IConvertTo"/> interfaces 
+    /// and must have a public default (no argument) constructor.
+    /// </para>
+    /// </remarks>
+    private static object CreateConverterInstance(Type converterType)
+    {
+      if (converterType == null)
+      {
+        throw new ArgumentNullException("converterType", "CreateConverterInstance cannot create instance, converterType is null");
+      }
 
-			// Check type is a converter
-			if (typeof(IConvertFrom).IsAssignableFrom(converterType) || typeof(IConvertTo).IsAssignableFrom(converterType))
-			{
-				try
-				{
-					// Create the type converter
-					return Activator.CreateInstance(converterType);
-				}
-				catch(Exception ex)
-				{
-					LogLog.Error(declaringType, "Cannot CreateConverterInstance of type ["+converterType.FullName+"], Exception in call to Activator.CreateInstance", ex);
-				}
-			}
-			else
-			{
-				LogLog.Error(declaringType, "Cannot CreateConverterInstance of type ["+converterType.FullName+"], type does not implement IConvertFrom or IConvertTo");
-			}
-			return null;
-		}
+      // Check type is a converter
+      if (typeof(IConvertFrom).IsAssignableFrom(converterType) || typeof(IConvertTo).IsAssignableFrom(converterType))
+      {
+        try
+        {
+          // Create the type converter
+          return Activator.CreateInstance(converterType);
+        }
+        catch (Exception ex)
+        {
+          LogLog.Error(declaringType, "Cannot CreateConverterInstance of type [" + converterType.FullName + "], Exception in call to Activator.CreateInstance", ex);
+        }
+      }
+      else
+      {
+        LogLog.Error(declaringType, "Cannot CreateConverterInstance of type [" + converterType.FullName + "], type does not implement IConvertFrom or IConvertTo");
+      }
+      return null;
+    }
 
-		#endregion Public Static Methods
+    #endregion Public Static Methods
 
-		#region Private Static Fields
+    #region Private Static Fields
 
-	    /// <summary>
-	    /// The fully qualified type of the ConverterRegistry class.
-	    /// </summary>
-	    /// <remarks>
-	    /// Used by the internal logger to record the Type of the
-	    /// log message.
-	    /// </remarks>
-	    private static readonly Type declaringType = typeof(ConverterRegistry);
+    /// <summary>
+    /// The fully qualified type of the ConverterRegistry class.
+    /// </summary>
+    /// <remarks>
+    /// Used by the internal logger to record the Type of the
+    /// log message.
+    /// </remarks>
+    private static readonly Type declaringType = typeof(ConverterRegistry);
 
-		/// <summary>
-		/// Mapping from <see cref="Type" /> to type converter.
-		/// </summary>
-		private static Hashtable s_type2converter = new Hashtable();
+    /// <summary>
+    /// Mapping from <see cref="Type" /> to type converter.
+    /// </summary>
+    private static Hashtable s_type2converter = new Hashtable();
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/EncodingConverter.cs b/src/log4net/Util/TypeConverters/EncodingConverter.cs
index 93c9eac..45d5438 100644
--- a/src/log4net/Util/TypeConverters/EncodingConverter.cs
+++ b/src/log4net/Util/TypeConverters/EncodingConverter.cs
@@ -22,65 +22,65 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Supports conversion from string to <see cref="Encoding"/> type.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Supports conversion from string to <see cref="Encoding"/> type.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="ConverterRegistry"/>
-	/// <seealso cref="IConvertFrom"/>
-	/// <seealso cref="IConvertTo"/>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	internal class EncodingConverter : IConvertFrom 
-	{
-		#region Implementation of IConvertFrom
+  /// <summary>
+  /// Supports conversion from string to <see cref="Encoding"/> type.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Supports conversion from string to <see cref="Encoding"/> type.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="ConverterRegistry"/>
+  /// <seealso cref="IConvertFrom"/>
+  /// <seealso cref="IConvertTo"/>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  internal class EncodingConverter : IConvertFrom
+  {
+    #region Implementation of IConvertFrom
 
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="sourceType"/> is
-		/// the <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(Type sourceType) 
-		{
-			return (sourceType == typeof(string));
-		}
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="sourceType"/> is
+    /// the <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(Type sourceType)
+    {
+      return (sourceType == typeof(string));
+    }
 
-		/// <summary>
-		/// Overrides the ConvertFrom method of IConvertFrom.
-		/// </summary>
-		/// <param name="source">the object to convert to an encoding</param>
-		/// <returns>the encoding</returns>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="M:Encoding.GetEncoding(string)"/> method to 
-		/// convert the <see cref="String"/> argument to an <see cref="Encoding"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ConversionNotSupportedException">
-		/// The <paramref name="source"/> object cannot be converted to the
-		/// target type. To check for this condition use the <see cref="CanConvertFrom"/>
-		/// method.
-		/// </exception>
-		public object ConvertFrom(object source) 
-		{
-			string str = source as string;
-			if (str != null) 
-			{
-				return Encoding.GetEncoding(str);
-			}
-			throw ConversionNotSupportedException.Create(typeof(Encoding), source);
-		}
+    /// <summary>
+    /// Overrides the ConvertFrom method of IConvertFrom.
+    /// </summary>
+    /// <param name="source">the object to convert to an encoding</param>
+    /// <returns>the encoding</returns>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="M:Encoding.GetEncoding(string)"/> method to 
+    /// convert the <see cref="String"/> argument to an <see cref="Encoding"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
+    /// method.
+    /// </exception>
+    public object ConvertFrom(object source)
+    {
+      string str = source as string;
+      if (str != null)
+      {
+        return Encoding.GetEncoding(str);
+      }
+      throw ConversionNotSupportedException.Create(typeof(Encoding), source);
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/IConvertFrom.cs b/src/log4net/Util/TypeConverters/IConvertFrom.cs
index 1dbd473..f34f9b2 100644
--- a/src/log4net/Util/TypeConverters/IConvertFrom.cs
+++ b/src/log4net/Util/TypeConverters/IConvertFrom.cs
@@ -21,43 +21,43 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Interface supported by type converters
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This interface supports conversion from arbitrary types
-	/// to a single target type. See <see cref="TypeConverterAttribute"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	public interface IConvertFrom
-	{
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if the <paramref name="sourceType"/> can be converted to the
-		/// type supported by this converter.
-		/// </para>
-		/// </remarks>
-		bool CanConvertFrom(Type sourceType);
+  /// <summary>
+  /// Interface supported by type converters
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This interface supports conversion from arbitrary types
+  /// to a single target type. See <see cref="TypeConverterAttribute"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  public interface IConvertFrom
+  {
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if the <paramref name="sourceType"/> can be converted to the
+    /// type supported by this converter.
+    /// </para>
+    /// </remarks>
+    bool CanConvertFrom(Type sourceType);
 
-		/// <summary>
-		/// Convert the source object to the type supported by this object
-		/// </summary>
-		/// <param name="source">the object to convert</param>
-		/// <returns>the converted object</returns>
-		/// <remarks>
-		/// <para>
-		/// Converts the <paramref name="source"/> to the type supported
-		/// by this converter.
-		/// </para>
-		/// </remarks>
-		object ConvertFrom(object source);
-	}
+    /// <summary>
+    /// Convert the source object to the type supported by this object
+    /// </summary>
+    /// <param name="source">the object to convert</param>
+    /// <returns>the converted object</returns>
+    /// <remarks>
+    /// <para>
+    /// Converts the <paramref name="source"/> to the type supported
+    /// by this converter.
+    /// </para>
+    /// </remarks>
+    object ConvertFrom(object source);
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/IConvertTo.cs b/src/log4net/Util/TypeConverters/IConvertTo.cs
index e986372..abd748f 100644
--- a/src/log4net/Util/TypeConverters/IConvertTo.cs
+++ b/src/log4net/Util/TypeConverters/IConvertTo.cs
@@ -21,43 +21,43 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Interface supported by type converters
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This interface supports conversion from a single type to arbitrary types.
-	/// See <see cref="TypeConverterAttribute"/>.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	public interface IConvertTo
-	{
-		/// <summary>
-		/// Returns whether this converter can convert the object to the specified type
-		/// </summary>
-		/// <param name="targetType">A Type that represents the type you want to convert to</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Test if the type supported by this converter can be converted to the
-		/// <paramref name="targetType"/>.
-		/// </para>
-		/// </remarks>
-		bool CanConvertTo(Type targetType);
+  /// <summary>
+  /// Interface supported by type converters
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This interface supports conversion from a single type to arbitrary types.
+  /// See <see cref="TypeConverterAttribute"/>.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  public interface IConvertTo
+  {
+    /// <summary>
+    /// Returns whether this converter can convert the object to the specified type
+    /// </summary>
+    /// <param name="targetType">A Type that represents the type you want to convert to</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Test if the type supported by this converter can be converted to the
+    /// <paramref name="targetType"/>.
+    /// </para>
+    /// </remarks>
+    bool CanConvertTo(Type targetType);
 
-		/// <summary>
-		/// Converts the given value object to the specified type, using the arguments
-		/// </summary>
-		/// <param name="source">the object to convert</param>
-		/// <param name="targetType">The Type to convert the value parameter to</param>
-		/// <returns>the converted object</returns>
-		/// <remarks>
-		/// <para>
-		/// Converts the <paramref name="source"/> (which must be of the type supported
-		/// by this converter) to the <paramref name="targetType"/> specified..
-		/// </para>
-		/// </remarks>
-		object ConvertTo(object source, Type targetType);
-	}
+    /// <summary>
+    /// Converts the given value object to the specified type, using the arguments
+    /// </summary>
+    /// <param name="source">the object to convert</param>
+    /// <param name="targetType">The Type to convert the value parameter to</param>
+    /// <returns>the converted object</returns>
+    /// <remarks>
+    /// <para>
+    /// Converts the <paramref name="source"/> (which must be of the type supported
+    /// by this converter) to the <paramref name="targetType"/> specified..
+    /// </para>
+    /// </remarks>
+    object ConvertTo(object source, Type targetType);
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/IPAddressConverter.cs b/src/log4net/Util/TypeConverters/IPAddressConverter.cs
index 56e6b31..60c7bf6 100644
--- a/src/log4net/Util/TypeConverters/IPAddressConverter.cs
+++ b/src/log4net/Util/TypeConverters/IPAddressConverter.cs
@@ -22,127 +22,127 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Supports conversion from string to <see cref="IPAddress"/> type.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Supports conversion from string to <see cref="IPAddress"/> type.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="ConverterRegistry"/>
-	/// <seealso cref="IConvertFrom"/>
-	/// <author>Nicko Cadell</author>
-	internal class IPAddressConverter : IConvertFrom 
-	{
-		#region Implementation of IConvertFrom
+  /// <summary>
+  /// Supports conversion from string to <see cref="IPAddress"/> type.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Supports conversion from string to <see cref="IPAddress"/> type.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="ConverterRegistry"/>
+  /// <seealso cref="IConvertFrom"/>
+  /// <author>Nicko Cadell</author>
+  internal class IPAddressConverter : IConvertFrom
+  {
+    #region Implementation of IConvertFrom
 
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="sourceType"/> is
-		/// the <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(Type sourceType) 
-		{
-			return (sourceType == typeof(string));
-		}
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="sourceType"/> is
+    /// the <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(Type sourceType)
+    {
+      return (sourceType == typeof(string));
+    }
 
-		/// <summary>
-		/// Overrides the ConvertFrom method of IConvertFrom.
-		/// </summary>
-		/// <param name="source">the object to convert to an IPAddress</param>
-		/// <returns>the IPAddress</returns>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="IPAddress.Parse"/> method to convert the
-		/// <see cref="String"/> argument to an <see cref="IPAddress"/>.
-		/// If that fails then the string is resolved as a DNS hostname.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ConversionNotSupportedException">
-		/// The <paramref name="source"/> object cannot be converted to the
-		/// target type. To check for this condition use the <see cref="CanConvertFrom"/>
-		/// method.
-		/// </exception>
-		public object ConvertFrom(object source) 
-		{
-			string str = source as string;
-			if (str != null && str.Length > 0) 
-			{
-				try
-				{
+    /// <summary>
+    /// Overrides the ConvertFrom method of IConvertFrom.
+    /// </summary>
+    /// <param name="source">the object to convert to an IPAddress</param>
+    /// <returns>the IPAddress</returns>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="IPAddress.Parse"/> method to convert the
+    /// <see cref="String"/> argument to an <see cref="IPAddress"/>.
+    /// If that fails then the string is resolved as a DNS hostname.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
+    /// method.
+    /// </exception>
+    public object ConvertFrom(object source)
+    {
+      string str = source as string;
+      if (str != null && str.Length > 0)
+      {
+        try
+        {
 #if NET_2_0 || NETCF_2_0
 
 #if !NETCF_2_0
-					// Try an explicit parse of string representation of an IPAddress (v4 or v6)
-					IPAddress result;
-					if (IPAddress.TryParse(str, out result))
-					{
-						return result;
-					}
+          // Try an explicit parse of string representation of an IPAddress (v4 or v6)
+          IPAddress result;
+          if (IPAddress.TryParse(str, out result))
+          {
+            return result;
+          }
 #endif
 
-					// Try to resolve via DNS. This is a blocking call. 
-					// GetHostEntry works with either an IPAddress string or a host name
-					IPHostEntry host = Dns.GetHostEntry(str);
-					if (host != null && 
-						host.AddressList != null && 
-						host.AddressList.Length > 0 &&
-						host.AddressList[0] != null)
-					{
-						return host.AddressList[0];
-					}
+          // Try to resolve via DNS. This is a blocking call. 
+          // GetHostEntry works with either an IPAddress string or a host name
+          IPHostEntry host = Dns.GetHostEntry(str);
+          if (host != null &&
+            host.AddressList != null &&
+            host.AddressList.Length > 0 &&
+            host.AddressList[0] != null)
+          {
+            return host.AddressList[0];
+          }
 #else
-					// Before .NET 2 we need to try to parse the IPAddress from the string first
+          // Before .NET 2 we need to try to parse the IPAddress from the string first
 
-					// Check if the string only contains IP address valid chars
-					if (str.Trim(validIpAddressChars).Length == 0)
-					{
-						try
-						{
-							// try to parse the string as an IP address
-							return IPAddress.Parse(str);
-						}
-						catch(FormatException)
-						{
-							// Ignore a FormatException, try to resolve via DNS
-						}
-					}
+          // Check if the string only contains IP address valid chars
+          if (str.Trim(validIpAddressChars).Length == 0)
+          {
+            try
+            {
+              // try to parse the string as an IP address
+              return IPAddress.Parse(str);
+            }
+            catch(FormatException)
+            {
+              // Ignore a FormatException, try to resolve via DNS
+            }
+          }
 
-					// Try to resolve via DNS. This is a blocking call.
+          // Try to resolve via DNS. This is a blocking call.
 #if NETSTANDARD
-					IPHostEntry host = Dns.GetHostEntryAsync(str).GetAwaiter().GetResult();
+          IPHostEntry host = Dns.GetHostEntryAsync(str).GetAwaiter().GetResult();
 #else
-					IPHostEntry host = Dns.GetHostByName(str);
+          IPHostEntry host = Dns.GetHostByName(str);
 #endif
-					if (host != null && 
-						host.AddressList != null && 
-						host.AddressList.Length > 0 &&
-						host.AddressList[0] != null)
-					{
-						return host.AddressList[0];
-					}
+          if (host != null && 
+            host.AddressList != null && 
+            host.AddressList.Length > 0 &&
+            host.AddressList[0] != null)
+          {
+            return host.AddressList[0];
+          }
 #endif
-				}
-				catch(Exception ex)
-				{
-					throw ConversionNotSupportedException.Create(typeof(IPAddress), source, ex);
-				}
-			}
-			throw ConversionNotSupportedException.Create(typeof(IPAddress), source);
-		}
+        }
+        catch (Exception ex)
+        {
+          throw ConversionNotSupportedException.Create(typeof(IPAddress), source, ex);
+        }
+      }
+      throw ConversionNotSupportedException.Create(typeof(IPAddress), source);
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Valid characters in an IPv4 or IPv6 address string. (Does not support subnets)
-		/// </summary>
-		private static readonly char[] validIpAddressChars = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F','x','X','.',':','%'};
-	}
+    /// <summary>
+    /// Valid characters in an IPv4 or IPv6 address string. (Does not support subnets)
+    /// </summary>
+    private static readonly char[] validIpAddressChars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'A', 'B', 'C', 'D', 'E', 'F', 'x', 'X', '.', ':', '%' };
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/PatternLayoutConverter.cs b/src/log4net/Util/TypeConverters/PatternLayoutConverter.cs
index c9942b2..4c342e8 100644
--- a/src/log4net/Util/TypeConverters/PatternLayoutConverter.cs
+++ b/src/log4net/Util/TypeConverters/PatternLayoutConverter.cs
@@ -24,69 +24,69 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Supports conversion from string to <see cref="PatternLayout"/> type.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Supports conversion from string to <see cref="PatternLayout"/> type.
-	/// </para>
-	/// <para>
-	/// The string is used as the <see cref="PatternLayout.ConversionPattern"/> 
-	/// of the <see cref="PatternLayout"/>.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="ConverterRegistry"/>
-	/// <seealso cref="IConvertFrom"/>
-	/// <seealso cref="IConvertTo"/>
-	/// <author>Nicko Cadell</author>
-	internal class PatternLayoutConverter : IConvertFrom
-	{
-		#region Implementation of IConvertFrom
+  /// <summary>
+  /// Supports conversion from string to <see cref="PatternLayout"/> type.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Supports conversion from string to <see cref="PatternLayout"/> type.
+  /// </para>
+  /// <para>
+  /// The string is used as the <see cref="PatternLayout.ConversionPattern"/> 
+  /// of the <see cref="PatternLayout"/>.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="ConverterRegistry"/>
+  /// <seealso cref="IConvertFrom"/>
+  /// <seealso cref="IConvertTo"/>
+  /// <author>Nicko Cadell</author>
+  internal class PatternLayoutConverter : IConvertFrom
+  {
+    #region Implementation of IConvertFrom
 
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="sourceType"/> is
-		/// the <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(System.Type sourceType)
-		{
-			return (sourceType == typeof(string));
-		}
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="sourceType"/> is
+    /// the <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(System.Type sourceType)
+    {
+      return (sourceType == typeof(string));
+    }
 
-		/// <summary>
-		/// Overrides the ConvertFrom method of IConvertFrom.
-		/// </summary>
-		/// <param name="source">the object to convert to a PatternLayout</param>
-		/// <returns>the PatternLayout</returns>
-		/// <remarks>
-		/// <para>
-		/// Creates and returns a new <see cref="PatternLayout"/> using
-		/// the <paramref name="source"/> <see cref="String"/> as the
-		/// <see cref="PatternLayout.ConversionPattern"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ConversionNotSupportedException">
-		/// The <paramref name="source"/> object cannot be converted to the
-		/// target type. To check for this condition use the <see cref="CanConvertFrom"/>
-		/// method.
-		/// </exception>
-		public object ConvertFrom(object source) 
-		{
-			string str = source as string;
-			if (str != null)
-			{
-				return new PatternLayout(str);
-			}
-			throw ConversionNotSupportedException.Create(typeof(PatternLayout), source);
-		}
+    /// <summary>
+    /// Overrides the ConvertFrom method of IConvertFrom.
+    /// </summary>
+    /// <param name="source">the object to convert to a PatternLayout</param>
+    /// <returns>the PatternLayout</returns>
+    /// <remarks>
+    /// <para>
+    /// Creates and returns a new <see cref="PatternLayout"/> using
+    /// the <paramref name="source"/> <see cref="String"/> as the
+    /// <see cref="PatternLayout.ConversionPattern"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
+    /// method.
+    /// </exception>
+    public object ConvertFrom(object source)
+    {
+      string str = source as string;
+      if (str != null)
+      {
+        return new PatternLayout(str);
+      }
+      throw ConversionNotSupportedException.Create(typeof(PatternLayout), source);
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/PatternStringConverter.cs b/src/log4net/Util/TypeConverters/PatternStringConverter.cs
index 82104d0..2352aa9 100644
--- a/src/log4net/Util/TypeConverters/PatternStringConverter.cs
+++ b/src/log4net/Util/TypeConverters/PatternStringConverter.cs
@@ -21,117 +21,117 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Convert between string and <see cref="PatternString"/>
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Supports conversion from string to <see cref="PatternString"/> type, 
-	/// and from a <see cref="PatternString"/> type to a string.
-	/// </para>
-	/// <para>
-	/// The string is used as the <see cref="PatternString.ConversionPattern"/> 
-	/// of the <see cref="PatternString"/>.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="ConverterRegistry"/>
-	/// <seealso cref="IConvertFrom"/>
-	/// <seealso cref="IConvertTo"/>
-	/// <author>Nicko Cadell</author>
-	internal class PatternStringConverter : IConvertTo, IConvertFrom
-	{
-		#region Implementation of IConvertTo
+  /// <summary>
+  /// Convert between string and <see cref="PatternString"/>
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Supports conversion from string to <see cref="PatternString"/> type, 
+  /// and from a <see cref="PatternString"/> type to a string.
+  /// </para>
+  /// <para>
+  /// The string is used as the <see cref="PatternString.ConversionPattern"/> 
+  /// of the <see cref="PatternString"/>.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="ConverterRegistry"/>
+  /// <seealso cref="IConvertFrom"/>
+  /// <seealso cref="IConvertTo"/>
+  /// <author>Nicko Cadell</author>
+  internal class PatternStringConverter : IConvertTo, IConvertFrom
+  {
+    #region Implementation of IConvertTo
 
-		/// <summary>
-		/// Can the target type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="targetType">A <see cref="Type"/> that represents the type you want to convert to</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="targetType"/> is
-		/// assignable from a <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertTo(Type targetType)
-		{
-			return (typeof(string).IsAssignableFrom(targetType));
-		}
+    /// <summary>
+    /// Can the target type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="targetType">A <see cref="Type"/> that represents the type you want to convert to</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="targetType"/> is
+    /// assignable from a <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertTo(Type targetType)
+    {
+      return (typeof(string).IsAssignableFrom(targetType));
+    }
 
-		/// <summary>
-		/// Converts the given value object to the specified type, using the arguments
-		/// </summary>
-		/// <param name="source">the object to convert</param>
-		/// <param name="targetType">The Type to convert the value parameter to</param>
-		/// <returns>the converted object</returns>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="M:PatternString.Format()"/> method to convert the
-		/// <see cref="PatternString"/> argument to a <see cref="String"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ConversionNotSupportedException">
-		/// The <paramref name="source"/> object cannot be converted to the
-		/// <paramref name="targetType"/>. To check for this condition use the 
-		/// <see cref="CanConvertTo"/> method.
-		/// </exception>
-		public object ConvertTo(object source, Type targetType)
-		{
-			PatternString patternString = source as PatternString;
-			if (patternString != null && CanConvertTo(targetType))
-			{
-				return patternString.Format();
-			}
-			throw ConversionNotSupportedException.Create(targetType, source);
-		}
+    /// <summary>
+    /// Converts the given value object to the specified type, using the arguments
+    /// </summary>
+    /// <param name="source">the object to convert</param>
+    /// <param name="targetType">The Type to convert the value parameter to</param>
+    /// <returns>the converted object</returns>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="M:PatternString.Format()"/> method to convert the
+    /// <see cref="PatternString"/> argument to a <see cref="String"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// <paramref name="targetType"/>. To check for this condition use the 
+    /// <see cref="CanConvertTo"/> method.
+    /// </exception>
+    public object ConvertTo(object source, Type targetType)
+    {
+      PatternString patternString = source as PatternString;
+      if (patternString != null && CanConvertTo(targetType))
+      {
+        return patternString.Format();
+      }
+      throw ConversionNotSupportedException.Create(targetType, source);
+    }
 
-		#endregion
+    #endregion
 
-		#region Implementation of IConvertFrom
+    #region Implementation of IConvertFrom
 
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="sourceType"/> is
-		/// the <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(System.Type sourceType)
-		{
-			return (sourceType == typeof(string));
-		}
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="sourceType"/> is
+    /// the <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(System.Type sourceType)
+    {
+      return (sourceType == typeof(string));
+    }
 
-		/// <summary>
-		/// Overrides the ConvertFrom method of IConvertFrom.
-		/// </summary>
-		/// <param name="source">the object to convert to a PatternString</param>
-		/// <returns>the PatternString</returns>
-		/// <remarks>
-		/// <para>
-		/// Creates and returns a new <see cref="PatternString"/> using
-		/// the <paramref name="source"/> <see cref="String"/> as the
-		/// <see cref="PatternString.ConversionPattern"/>.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ConversionNotSupportedException">
-		/// The <paramref name="source"/> object cannot be converted to the
-		/// target type. To check for this condition use the <see cref="CanConvertFrom"/>
-		/// method.
-		/// </exception>
-		public object ConvertFrom(object source) 
-		{
-			string str = source as string;
-			if (str != null)
-			{
-				return new PatternString(str);
-			}
-			throw ConversionNotSupportedException.Create(typeof(PatternString), source);
-		}
+    /// <summary>
+    /// Overrides the ConvertFrom method of IConvertFrom.
+    /// </summary>
+    /// <param name="source">the object to convert to a PatternString</param>
+    /// <returns>the PatternString</returns>
+    /// <remarks>
+    /// <para>
+    /// Creates and returns a new <see cref="PatternString"/> using
+    /// the <paramref name="source"/> <see cref="String"/> as the
+    /// <see cref="PatternString.ConversionPattern"/>.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
+    /// method.
+    /// </exception>
+    public object ConvertFrom(object source)
+    {
+      string str = source as string;
+      if (str != null)
+      {
+        return new PatternString(str);
+      }
+      throw ConversionNotSupportedException.Create(typeof(PatternString), source);
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/TypeConverter.cs b/src/log4net/Util/TypeConverters/TypeConverter.cs
index a4c7c5a..c5136e4 100644
--- a/src/log4net/Util/TypeConverters/TypeConverter.cs
+++ b/src/log4net/Util/TypeConverters/TypeConverter.cs
@@ -24,70 +24,70 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Supports conversion from string to <see cref="Type"/> type.
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Supports conversion from string to <see cref="Type"/> type.
-	/// </para>
-	/// </remarks>
-	/// <seealso cref="ConverterRegistry"/>
-	/// <seealso cref="IConvertFrom"/>
-	/// <seealso cref="IConvertTo"/>
-	/// <author>Nicko Cadell</author>
-	internal class TypeConverter : IConvertFrom 
-	{
-		#region Implementation of IConvertFrom
+  /// <summary>
+  /// Supports conversion from string to <see cref="Type"/> type.
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Supports conversion from string to <see cref="Type"/> type.
+  /// </para>
+  /// </remarks>
+  /// <seealso cref="ConverterRegistry"/>
+  /// <seealso cref="IConvertFrom"/>
+  /// <seealso cref="IConvertTo"/>
+  /// <author>Nicko Cadell</author>
+  internal class TypeConverter : IConvertFrom
+  {
+    #region Implementation of IConvertFrom
 
-		/// <summary>
-		/// Can the source type be converted to the type supported by this object
-		/// </summary>
-		/// <param name="sourceType">the type to convert</param>
-		/// <returns>true if the conversion is possible</returns>
-		/// <remarks>
-		/// <para>
-		/// Returns <c>true</c> if the <paramref name="sourceType"/> is
-		/// the <see cref="String"/> type.
-		/// </para>
-		/// </remarks>
-		public bool CanConvertFrom(Type sourceType) 
-		{
-			return (sourceType == typeof(string));
-		}
+    /// <summary>
+    /// Can the source type be converted to the type supported by this object
+    /// </summary>
+    /// <param name="sourceType">the type to convert</param>
+    /// <returns>true if the conversion is possible</returns>
+    /// <remarks>
+    /// <para>
+    /// Returns <c>true</c> if the <paramref name="sourceType"/> is
+    /// the <see cref="String"/> type.
+    /// </para>
+    /// </remarks>
+    public bool CanConvertFrom(Type sourceType)
+    {
+      return (sourceType == typeof(string));
+    }
 
-		/// <summary>
-		/// Overrides the ConvertFrom method of IConvertFrom.
-		/// </summary>
-		/// <param name="source">the object to convert to a Type</param>
-		/// <returns>the Type</returns>
-		/// <remarks>
-		/// <para>
-		/// Uses the <see cref="M:Type.GetType(string,bool)"/> method to convert the
-		/// <see cref="String"/> argument to a <see cref="Type"/>.
-		/// Additional effort is made to locate partially specified types
-		/// by searching the loaded assemblies.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ConversionNotSupportedException">
-		/// The <paramref name="source"/> object cannot be converted to the
-		/// target type. To check for this condition use the <see cref="CanConvertFrom"/>
-		/// method.
-		/// </exception>
-		public object ConvertFrom(object source) 
-		{
-			string str = source as string;
-			if (str != null)
-			{
+    /// <summary>
+    /// Overrides the ConvertFrom method of IConvertFrom.
+    /// </summary>
+    /// <param name="source">the object to convert to a Type</param>
+    /// <returns>the Type</returns>
+    /// <remarks>
+    /// <para>
+    /// Uses the <see cref="M:Type.GetType(string,bool)"/> method to convert the
+    /// <see cref="String"/> argument to a <see cref="Type"/>.
+    /// Additional effort is made to locate partially specified types
+    /// by searching the loaded assemblies.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ConversionNotSupportedException">
+    /// The <paramref name="source"/> object cannot be converted to the
+    /// target type. To check for this condition use the <see cref="CanConvertFrom"/>
+    /// method.
+    /// </exception>
+    public object ConvertFrom(object source)
+    {
+      string str = source as string;
+      if (str != null)
+      {
 #if NETSTANDARD1_3 // TODO can we use ComponentModel here?
-				return SystemInfo.GetTypeFromString(GetType().GetTypeInfo().Assembly, str, true, true);
+        return SystemInfo.GetTypeFromString(GetType().GetTypeInfo().Assembly, str, true, true);
 #else
-				return SystemInfo.GetTypeFromString(str, true, true);
+        return SystemInfo.GetTypeFromString(str, true, true);
 #endif
-			}
-			throw ConversionNotSupportedException.Create(typeof(Type), source);
-		}
+      }
+      throw ConversionNotSupportedException.Create(typeof(Type), source);
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
diff --git a/src/log4net/Util/TypeConverters/TypeConverterAttribute.cs b/src/log4net/Util/TypeConverters/TypeConverterAttribute.cs
index 196c5a8..137336a 100644
--- a/src/log4net/Util/TypeConverters/TypeConverterAttribute.cs
+++ b/src/log4net/Util/TypeConverters/TypeConverterAttribute.cs
@@ -21,96 +21,96 @@
 
 namespace log4net.Util.TypeConverters
 {
-	/// <summary>
-	/// Attribute used to associate a type converter
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// Class and Interface level attribute that specifies a type converter
-	/// to use with the associated type.
-	/// </para>
-	/// <para>
-	/// To associate a type converter with a target type apply a
-	/// <c>TypeConverterAttribute</c> to the target type. Specify the
-	/// type of the type converter on the attribute.
-	/// </para>
-	/// </remarks>
-	/// <author>Nicko Cadell</author>
-	/// <author>Gert Driesen</author>
-	[AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface|AttributeTargets.Enum)]
-	public sealed class TypeConverterAttribute : Attribute
-	{
-		#region Member Variables
+  /// <summary>
+  /// Attribute used to associate a type converter
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// Class and Interface level attribute that specifies a type converter
+  /// to use with the associated type.
+  /// </para>
+  /// <para>
+  /// To associate a type converter with a target type apply a
+  /// <c>TypeConverterAttribute</c> to the target type. Specify the
+  /// type of the type converter on the attribute.
+  /// </para>
+  /// </remarks>
+  /// <author>Nicko Cadell</author>
+  /// <author>Gert Driesen</author>
+  [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Enum)]
+  public sealed class TypeConverterAttribute : Attribute
+  {
+    #region Member Variables
 
-		/// <summary>
-		/// The string type name of the type converter
-		/// </summary>
-		private string m_typeName = null;
+    /// <summary>
+    /// The string type name of the type converter
+    /// </summary>
+    private string m_typeName = null;
 
-		#endregion
+    #endregion
 
-		#region Constructors
+    #region Constructors
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public TypeConverterAttribute()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public TypeConverterAttribute()
+    {
+    }
 
-		/// <summary>
-		/// Create a new type converter attribute for the specified type name
-		/// </summary>
-		/// <param name="typeName">The string type name of the type converter</param>
-		/// <remarks>
-		/// <para>
-		/// The type specified must implement the <see cref="IConvertFrom"/> 
-		/// or the <see cref="IConvertTo"/> interfaces.
-		/// </para>
-		/// </remarks>
-		public TypeConverterAttribute(string typeName)
-		{
-			m_typeName = typeName;
-		}
+    /// <summary>
+    /// Create a new type converter attribute for the specified type name
+    /// </summary>
+    /// <param name="typeName">The string type name of the type converter</param>
+    /// <remarks>
+    /// <para>
+    /// The type specified must implement the <see cref="IConvertFrom"/> 
+    /// or the <see cref="IConvertTo"/> interfaces.
+    /// </para>
+    /// </remarks>
+    public TypeConverterAttribute(string typeName)
+    {
+      m_typeName = typeName;
+    }
 
-		/// <summary>
-		/// Create a new type converter attribute for the specified type
-		/// </summary>
-		/// <param name="converterType">The type of the type converter</param>
-		/// <remarks>
-		/// <para>
-		/// The type specified must implement the <see cref="IConvertFrom"/> 
-		/// or the <see cref="IConvertTo"/> interfaces.
-		/// </para>
-		/// </remarks>
-		public TypeConverterAttribute(Type converterType)
-		{
-			m_typeName = log4net.Util.SystemInfo.AssemblyQualifiedName(converterType);
-		}
+    /// <summary>
+    /// Create a new type converter attribute for the specified type
+    /// </summary>
+    /// <param name="converterType">The type of the type converter</param>
+    /// <remarks>
+    /// <para>
+    /// The type specified must implement the <see cref="IConvertFrom"/> 
+    /// or the <see cref="IConvertTo"/> interfaces.
+    /// </para>
+    /// </remarks>
+    public TypeConverterAttribute(Type converterType)
+    {
+      m_typeName = log4net.Util.SystemInfo.AssemblyQualifiedName(converterType);
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// The string type name of the type converter 
-		/// </summary>
-		/// <value>
-		/// The string type name of the type converter 
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The type specified must implement the <see cref="IConvertFrom"/> 
-		/// or the <see cref="IConvertTo"/> interfaces.
-		/// </para>
-		/// </remarks>
-		public string ConverterTypeName
-		{
-			get { return m_typeName; }
-			set { m_typeName = value ; }
-		}
-	}
+    /// <summary>
+    /// The string type name of the type converter 
+    /// </summary>
+    /// <value>
+    /// The string type name of the type converter 
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The type specified must implement the <see cref="IConvertFrom"/> 
+    /// or the <see cref="IConvertTo"/> interfaces.
+    /// </para>
+    /// </remarks>
+    public string ConverterTypeName
+    {
+      get { return m_typeName; }
+      set { m_typeName = value; }
+    }
+  }
 }
diff --git a/src/log4net/Util/WindowsSecurityContext.cs b/src/log4net/Util/WindowsSecurityContext.cs
index 6fac8cc..bed14bc 100644
--- a/src/log4net/Util/WindowsSecurityContext.cs
+++ b/src/log4net/Util/WindowsSecurityContext.cs
@@ -36,349 +36,349 @@
 
 namespace log4net.Util
 {
-	/// <summary>
-	/// Impersonate a Windows Account
-	/// </summary>
-	/// <remarks>
-	/// <para>
-	/// This <see cref="SecurityContext"/> impersonates a Windows account.
-	/// </para>
-	/// <para>
-	/// How the impersonation is done depends on the value of <see cref="Impersonate"/>.
-	/// This allows the context to either impersonate a set of user credentials specified 
-	/// using username, domain name and password or to revert to the process credentials.
-	/// </para>
-	/// </remarks>
-	public class WindowsSecurityContext : SecurityContext, IOptionHandler
-	{
-		/// <summary>
-		/// The impersonation modes for the <see cref="WindowsSecurityContext"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// See the <see cref="WindowsSecurityContext.Credentials"/> property for
-		/// details.
-		/// </para>
-		/// </remarks>
-		public enum ImpersonationMode
-		{
-			/// <summary>
-			/// Impersonate a user using the credentials supplied
-			/// </summary>
-			User,
+  /// <summary>
+  /// Impersonate a Windows Account
+  /// </summary>
+  /// <remarks>
+  /// <para>
+  /// This <see cref="SecurityContext"/> impersonates a Windows account.
+  /// </para>
+  /// <para>
+  /// How the impersonation is done depends on the value of <see cref="Impersonate"/>.
+  /// This allows the context to either impersonate a set of user credentials specified 
+  /// using username, domain name and password or to revert to the process credentials.
+  /// </para>
+  /// </remarks>
+  public class WindowsSecurityContext : SecurityContext, IOptionHandler
+  {
+    /// <summary>
+    /// The impersonation modes for the <see cref="WindowsSecurityContext"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// See the <see cref="WindowsSecurityContext.Credentials"/> property for
+    /// details.
+    /// </para>
+    /// </remarks>
+    public enum ImpersonationMode
+    {
+      /// <summary>
+      /// Impersonate a user using the credentials supplied
+      /// </summary>
+      User,
 
-			/// <summary>
-			/// Revert this the thread to the credentials of the process
-			/// </summary>
-			Process
-		}
+      /// <summary>
+      /// Revert this the thread to the credentials of the process
+      /// </summary>
+      Process
+    }
 
-		#region Member Variables
+    #region Member Variables
 
-		private ImpersonationMode m_impersonationMode = ImpersonationMode.User;
-		private string m_userName;
-		private string m_domainName = Environment.MachineName;
-		private string m_password;
-		private WindowsIdentity m_identity;
+    private ImpersonationMode m_impersonationMode = ImpersonationMode.User;
+    private string m_userName;
+    private string m_domainName = Environment.MachineName;
+    private string m_password;
+    private WindowsIdentity m_identity;
 
-		#endregion
+    #endregion
 
-		#region Constructor
+    #region Constructor
 
-		/// <summary>
-		/// Default constructor
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Default constructor
-		/// </para>
-		/// </remarks>
-		public WindowsSecurityContext()
-		{
-		}
+    /// <summary>
+    /// Default constructor
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Default constructor
+    /// </para>
+    /// </remarks>
+    public WindowsSecurityContext()
+    {
+    }
 
-		#endregion
+    #endregion
 
-		#region Public Properties
+    #region Public Properties
 
-		/// <summary>
-		/// Gets or sets the impersonation mode for this security context
-		/// </summary>
-		/// <value>
-		/// The impersonation mode for this security context
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// Impersonate either a user with user credentials or
-		/// revert this thread to the credentials of the process.
-		/// The value is one of the <see cref="ImpersonationMode"/>
-		/// enum.
-		/// </para>
-		/// <para>
-		/// The default value is <see cref="ImpersonationMode.User"/>
-		/// </para>
-		/// <para>
-		/// When the mode is set to <see cref="ImpersonationMode.User"/>
-		/// the user's credentials are established using the
-		/// <see cref="UserName"/>, <see cref="DomainName"/> and <see cref="Password"/>
-		/// values.
-		/// </para>
-		/// <para>
-		/// When the mode is set to <see cref="ImpersonationMode.Process"/>
-		/// no other properties need to be set. If the calling thread is 
-		/// impersonating then it will be reverted back to the process credentials.
-		/// </para>
-		/// </remarks>
-		public ImpersonationMode Credentials
-		{
-			get { return m_impersonationMode; }
-			set { m_impersonationMode = value; }
-		}
+    /// <summary>
+    /// Gets or sets the impersonation mode for this security context
+    /// </summary>
+    /// <value>
+    /// The impersonation mode for this security context
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// Impersonate either a user with user credentials or
+    /// revert this thread to the credentials of the process.
+    /// The value is one of the <see cref="ImpersonationMode"/>
+    /// enum.
+    /// </para>
+    /// <para>
+    /// The default value is <see cref="ImpersonationMode.User"/>
+    /// </para>
+    /// <para>
+    /// When the mode is set to <see cref="ImpersonationMode.User"/>
+    /// the user's credentials are established using the
+    /// <see cref="UserName"/>, <see cref="DomainName"/> and <see cref="Password"/>
+    /// values.
+    /// </para>
+    /// <para>
+    /// When the mode is set to <see cref="ImpersonationMode.Process"/>
+    /// no other properties need to be set. If the calling thread is 
+    /// impersonating then it will be reverted back to the process credentials.
+    /// </para>
+    /// </remarks>
+    public ImpersonationMode Credentials
+    {
+      get { return m_impersonationMode; }
+      set { m_impersonationMode = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the Windows username for this security context
-		/// </summary>
-		/// <value>
-		/// The Windows username for this security context
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This property must be set if <see cref="Credentials"/>
-		/// is set to <see cref="ImpersonationMode.User"/> (the default setting).
-		/// </para>
-		/// </remarks>
-		public string UserName
-		{
-			get { return m_userName; }
-			set { m_userName = value; }
-		}
+    /// <summary>
+    /// Gets or sets the Windows username for this security context
+    /// </summary>
+    /// <value>
+    /// The Windows username for this security context
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This property must be set if <see cref="Credentials"/>
+    /// is set to <see cref="ImpersonationMode.User"/> (the default setting).
+    /// </para>
+    /// </remarks>
+    public string UserName
+    {
+      get { return m_userName; }
+      set { m_userName = value; }
+    }
 
-		/// <summary>
-		/// Gets or sets the Windows domain name for this security context
-		/// </summary>
-		/// <value>
-		/// The Windows domain name for this security context
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// The default value for <see cref="DomainName"/> is the local machine name
-		/// taken from the <see cref="Environment.MachineName"/> property.
-		/// </para>
-		/// <para>
-		/// This property must be set if <see cref="Credentials"/>
-		/// is set to <see cref="ImpersonationMode.User"/> (the default setting).
-		/// </para>
-		/// </remarks>
-		public string DomainName
-		{
-			get { return m_domainName; }
-			set { m_domainName = value; }
-		}
+    /// <summary>
+    /// Gets or sets the Windows domain name for this security context
+    /// </summary>
+    /// <value>
+    /// The Windows domain name for this security context
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// The default value for <see cref="DomainName"/> is the local machine name
+    /// taken from the <see cref="Environment.MachineName"/> property.
+    /// </para>
+    /// <para>
+    /// This property must be set if <see cref="Credentials"/>
+    /// is set to <see cref="ImpersonationMode.User"/> (the default setting).
+    /// </para>
+    /// </remarks>
+    public string DomainName
+    {
+      get { return m_domainName; }
+      set { m_domainName = value; }
+    }
 
-		/// <summary>
-		/// Sets the password for the Windows account specified by the <see cref="UserName"/> and <see cref="DomainName"/> properties.
-		/// </summary>
-		/// <value>
-		/// The password for the Windows account specified by the <see cref="UserName"/> and <see cref="DomainName"/> properties.
-		/// </value>
-		/// <remarks>
-		/// <para>
-		/// This property must be set if <see cref="Credentials"/>
-		/// is set to <see cref="ImpersonationMode.User"/> (the default setting).
-		/// </para>
-		/// </remarks>
-		public string Password
-		{
-			set { m_password = value; }
-		}
+    /// <summary>
+    /// Sets the password for the Windows account specified by the <see cref="UserName"/> and <see cref="DomainName"/> properties.
+    /// </summary>
+    /// <value>
+    /// The password for the Windows account specified by the <see cref="UserName"/> and <see cref="DomainName"/> properties.
+    /// </value>
+    /// <remarks>
+    /// <para>
+    /// This property must be set if <see cref="Credentials"/>
+    /// is set to <see cref="ImpersonationMode.User"/> (the default setting).
+    /// </para>
+    /// </remarks>
+    public string Password
+    {
+      set { m_password = value; }
+    }
 
-		#endregion
+    #endregion
 
-		#region IOptionHandler Members
+    #region IOptionHandler Members
 
-		/// <summary>
-		/// Initialize the SecurityContext based on the options set.
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// This is part of the <see cref="IOptionHandler"/> delayed object
-		/// activation scheme. The <see cref="ActivateOptions"/> method must 
-		/// be called on this object after the configuration properties have
-		/// been set. Until <see cref="ActivateOptions"/> is called this
-		/// object is in an undefined state and must not be used. 
-		/// </para>
-		/// <para>
-		/// If any of the configuration properties are modified then 
-		/// <see cref="ActivateOptions"/> must be called again.
-		/// </para>
-		/// <para>
-		/// The security context will try to Logon the specified user account and
-		/// capture a primary token for impersonation.
-		/// </para>
-		/// </remarks>
-		/// <exception cref="ArgumentNullException">The required <see cref="UserName" />, 
-		/// <see cref="DomainName" /> or <see cref="Password" /> properties were not specified.</exception>
-		public void ActivateOptions()
-		{
-			if (m_impersonationMode == ImpersonationMode.User)
-			{
-				if (m_userName == null) throw new ArgumentNullException("m_userName");
-				if (m_domainName == null) throw new ArgumentNullException("m_domainName");
-				if (m_password == null) throw new ArgumentNullException("m_password");
+    /// <summary>
+    /// Initialize the SecurityContext based on the options set.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// This is part of the <see cref="IOptionHandler"/> delayed object
+    /// activation scheme. The <see cref="ActivateOptions"/> method must 
+    /// be called on this object after the configuration properties have
+    /// been set. Until <see cref="ActivateOptions"/> is called this
+    /// object is in an undefined state and must not be used. 
+    /// </para>
+    /// <para>
+    /// If any of the configuration properties are modified then 
+    /// <see cref="ActivateOptions"/> must be called again.
+    /// </para>
+    /// <para>
+    /// The security context will try to Logon the specified user account and
+    /// capture a primary token for impersonation.
+    /// </para>
+    /// </remarks>
+    /// <exception cref="ArgumentNullException">The required <see cref="UserName" />, 
+    /// <see cref="DomainName" /> or <see cref="Password" /> properties were not specified.</exception>
+    public void ActivateOptions()
+    {
+      if (m_impersonationMode == ImpersonationMode.User)
+      {
+        if (m_userName == null) throw new ArgumentNullException("m_userName");
+        if (m_domainName == null) throw new ArgumentNullException("m_domainName");
+        if (m_password == null) throw new ArgumentNullException("m_password");
 
-				m_identity = LogonUser(m_userName, m_domainName, m_password);
-			}
-		}
+        m_identity = LogonUser(m_userName, m_domainName, m_password);
+      }
+    }
 
-		#endregion
+    #endregion
 
-		/// <summary>
-		/// Impersonate the Windows account specified by the <see cref="UserName"/> and <see cref="DomainName"/> properties.
-		/// </summary>
-		/// <param name="state">caller provided state</param>
-		/// <returns>
-		/// An <see cref="IDisposable"/> instance that will revoke the impersonation of this SecurityContext
-		/// </returns>
-		/// <remarks>
-		/// <para>
-		/// Depending on the <see cref="Credentials"/> property either
-		/// impersonate a user using credentials supplied or revert 
-		/// to the process credentials.
-		/// </para>
-		/// </remarks>
-		public override IDisposable Impersonate(object state)
-		{
-			if (m_impersonationMode == ImpersonationMode.User)
-			{
-				if (m_identity != null)
-				{
-					return new DisposableImpersonationContext(m_identity.Impersonate());
-				}
-			}
-			else if (m_impersonationMode == ImpersonationMode.Process)
-			{
-				// Impersonate(0) will revert to the process credentials
-				return new DisposableImpersonationContext(WindowsIdentity.Impersonate(IntPtr.Zero));
-			}
-			return null;
-		}
+    /// <summary>
+    /// Impersonate the Windows account specified by the <see cref="UserName"/> and <see cref="DomainName"/> properties.
+    /// </summary>
+    /// <param name="state">caller provided state</param>
+    /// <returns>
+    /// An <see cref="IDisposable"/> instance that will revoke the impersonation of this SecurityContext
+    /// </returns>
+    /// <remarks>
+    /// <para>
+    /// Depending on the <see cref="Credentials"/> property either
+    /// impersonate a user using credentials supplied or revert 
+    /// to the process credentials.
+    /// </para>
+    /// </remarks>
+    public override IDisposable Impersonate(object state)
+    {
+      if (m_impersonationMode == ImpersonationMode.User)
+      {
+        if (m_identity != null)
+        {
+          return new DisposableImpersonationContext(m_identity.Impersonate());
+        }
+      }
+      else if (m_impersonationMode == ImpersonationMode.Process)
+      {
+        // Impersonate(0) will revert to the process credentials
+        return new DisposableImpersonationContext(WindowsIdentity.Impersonate(IntPtr.Zero));
+      }
+      return null;
+    }
 
-		/// <summary>
-		/// Create a <see cref="WindowsIdentity"/> given the userName, domainName and password.
-		/// </summary>
-		/// <param name="userName">the user name</param>
-		/// <param name="domainName">the domain name</param>
-		/// <param name="password">the password</param>
-		/// <returns>the <see cref="WindowsIdentity"/> for the account specified</returns>
-		/// <remarks>
-		/// <para>
-		/// Uses the Windows API call LogonUser to get a principal token for the account. This
-		/// token is used to initialize the WindowsIdentity.
-		/// </para>
-		/// </remarks>
+    /// <summary>
+    /// Create a <see cref="WindowsIdentity"/> given the userName, domainName and password.
+    /// </summary>
+    /// <param name="userName">the user name</param>
+    /// <param name="domainName">the domain name</param>
+    /// <param name="password">the password</param>
+    /// <returns>the <see cref="WindowsIdentity"/> for the account specified</returns>
+    /// <remarks>
+    /// <para>
+    /// Uses the Windows API call LogonUser to get a principal token for the account. This
+    /// token is used to initialize the WindowsIdentity.
+    /// </para>
+    /// </remarks>
 #if NET_4_0 || MONO_4_0
         [System.Security.SecuritySafeCritical]
 #endif
-        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
-        private static WindowsIdentity LogonUser(string userName, string domainName, string password)
-		{
-			const int LOGON32_PROVIDER_DEFAULT = 0;
-			//This parameter causes LogonUser to create a primary token.
-			const int LOGON32_LOGON_INTERACTIVE = 2;
+    [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand, UnmanagedCode = true)]
+    private static WindowsIdentity LogonUser(string userName, string domainName, string password)
+    {
+      const int LOGON32_PROVIDER_DEFAULT = 0;
+      //This parameter causes LogonUser to create a primary token.
+      const int LOGON32_LOGON_INTERACTIVE = 2;
 
-			// Call LogonUser to obtain a handle to an access token.
-			IntPtr tokenHandle = IntPtr.Zero;
-			if(!LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle))
-			{
-				NativeError error = NativeError.GetLastError();
-				throw new Exception("Failed to LogonUser ["+userName+"] in Domain ["+domainName+"]. Error: "+ error.ToString());
-			}
+      // Call LogonUser to obtain a handle to an access token.
+      IntPtr tokenHandle = IntPtr.Zero;
+      if (!LogonUser(userName, domainName, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref tokenHandle))
+      {
+        NativeError error = NativeError.GetLastError();
+        throw new Exception("Failed to LogonUser [" + userName + "] in Domain [" + domainName + "]. Error: " + error.ToString());
+      }
 
-			const int SecurityImpersonation = 2;
-			IntPtr dupeTokenHandle = IntPtr.Zero;
-			if(!DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle))
-			{
-				NativeError error = NativeError.GetLastError();
-				if (tokenHandle != IntPtr.Zero)
-				{
-					CloseHandle(tokenHandle);
-				}
-				throw new Exception("Failed to DuplicateToken after LogonUser. Error: " + error.ToString());
-			}
+      const int SecurityImpersonation = 2;
+      IntPtr dupeTokenHandle = IntPtr.Zero;
+      if (!DuplicateToken(tokenHandle, SecurityImpersonation, ref dupeTokenHandle))
+      {
+        NativeError error = NativeError.GetLastError();
+        if (tokenHandle != IntPtr.Zero)
+        {
+          CloseHandle(tokenHandle);
+        }
+        throw new Exception("Failed to DuplicateToken after LogonUser. Error: " + error.ToString());
+      }
 
-			WindowsIdentity identity = new WindowsIdentity(dupeTokenHandle);
+      WindowsIdentity identity = new WindowsIdentity(dupeTokenHandle);
 
-			// Free the tokens.
-			if (dupeTokenHandle != IntPtr.Zero) 
-			{
-				CloseHandle(dupeTokenHandle);
-			}
-			if (tokenHandle != IntPtr.Zero)
-			{
-				CloseHandle(tokenHandle);
-			}
+      // Free the tokens.
+      if (dupeTokenHandle != IntPtr.Zero)
+      {
+        CloseHandle(dupeTokenHandle);
+      }
+      if (tokenHandle != IntPtr.Zero)
+      {
+        CloseHandle(tokenHandle);
+      }
 
-			return identity;
-		}
+      return identity;
+    }
 
-		#region Native Method Stubs
+    #region Native Method Stubs
 
-		[DllImport("advapi32.dll", SetLastError=true)]
-		private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
+    [DllImport("advapi32.dll", SetLastError = true)]
+    private static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
 
-		[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
-		private static extern bool CloseHandle(IntPtr handle);
+    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
+    private static extern bool CloseHandle(IntPtr handle);
 
-		[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
-		private static extern bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
+    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
+    private static extern bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);
 
-		#endregion
+    #endregion
 
-		#region DisposableImpersonationContext class
+    #region DisposableImpersonationContext class
 
-		/// <summary>
-		/// Adds <see cref="IDisposable"/> to <see cref="WindowsImpersonationContext"/>
-		/// </summary>
-		/// <remarks>
-		/// <para>
-		/// Helper class to expose the <see cref="WindowsImpersonationContext"/>
-		/// through the <see cref="IDisposable"/> interface.
-		/// </para>
-		/// </remarks>
-		private sealed class DisposableImpersonationContext : IDisposable
-		{
-			private readonly WindowsImpersonationContext m_impersonationContext;
+    /// <summary>
+    /// Adds <see cref="IDisposable"/> to <see cref="WindowsImpersonationContext"/>
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Helper class to expose the <see cref="WindowsImpersonationContext"/>
+    /// through the <see cref="IDisposable"/> interface.
+    /// </para>
+    /// </remarks>
+    private sealed class DisposableImpersonationContext : IDisposable
+    {
+      private readonly WindowsImpersonationContext m_impersonationContext;
 
-			/// <summary>
-			/// Constructor
-			/// </summary>
-			/// <param name="impersonationContext">the impersonation context being wrapped</param>
-			/// <remarks>
-			/// <para>
-			/// Constructor
-			/// </para>
-			/// </remarks>
-			public DisposableImpersonationContext(WindowsImpersonationContext impersonationContext)
-			{
-				m_impersonationContext = impersonationContext;
-			}
+      /// <summary>
+      /// Constructor
+      /// </summary>
+      /// <param name="impersonationContext">the impersonation context being wrapped</param>
+      /// <remarks>
+      /// <para>
+      /// Constructor
+      /// </para>
+      /// </remarks>
+      public DisposableImpersonationContext(WindowsImpersonationContext impersonationContext)
+      {
+        m_impersonationContext = impersonationContext;
+      }
 
-			/// <summary>
-			/// Revert the impersonation
-			/// </summary>
-			/// <remarks>
-			/// <para>
-			/// Revert the impersonation
-			/// </para>
-			/// </remarks>
-			public void Dispose()
-			{
-				m_impersonationContext.Undo();
-			}
-		}
+      /// <summary>
+      /// Revert the impersonation
+      /// </summary>
+      /// <remarks>
+      /// <para>
+      /// Revert the impersonation
+      /// </para>
+      /// </remarks>
+      public void Dispose()
+      {
+        m_impersonationContext.Undo();
+      }
+    }
 
-		#endregion
-	}
+    #endregion
+  }
 }
 
 #endif // !CLI_1_0