diff --git a/src/main/include/log4cxx/consoleappender.h b/src/main/include/log4cxx/consoleappender.h
index 51e0c21..0c67c2c 100644
--- a/src/main/include/log4cxx/consoleappender.h
+++ b/src/main/include/log4cxx/consoleappender.h
@@ -21,8 +21,8 @@
 #include <log4cxx/writerappender.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -80,7 +80,7 @@
 }  //namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif //_LOG4CXX_CONSOLE_APPENDER_H
diff --git a/src/main/include/log4cxx/file.h b/src/main/include/log4cxx/file.h
index 661484c..9e6fa06 100644
--- a/src/main/include/log4cxx/file.h
+++ b/src/main/include/log4cxx/file.h
@@ -22,8 +22,8 @@
 #include <log4cxx/logstring.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 extern "C" {
@@ -190,7 +190,7 @@
 
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #define LOG4CXX_FILE(name) log4cxx::File(name)
diff --git a/src/main/include/log4cxx/fileappender.h b/src/main/include/log4cxx/fileappender.h
index 3cdcaca..1b737c1 100644
--- a/src/main/include/log4cxx/fileappender.h
+++ b/src/main/include/log4cxx/fileappender.h
@@ -25,8 +25,8 @@
 #include <log4cxx/helpers/pool.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -242,7 +242,7 @@
 }  // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif
diff --git a/src/main/include/log4cxx/filter/stringmatchfilter.h b/src/main/include/log4cxx/filter/stringmatchfilter.h
index 0e1745c..8e57ce3 100644
--- a/src/main/include/log4cxx/filter/stringmatchfilter.h
+++ b/src/main/include/log4cxx/filter/stringmatchfilter.h
@@ -21,8 +21,8 @@
 #include <log4cxx/spi/filter.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -103,7 +103,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_FILTER_STRING_MATCH_FILTER_H
diff --git a/src/main/include/log4cxx/helpers/bufferedwriter.h b/src/main/include/log4cxx/helpers/bufferedwriter.h
index a193221..0b38a5d 100644
--- a/src/main/include/log4cxx/helpers/bufferedwriter.h
+++ b/src/main/include/log4cxx/helpers/bufferedwriter.h
@@ -21,8 +21,8 @@
 #include <log4cxx/helpers/writer.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -67,7 +67,7 @@
 }  //namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif //_LOG4CXX_HELPERS_BUFFEREDWRITER_H
diff --git a/src/main/include/log4cxx/helpers/cacheddateformat.h b/src/main/include/log4cxx/helpers/cacheddateformat.h
index 703b8ce..fcfcedc 100644
--- a/src/main/include/log4cxx/helpers/cacheddateformat.h
+++ b/src/main/include/log4cxx/helpers/cacheddateformat.h
@@ -21,8 +21,8 @@
 #include <log4cxx/helpers/dateformat.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -229,7 +229,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_HELPERS_SIMPLE_DATE_FORMAT_H
diff --git a/src/main/include/log4cxx/helpers/datelayout.h b/src/main/include/log4cxx/helpers/datelayout.h
index 39e5c3f..744c881 100644
--- a/src/main/include/log4cxx/helpers/datelayout.h
+++ b/src/main/include/log4cxx/helpers/datelayout.h
@@ -23,8 +23,8 @@
 #include <log4cxx/helpers/timezone.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -102,7 +102,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_HELPERS_DATE_LAYOUT_H
diff --git a/src/main/include/log4cxx/helpers/locale.h b/src/main/include/log4cxx/helpers/locale.h
index 0ea8610..b53235f 100644
--- a/src/main/include/log4cxx/helpers/locale.h
+++ b/src/main/include/log4cxx/helpers/locale.h
@@ -21,8 +21,8 @@
 #include <log4cxx/logstring.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -52,7 +52,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_HELPERS_LOCALE_H
diff --git a/src/main/include/log4cxx/helpers/onlyonceerrorhandler.h b/src/main/include/log4cxx/helpers/onlyonceerrorhandler.h
index a29ecf2..47ea467 100644
--- a/src/main/include/log4cxx/helpers/onlyonceerrorhandler.h
+++ b/src/main/include/log4cxx/helpers/onlyonceerrorhandler.h
@@ -22,8 +22,8 @@
 #include <log4cxx/helpers/objectimpl.h>
 
 #ifdef _MSC_VER
-#pragma warning ( push )
-#pragma warning (disable : 4251) // ::std::exception needs to have dll-interface
+	#pragma warning ( push )
+	#pragma warning (disable : 4251) // ::std::exception needs to have dll-interface
 #endif
 
 namespace log4cxx
@@ -105,7 +105,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif //_LOG4CXX_HELPERS_ONLY_ONCE_ERROR_HANDLER_H
diff --git a/src/main/include/log4cxx/helpers/strftimedateformat.h b/src/main/include/log4cxx/helpers/strftimedateformat.h
index 9f7e20d..d548ded 100644
--- a/src/main/include/log4cxx/helpers/strftimedateformat.h
+++ b/src/main/include/log4cxx/helpers/strftimedateformat.h
@@ -21,8 +21,8 @@
 #include <log4cxx/helpers/dateformat.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -71,7 +71,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_HELPERS_STRFTIME_DATE_FORMAT_H
diff --git a/src/main/include/log4cxx/helpers/stringtokenizer.h b/src/main/include/log4cxx/helpers/stringtokenizer.h
index 608fa4e..5da6739 100644
--- a/src/main/include/log4cxx/helpers/stringtokenizer.h
+++ b/src/main/include/log4cxx/helpers/stringtokenizer.h
@@ -22,8 +22,8 @@
 #include <log4cxx/helpers/exception.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -52,7 +52,7 @@
 } // namespace log4cxx;
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif //_LOG4CXX_HELPERS_STRING_TOKENIZER_H
diff --git a/src/main/include/log4cxx/helpers/syslogwriter.h b/src/main/include/log4cxx/helpers/syslogwriter.h
index 46a259f..7063dfb 100644
--- a/src/main/include/log4cxx/helpers/syslogwriter.h
+++ b/src/main/include/log4cxx/helpers/syslogwriter.h
@@ -24,8 +24,8 @@
 #include <log4cxx/helpers/datagramsocket.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -53,7 +53,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif
diff --git a/src/main/include/log4cxx/helpers/threadspecificdata.h b/src/main/include/log4cxx/helpers/threadspecificdata.h
index f6fcae0..dfaa047 100644
--- a/src/main/include/log4cxx/helpers/threadspecificdata.h
+++ b/src/main/include/log4cxx/helpers/threadspecificdata.h
@@ -22,8 +22,8 @@
 #include <log4cxx/mdc.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -69,7 +69,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif
diff --git a/src/main/include/log4cxx/helpers/timezone.h b/src/main/include/log4cxx/helpers/timezone.h
index 8a6f4bd..c6e8504 100644
--- a/src/main/include/log4cxx/helpers/timezone.h
+++ b/src/main/include/log4cxx/helpers/timezone.h
@@ -23,8 +23,8 @@
 #include <log4cxx/helpers/objectptr.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 struct apr_time_exp_t;
@@ -74,7 +74,7 @@
 }
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif //_LOG4CXX_HELPERS_TIMEZONE_H
diff --git a/src/main/include/log4cxx/jsonlayout.h b/src/main/include/log4cxx/jsonlayout.h
index f49daed..6314710 100644
--- a/src/main/include/log4cxx/jsonlayout.h
+++ b/src/main/include/log4cxx/jsonlayout.h
@@ -23,8 +23,8 @@
 #include <log4cxx/spi/loggingevent.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 
@@ -140,7 +140,7 @@
 }  // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_JSON_LAYOUT_H
diff --git a/src/main/include/log4cxx/level.h b/src/main/include/log4cxx/level.h
index 18ee6a1..10b0762 100644
--- a/src/main/include/log4cxx/level.h
+++ b/src/main/include/log4cxx/level.h
@@ -25,8 +25,8 @@
 #include <log4cxx/helpers/objectptr.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -335,7 +335,7 @@
 	IMPLEMENT_LOG4CXX_OBJECT_WITH_CUSTOM_CLASS(level, Class##level)
 
 #if defined(_MSC_VER)
- #pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif //_LOG4CXX_LEVEL_H
diff --git a/src/main/include/log4cxx/net/smtpappender.h b/src/main/include/log4cxx/net/smtpappender.h
index fb1b275..da40c77 100644
--- a/src/main/include/log4cxx/net/smtpappender.h
+++ b/src/main/include/log4cxx/net/smtpappender.h
@@ -24,8 +24,8 @@
 #include <log4cxx/spi/triggeringeventevaluator.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -288,7 +288,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_NET_SMTP_H
diff --git a/src/main/include/log4cxx/net/socketappenderskeleton.h b/src/main/include/log4cxx/net/socketappenderskeleton.h
index 5772796..184374f 100644
--- a/src/main/include/log4cxx/net/socketappenderskeleton.h
+++ b/src/main/include/log4cxx/net/socketappenderskeleton.h
@@ -24,8 +24,8 @@
 #include <log4cxx/helpers/objectoutputstream.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -199,7 +199,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_NET_SOCKET_APPENDER_SKELETON_H
diff --git a/src/main/include/log4cxx/net/syslogappender.h b/src/main/include/log4cxx/net/syslogappender.h
index d044ec5..5acf92c 100644
--- a/src/main/include/log4cxx/net/syslogappender.h
+++ b/src/main/include/log4cxx/net/syslogappender.h
@@ -22,8 +22,8 @@
 #include <log4cxx/helpers/syslogwriter.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -154,7 +154,7 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif // _LOG4CXX_NET_SYSLOG_APPENDER_H
diff --git a/src/main/include/log4cxx/nt/nteventlogappender.h b/src/main/include/log4cxx/nt/nteventlogappender.h
index 0e55a27..5150c2e 100644
--- a/src/main/include/log4cxx/nt/nteventlogappender.h
+++ b/src/main/include/log4cxx/nt/nteventlogappender.h
@@ -21,8 +21,8 @@
 #include <log4cxx/appenderskeleton.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 
@@ -128,6 +128,6 @@
 } // namespace log4cxx
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 #endif //_LOG4CXX_NT_EVENT_LOG_APPENDER_HEADER_
diff --git a/src/main/include/log4cxx/pattern/literalpatternconverter.h b/src/main/include/log4cxx/pattern/literalpatternconverter.h
index 0eb2702..4c5e435 100644
--- a/src/main/include/log4cxx/pattern/literalpatternconverter.h
+++ b/src/main/include/log4cxx/pattern/literalpatternconverter.h
@@ -21,8 +21,8 @@
 #include <log4cxx/pattern/loggingeventpatternconverter.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -75,7 +75,7 @@
 }
 
 #if defined(_MSC_VER)
-#pragma warning (pop)
+	#pragma warning (pop)
 #endif
 
 #endif
diff --git a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
index e51dd56..46c4e3b 100755
--- a/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
+++ b/src/main/include/log4cxx/rolling/timebasedrollingpolicy.h
@@ -27,8 +27,8 @@
 #include <apr_mmap.h>
 
 #if defined(_MSC_VER)
-#pragma warning ( push )
-#pragma warning ( disable: 4251 )
+	#pragma warning ( push )
+	#pragma warning ( disable: 4251 )
 #endif
 
 namespace log4cxx
@@ -298,7 +298,7 @@
 }
 
 #if defined(_MSC_VER)
-#pragma warning ( pop )
+	#pragma warning ( pop )
 #endif
 
 #endif
diff --git a/src/test/cpp/asyncappendertestcase.cpp b/src/test/cpp/asyncappendertestcase.cpp
index 6661e4f..0e6795a 100644
--- a/src/test/cpp/asyncappendertestcase.cpp
+++ b/src/test/cpp/asyncappendertestcase.cpp
@@ -113,187 +113,202 @@
  */
 class AsyncAppenderTestCase : public AppenderSkeletonTestCase
 {
-        LOGUNIT_TEST_SUITE(AsyncAppenderTestCase);
-                //
-                //    tests inherited from AppenderSkeletonTestCase
-                //
-                LOGUNIT_TEST(testDefaultThreshold);
-                LOGUNIT_TEST(testSetOptionThreshold);
+		LOGUNIT_TEST_SUITE(AsyncAppenderTestCase);
+		//
+		// tests inherited from AppenderSkeletonTestCase
+		//
+		LOGUNIT_TEST(testDefaultThreshold);
+		LOGUNIT_TEST(testSetOptionThreshold);
 
-                LOGUNIT_TEST(closeTest);
-                LOGUNIT_TEST(test2);
-                LOGUNIT_TEST(test3);
-                //
-                //   TODO: test fails on Linux.
-                //LOGUNIT_TEST(testBadAppender);
-                LOGUNIT_TEST(testLocationInfoTrue);
-                LOGUNIT_TEST(testConfiguration);
-        LOGUNIT_TEST_SUITE_END();
+		LOGUNIT_TEST(closeTest);
+		LOGUNIT_TEST(test2);
+		LOGUNIT_TEST(test3);
+		//
+		// TODO: test fails on Linux.
+		//LOGUNIT_TEST(testBadAppender);
+		LOGUNIT_TEST(testLocationInfoTrue);
+		LOGUNIT_TEST(testConfiguration);
+		LOGUNIT_TEST_SUITE_END();
 
 
-public:
-        void setUp() {
-           AppenderSkeletonTestCase::setUp();
-        }
+	public:
+		void setUp()
+		{
+			AppenderSkeletonTestCase::setUp();
+		}
 
-        void tearDown()
-        {
-                LogManager::shutdown();
-                AppenderSkeletonTestCase::tearDown();
-        }
+		void tearDown()
+		{
+			LogManager::shutdown();
+			AppenderSkeletonTestCase::tearDown();
+		}
 
-        AppenderSkeleton* createAppenderSkeleton() const {
-          return new AsyncAppender();
-        }
+		AppenderSkeleton* createAppenderSkeleton() const
+		{
+			return new AsyncAppender();
+		}
 
-        // this test checks whether it is possible to write to a closed AsyncAppender
-        void closeTest() 
-        {
-                LoggerPtr root = Logger::getRootLogger();
-                LayoutPtr layout = new SimpleLayout();
-                VectorAppenderPtr vectorAppender = new VectorAppender();
-                AsyncAppenderPtr asyncAppender = new AsyncAppender();
-                asyncAppender->setName(LOG4CXX_STR("async-CloseTest"));
-                asyncAppender->addAppender(vectorAppender);
-                root->addAppender(asyncAppender);
+		// this test checks whether it is possible to write to a closed AsyncAppender
+		void closeTest()
+		{
+			LoggerPtr root = Logger::getRootLogger();
+			LayoutPtr layout = new SimpleLayout();
+			VectorAppenderPtr vectorAppender = new VectorAppender();
+			AsyncAppenderPtr asyncAppender = new AsyncAppender();
+			asyncAppender->setName(LOG4CXX_STR("async-CloseTest"));
+			asyncAppender->addAppender(vectorAppender);
+			root->addAppender(asyncAppender);
 
-                root->debug(LOG4CXX_TEST_STR("m1"));
-                asyncAppender->close();
-                root->debug(LOG4CXX_TEST_STR("m2"));
+			root->debug(LOG4CXX_TEST_STR("m1"));
+			asyncAppender->close();
+			root->debug(LOG4CXX_TEST_STR("m2"));
 
-                const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
-                LOGUNIT_ASSERT_EQUAL((size_t) 1, v.size());
-        }
+			const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
+			LOGUNIT_ASSERT_EQUAL((size_t) 1, v.size());
+		}
 
-        // this test checks whether appenders embedded within an AsyncAppender are also
-        // closed
-        void test2()
-        {
-                LoggerPtr root = Logger::getRootLogger();
-                LayoutPtr layout = new SimpleLayout();
-                VectorAppenderPtr vectorAppender = new VectorAppender();
-                AsyncAppenderPtr asyncAppender = new AsyncAppender();
-                asyncAppender->setName(LOG4CXX_STR("async-test2"));
-                asyncAppender->addAppender(vectorAppender);
-                root->addAppender(asyncAppender);
+		// this test checks whether appenders embedded within an AsyncAppender are also
+		// closed
+		void test2()
+		{
+			LoggerPtr root = Logger::getRootLogger();
+			LayoutPtr layout = new SimpleLayout();
+			VectorAppenderPtr vectorAppender = new VectorAppender();
+			AsyncAppenderPtr asyncAppender = new AsyncAppender();
+			asyncAppender->setName(LOG4CXX_STR("async-test2"));
+			asyncAppender->addAppender(vectorAppender);
+			root->addAppender(asyncAppender);
 
-                root->debug(LOG4CXX_TEST_STR("m1"));
-                asyncAppender->close();
-                root->debug(LOG4CXX_TEST_STR("m2"));
+			root->debug(LOG4CXX_TEST_STR("m1"));
+			asyncAppender->close();
+			root->debug(LOG4CXX_TEST_STR("m2"));
 
-                const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
-                LOGUNIT_ASSERT_EQUAL((size_t) 1, v.size());
-                LOGUNIT_ASSERT(vectorAppender->isClosed());
-        }
+			const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
+			LOGUNIT_ASSERT_EQUAL((size_t) 1, v.size());
+			LOGUNIT_ASSERT(vectorAppender->isClosed());
+		}
 
-        // this test checks whether appenders embedded within an AsyncAppender are also
-        // closed
-        void test3()
-        {
-                size_t LEN = 200;
-                LoggerPtr root = Logger::getRootLogger();
-                VectorAppenderPtr vectorAppender = new VectorAppender();
-                AsyncAppenderPtr asyncAppender = new AsyncAppender();
-                asyncAppender->setName(LOG4CXX_STR("async-test3"));
-                asyncAppender->addAppender(vectorAppender);
-                root->addAppender(asyncAppender);
+		// this test checks whether appenders embedded within an AsyncAppender are also
+		// closed
+		void test3()
+		{
+			size_t LEN = 200;
+			LoggerPtr root = Logger::getRootLogger();
+			VectorAppenderPtr vectorAppender = new VectorAppender();
+			AsyncAppenderPtr asyncAppender = new AsyncAppender();
+			asyncAppender->setName(LOG4CXX_STR("async-test3"));
+			asyncAppender->addAppender(vectorAppender);
+			root->addAppender(asyncAppender);
 
-                for (size_t i = 0; i < LEN; i++) {
-                        LOG4CXX_DEBUG(root, "message" << i);
-                }
+			for (size_t i = 0; i < LEN; i++)
+			{
+				LOG4CXX_DEBUG(root, "message" << i);
+			}
 
-                asyncAppender->close();
-                root->debug(LOG4CXX_TEST_STR("m2"));
+			asyncAppender->close();
+			root->debug(LOG4CXX_TEST_STR("m2"));
 
-                const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
-                LOGUNIT_ASSERT_EQUAL(LEN, v.size());
-                LOGUNIT_ASSERT_EQUAL(true, vectorAppender->isClosed());
-        }
-        
-    /**
-     * Tests that a bad appender will switch async back to sync.
-     */
-    void testBadAppender() {
-        AppenderPtr nullPointerAppender = new NullPointerAppender();
-        AsyncAppenderPtr asyncAppender = new AsyncAppender();
-        asyncAppender->addAppender(nullPointerAppender);
-        asyncAppender->setBufferSize(5);
-        Pool p;
-        asyncAppender->activateOptions(p);
-        LoggerPtr root = Logger::getRootLogger();
-        root->addAppender(asyncAppender);
-        LOG4CXX_INFO(root, "Message");
-        Thread::sleep(10);
-        try {
-           LOG4CXX_INFO(root, "Message");
-           LOGUNIT_FAIL("Should have thrown exception");
-        } catch(NullPointerException&) {
-        }
-    }
-    
-    /**
-     * Tests non-blocking behavior.
-     */
-    void testLocationInfoTrue() {
-        BlockableVectorAppenderPtr blockableAppender = new BlockableVectorAppender();
-        AsyncAppenderPtr async = new AsyncAppender();
-        async->addAppender(blockableAppender);
-        async->setBufferSize(5);
-        async->setLocationInfo(true);
-        async->setBlocking(false);
-        Pool p;
-        async->activateOptions(p);
-        LoggerPtr rootLogger = Logger::getRootLogger();
-        rootLogger->addAppender(async);
-        {
-            synchronized sync(blockableAppender->getBlocker());
-            for (int i = 0; i < 140; i++) {
-                   LOG4CXX_INFO(rootLogger, "Hello, World");
-                   Thread::sleep(1);
-            }
-            LOG4CXX_ERROR(rootLogger, "That's all folks.");
-        }
-        async->close();
-        const std::vector<spi::LoggingEventPtr>& events = blockableAppender->getVector();
-        LOGUNIT_ASSERT(events.size() > 0);
-        LoggingEventPtr initialEvent = events[0];
-        LoggingEventPtr discardEvent = events[events.size() - 1];
-        LOGUNIT_ASSERT(initialEvent->getMessage() == LOG4CXX_STR("Hello, World"));
-        LOGUNIT_ASSERT(discardEvent->getMessage().substr(0,10) == LOG4CXX_STR("Discarded "));
-        LOGUNIT_ASSERT_EQUAL(log4cxx::spi::LocationInfo::getLocationUnavailable().getClassName(), 
-            discardEvent->getLocationInformation().getClassName()); 
-    }
-    
-        void testConfiguration() {
-              log4cxx::xml::DOMConfigurator::configure("input/xml/asyncAppender1.xml");
-              AsyncAppenderPtr asyncAppender(Logger::getRootLogger()->getAppender(LOG4CXX_STR("ASYNC")));
-              LOGUNIT_ASSERT(!(asyncAppender == 0));
-              LOGUNIT_ASSERT_EQUAL(100, asyncAppender->getBufferSize());
-              LOGUNIT_ASSERT_EQUAL(false, asyncAppender->getBlocking());
-              LOGUNIT_ASSERT_EQUAL(true, asyncAppender->getLocationInfo());
-              AppenderList nestedAppenders(asyncAppender->getAllAppenders());
-              //   TODO:
-              //   test seems to work okay, but have not found a working way to 
-              //      get a reference to the nested vector appender 
-              //
-//              LOGUNIT_ASSERT_EQUAL((size_t) 1, nestedAppenders.size());
-//              VectorAppenderPtr vectorAppender(nestedAppenders[0]);
-//              LOGUNIT_ASSERT(0 != vectorAppender);
-              LoggerPtr root(Logger::getRootLogger()); 
-              
-              size_t LEN = 20;
-              for (size_t i = 0; i < LEN; i++) {
-                        LOG4CXX_DEBUG(root, "message" << i);
-              }
-              
-              asyncAppender->close();
-//              const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
-//              LOGUNIT_ASSERT_EQUAL(LEN, v.size());
-//              LOGUNIT_ASSERT_EQUAL(true, vectorAppender->isClosed());
-        }
+			const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
+			LOGUNIT_ASSERT_EQUAL(LEN, v.size());
+			LOGUNIT_ASSERT_EQUAL(true, vectorAppender->isClosed());
+		}
+
+		/**
+		 * Tests that a bad appender will switch async back to sync.
+		 */
+		void testBadAppender()
+		{
+			AppenderPtr nullPointerAppender = new NullPointerAppender();
+			AsyncAppenderPtr asyncAppender = new AsyncAppender();
+			asyncAppender->addAppender(nullPointerAppender);
+			asyncAppender->setBufferSize(5);
+			Pool p;
+			asyncAppender->activateOptions(p);
+			LoggerPtr root = Logger::getRootLogger();
+			root->addAppender(asyncAppender);
+			LOG4CXX_INFO(root, "Message");
+			Thread::sleep(10);
+
+			try
+			{
+				LOG4CXX_INFO(root, "Message");
+				LOGUNIT_FAIL("Should have thrown exception");
+			}
+			catch (NullPointerException&)
+			{
+			}
+		}
+
+		/**
+		 * Tests non-blocking behavior.
+		 */
+		void testLocationInfoTrue()
+		{
+			BlockableVectorAppenderPtr blockableAppender = new BlockableVectorAppender();
+			AsyncAppenderPtr async = new AsyncAppender();
+			async->addAppender(blockableAppender);
+			async->setBufferSize(5);
+			async->setLocationInfo(true);
+			async->setBlocking(false);
+			Pool p;
+			async->activateOptions(p);
+			LoggerPtr rootLogger = Logger::getRootLogger();
+			rootLogger->addAppender(async);
+			{
+				synchronized sync(blockableAppender->getBlocker());
+
+				for (int i = 0; i < 140; i++)
+				{
+					LOG4CXX_INFO(rootLogger, "Hello, World");
+					Thread::sleep(1);
+				}
+
+				LOG4CXX_ERROR(rootLogger, "That's all folks.");
+			}
+			async->close();
+			const std::vector<spi::LoggingEventPtr>& events = blockableAppender->getVector();
+			LOGUNIT_ASSERT(events.size() > 0);
+			LoggingEventPtr initialEvent = events[0];
+			LoggingEventPtr discardEvent = events[events.size() - 1];
+			LOGUNIT_ASSERT(initialEvent->getMessage() == LOG4CXX_STR("Hello, World"));
+			LOGUNIT_ASSERT(discardEvent->getMessage().substr(0, 10) == LOG4CXX_STR("Discarded "));
+			LOGUNIT_ASSERT_EQUAL(log4cxx::spi::LocationInfo::getLocationUnavailable().getClassName(),
+				discardEvent->getLocationInformation().getClassName());
+		}
+
+		void testConfiguration()
+		{
+			log4cxx::xml::DOMConfigurator::configure("input/xml/asyncAppender1.xml");
+			AsyncAppenderPtr asyncAppender(Logger::getRootLogger()->getAppender(LOG4CXX_STR("ASYNC")));
+			LOGUNIT_ASSERT(!(asyncAppender == 0));
+			LOGUNIT_ASSERT_EQUAL(100, asyncAppender->getBufferSize());
+			LOGUNIT_ASSERT_EQUAL(false, asyncAppender->getBlocking());
+			LOGUNIT_ASSERT_EQUAL(true, asyncAppender->getLocationInfo());
+			AppenderList nestedAppenders(asyncAppender->getAllAppenders());
+			// TODO:
+			// test seems to work okay, but have not found a working way to
+			// get a reference to the nested vector appender
+			//
+			// LOGUNIT_ASSERT_EQUAL((size_t) 1, nestedAppenders.size());
+			// VectorAppenderPtr vectorAppender(nestedAppenders[0]);
+			// LOGUNIT_ASSERT(0 != vectorAppender);
+			LoggerPtr root(Logger::getRootLogger());
+
+			size_t LEN = 20;
+
+			for (size_t i = 0; i < LEN; i++)
+			{
+				LOG4CXX_DEBUG(root, "message" << i);
+			}
+
+			asyncAppender->close();
+			// const std::vector<spi::LoggingEventPtr>& v = vectorAppender->getVector();
+			// LOGUNIT_ASSERT_EQUAL(LEN, v.size());
+			// LOGUNIT_ASSERT_EQUAL(true, vectorAppender->isClosed());
+		}
 
 
-};        
+};
 
 LOGUNIT_TEST_SUITE_REGISTRATION(AsyncAppenderTestCase);
 #endif
