Fixed some segfaults
diff --git a/src/main/cpp/defaultconfigurator.cpp b/src/main/cpp/defaultconfigurator.cpp
index b304084..4b64298 100644
--- a/src/main/cpp/defaultconfigurator.cpp
+++ b/src/main/cpp/defaultconfigurator.cpp
@@ -27,7 +27,7 @@
 using namespace log4cxx::spi;
 using namespace log4cxx::helpers;
 
-void DefaultConfigurator::configure(LoggerRepository* repository)
+void DefaultConfigurator::configure(LoggerRepositoryPtr repository)
 {
 	repository->setConfigured(true);
 	const LogString configuratorClassName(getConfiguratorClass());
diff --git a/src/main/cpp/defaultrepositoryselector.cpp b/src/main/cpp/defaultrepositoryselector.cpp
index 247e0e9..238e0ac 100644
--- a/src/main/cpp/defaultrepositoryselector.cpp
+++ b/src/main/cpp/defaultrepositoryselector.cpp
@@ -22,12 +22,12 @@
 using namespace log4cxx::helpers;
 
 
-DefaultRepositorySelector::DefaultRepositorySelector(const LoggerRepositoryPtr& repository1)
+DefaultRepositorySelector::DefaultRepositorySelector(const LoggerRepositoryPtr repository1)
 	: repository(repository1)
 {
 }
 
-LoggerRepositoryPtr& DefaultRepositorySelector::getLoggerRepository()
+LoggerRepositoryPtr DefaultRepositorySelector::getLoggerRepository()
 {
 	return repository;
 }
diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp
index 55f7328..481c152 100644
--- a/src/main/cpp/domconfigurator.cpp
+++ b/src/main/cpp/domconfigurator.cpp
@@ -766,7 +766,7 @@
     propSetter.setProperty(name, value, p);
 }
 
-void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr& repository1)
+void DOMConfigurator::doConfigure(const File& filename, spi::LoggerRepositoryPtr repository1)
 {
     repository1->setConfigured(true);
     this->repository = repository1;
diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index 9a26809..9e4184e 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -270,8 +270,9 @@
     }
     if (!currentlyConfigured)
     {
+        std::shared_ptr<Hierarchy> nonconstThis = std::const_pointer_cast<Hierarchy>(shared_from_this());
         DefaultConfigurator::configure(
-            const_cast<Hierarchy*>(this));
+            nonconstThis);
 	}
 
 	return thresholdInt > level;
@@ -319,7 +320,7 @@
 
     for (it = loggers->begin(); it != itEnd; it++)
     {
-        LoggerPtr& logger = it->second;
+        LoggerPtr logger = it->second;
         logger->closeNestedAppenders();
     }
 
@@ -328,7 +329,7 @@
 
     for (it = loggers->begin(); it != itEnd; it++)
     {
-        LoggerPtr& logger = it->second;
+        LoggerPtr logger = it->second;
         logger->removeAllAppenders();
     }
 }
diff --git a/src/main/cpp/logger.cpp b/src/main/cpp/logger.cpp
index 31aa4a3..c134108 100644
--- a/src/main/cpp/logger.cpp
+++ b/src/main/cpp/logger.cpp
@@ -102,9 +102,9 @@
 {
     int writes = 0;
 
-    for (LoggerPtr logger(const_cast<Logger*>(this));
+    for (const Logger* logger = this;
             logger != 0;
-            logger = logger->parent)
+            logger = logger->parent.get())
     {
         // Protected against simultaneous call to addAppender, removeAppender,...
         std::unique_lock lock(logger->mutex);
@@ -196,7 +196,7 @@
     return aai->getAppender(name1);
 }
 
-const LevelPtr& Logger::getEffectiveLevel() const
+const LevelPtr Logger::getEffectiveLevel() const
 {
     for (const Logger* l = this; l != 0; l = l->parent.get())
     {
@@ -219,7 +219,7 @@
 
 ResourceBundlePtr Logger::getResourceBundle() const
 {
-    for (LoggerPtr l(const_cast<Logger*>(this)); l != 0; l = l->parent)
+    for (const Logger* l = this; l != 0; l = l->parent.get())
     {
         if (l->resourceBundle != 0)
         {
@@ -504,7 +504,7 @@
     this->repository = repository1;
 }
 
-void Logger::setLevel(const LevelPtr& level1)
+void Logger::setLevel(const LevelPtr level1)
 {
     this->level = level1;
 }
diff --git a/src/main/cpp/logmanager.cpp b/src/main/cpp/logmanager.cpp
index fc39333..7797900 100644
--- a/src/main/cpp/logmanager.cpp
+++ b/src/main/cpp/logmanager.cpp
@@ -47,17 +47,22 @@
 IMPLEMENT_LOG4CXX_OBJECT(DefaultRepositorySelector)
 
 void* LogManager::guard = 0;
+spi::RepositorySelectorPtr LogManager::repositorySelector;
 
 
-
-RepositorySelectorPtr& LogManager::getRepositorySelector()
+RepositorySelectorPtr LogManager::getRepositorySelector()
 {
 	//
 	//     call to initialize APR and trigger "start" of logging clock
 	//
-	APRInitializer::initialize();
-	static spi::RepositorySelectorPtr selector;
-	return selector;
+    APRInitializer::initialize();
+    if (!repositorySelector)
+    {
+        LoggerRepositoryPtr hierarchy(new Hierarchy());
+        RepositorySelectorPtr selector(new DefaultRepositorySelector(hierarchy));
+        repositorySelector = selector;
+    }
+    return repositorySelector;
 }
 
 void LogManager::setRepositorySelector(spi::RepositorySelectorPtr selector,
@@ -79,15 +84,8 @@
 
 
 
-LoggerRepositoryPtr& LogManager::getLoggerRepository()
+LoggerRepositoryPtr LogManager::getLoggerRepository()
 {
-	if (getRepositorySelector() == 0)
-	{
-		LoggerRepositoryPtr hierarchy(new Hierarchy());
-		RepositorySelectorPtr selector(new DefaultRepositorySelector(hierarchy));
-		getRepositorySelector() = selector;
-	}
-
 	return getRepositorySelector()->getLoggerRepository();
 }
 
@@ -209,6 +207,7 @@
 
 void LogManager::shutdown()
 {
+    LoggerRepositoryPtr repPtr = getLoggerRepository();
 	getLoggerRepository()->shutdown();
 }
 
diff --git a/src/main/cpp/optionconverter.cpp b/src/main/cpp/optionconverter.cpp
index f80231f..5791c0b 100644
--- a/src/main/cpp/optionconverter.cpp
+++ b/src/main/cpp/optionconverter.cpp
@@ -375,7 +375,7 @@
 }
 
 void OptionConverter::selectAndConfigure(const File& configFileName,
-	const LogString& _clazz, spi::LoggerRepositoryPtr& hierarchy)
+    const LogString& _clazz, spi::LoggerRepositoryPtr hierarchy)
 {
 	ConfiguratorPtr configurator;
 	LogString clazz = _clazz;
diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp
index da1a911..615d33a 100644
--- a/src/main/cpp/propertyconfigurator.cpp
+++ b/src/main/cpp/propertyconfigurator.cpp
@@ -87,7 +87,7 @@
 }
 
 void PropertyConfigurator::doConfigure(const File& configFileName,
-                                       spi::LoggerRepositoryPtr& hierarchy)
+                                       spi::LoggerRepositoryPtr hierarchy)
 {
     hierarchy->setConfigured(true);
 
@@ -151,7 +151,7 @@
 #endif
 
 void PropertyConfigurator::doConfigure(helpers::Properties& properties,
-                                       spi::LoggerRepositoryPtr& hierarchy)
+                                       spi::LoggerRepositoryPtr hierarchy)
 {
     hierarchy->setConfigured(true);
 
diff --git a/src/main/cpp/rootlogger.cpp b/src/main/cpp/rootlogger.cpp
index f733806..9f3357a 100644
--- a/src/main/cpp/rootlogger.cpp
+++ b/src/main/cpp/rootlogger.cpp
@@ -24,18 +24,18 @@
 using namespace log4cxx::spi;
 using namespace log4cxx::helpers;
 
-RootLogger::RootLogger(Pool& pool, const LevelPtr& level1) :
+RootLogger::RootLogger(Pool& pool, const LevelPtr level1) :
 	Logger(pool, LOG4CXX_STR("root"))
 {
 	setLevel(level1);
 }
 
-const LevelPtr& RootLogger::getEffectiveLevel() const
+const LevelPtr RootLogger::getEffectiveLevel() const
 {
 	return level;
 }
 
-void RootLogger::setLevel(const LevelPtr& level1)
+void RootLogger::setLevel(const LevelPtr level1)
 {
 	if (level1 == 0)
 	{
diff --git a/src/main/include/log4cxx/defaultconfigurator.h b/src/main/include/log4cxx/defaultconfigurator.h
index 362d808..2e563bc 100644
--- a/src/main/include/log4cxx/defaultconfigurator.h
+++ b/src/main/include/log4cxx/defaultconfigurator.h
@@ -42,7 +42,7 @@
 		Add a ConsoleAppender that uses PatternLayout
 		using the PatternLayout#TTCC_CONVERSION_PATTERN and
 		prints to <code>stdout</code> to the root logger.*/
-		static void configure(log4cxx::spi::LoggerRepository*);
+        static void configure(log4cxx::spi::LoggerRepositoryPtr repository);
 
 	private:
 		static const LogString getConfigurationFileName();
diff --git a/src/main/include/log4cxx/helpers/optionconverter.h b/src/main/include/log4cxx/helpers/optionconverter.h
index b19a07e..91e316f 100644
--- a/src/main/include/log4cxx/helpers/optionconverter.h
+++ b/src/main/include/log4cxx/helpers/optionconverter.h
@@ -155,7 +155,7 @@
 		@param hierarchy The Hierarchy to act on.
 		*/
 		static void selectAndConfigure(const File& configFileName,
-			const LogString& clazz, spi::LoggerRepositoryPtr& hierarchy);
+            const LogString& clazz, spi::LoggerRepositoryPtr hierarchy);
 };
 }  // namespace helpers
 } // namespace log4cxx
diff --git a/src/main/include/log4cxx/hierarchy.h b/src/main/include/log4cxx/hierarchy.h
index d23bcf3..a367b77 100644
--- a/src/main/include/log4cxx/hierarchy.h
+++ b/src/main/include/log4cxx/hierarchy.h
@@ -55,7 +55,8 @@
 */
 class LOG4CXX_EXPORT Hierarchy :
 	public virtual spi::LoggerRepository,
-    public virtual helpers::Object
+    public virtual helpers::Object,
+    public std::enable_shared_from_this<Hierarchy>
 {
 	private:
 		log4cxx::helpers::Pool pool;
@@ -66,10 +67,10 @@
 		spi::HierarchyEventListenerList listeners;
 
 		typedef std::map<LogString, LoggerPtr> LoggerMap;
-		LoggerMap* loggers;
+        std::unique_ptr<LoggerMap> loggers;
 
 		typedef std::map<LogString, ProvisionNode> ProvisionNodeMap;
-		ProvisionNodeMap* provisionNodes;
+        std::unique_ptr<ProvisionNodeMap> provisionNodes;
 
 		LoggerPtr root;
 
diff --git a/src/main/include/log4cxx/logger.h b/src/main/include/log4cxx/logger.h
index c46bcea..ec95566 100644
--- a/src/main/include/log4cxx/logger.h
+++ b/src/main/include/log4cxx/logger.h
@@ -618,7 +618,7 @@
 
     @throws RuntimeException if all levels are null in the hierarchy
     */
-    virtual const LevelPtr& getEffectiveLevel() const;
+    virtual const LevelPtr getEffectiveLevel() const;
 
     /**
     Return the the LoggerRepository where this
@@ -1474,7 +1474,7 @@
     <p>As in <pre> &nbsp;&nbsp;&nbsp;logger->setLevel(Level::getDebug()); </pre>
 
     <p>Null values are admitted.  */
-    virtual void setLevel(const LevelPtr& level);
+    virtual void setLevel(const LevelPtr level);
 
     /**
     Set the resource bundle to be used with localized logging methods.
diff --git a/src/main/include/log4cxx/logmanager.h b/src/main/include/log4cxx/logmanager.h
index 3fc3560..40f4614 100644
--- a/src/main/include/log4cxx/logmanager.h
+++ b/src/main/include/log4cxx/logmanager.h
@@ -50,7 +50,8 @@
 {
 	private:
 		static void* guard;
-		static spi::RepositorySelectorPtr& getRepositorySelector();
+        static spi::RepositorySelectorPtr repositorySelector;
+        static spi::RepositorySelectorPtr getRepositorySelector();
 
 	public:
 		/**
@@ -72,7 +73,7 @@
 		static void setRepositorySelector(spi::RepositorySelectorPtr selector,
 			void* guard);
 
-		static spi::LoggerRepositoryPtr& getLoggerRepository();
+        static spi::LoggerRepositoryPtr getLoggerRepository();
 
 		/**
 		Retrieve the appropriate root logger.
diff --git a/src/main/include/log4cxx/propertyconfigurator.h b/src/main/include/log4cxx/propertyconfigurator.h
index cc2c078..c9703bd 100644
--- a/src/main/include/log4cxx/propertyconfigurator.h
+++ b/src/main/include/log4cxx/propertyconfigurator.h
@@ -290,7 +290,7 @@
     @param hierarchy The hierarchy to operation upon.
     */
     void doConfigure(const File& configFileName,
-                     spi::LoggerRepositoryPtr& hierarchy);
+                     spi::LoggerRepositoryPtr hierarchy);
 
     /**
     Read configuration options from file <code>configFilename</code>.
@@ -333,7 +333,7 @@
     for the expected format.
     */
     void doConfigure(helpers::Properties& properties,
-                     spi::LoggerRepositoryPtr& hierarchy);
+                     spi::LoggerRepositoryPtr hierarchy);
 
     // --------------------------------------------------------------------------
     // Internal stuff
diff --git a/src/main/include/log4cxx/spi/configurator.h b/src/main/include/log4cxx/spi/configurator.h
index c7a8706..172999d 100644
--- a/src/main/include/log4cxx/spi/configurator.h
+++ b/src/main/include/log4cxx/spi/configurator.h
@@ -45,7 +45,7 @@
 		@param repository The hierarchy to operation upon.
 		*/
 		virtual void doConfigure(const File& configFileName,
-			spi::LoggerRepositoryPtr& repository) = 0;
+            spi::LoggerRepositoryPtr repository) = 0;
 
 
 	private:
diff --git a/src/main/include/log4cxx/spi/defaultrepositoryselector.h b/src/main/include/log4cxx/spi/defaultrepositoryselector.h
index bf5a6c9..325a359 100644
--- a/src/main/include/log4cxx/spi/defaultrepositoryselector.h
+++ b/src/main/include/log4cxx/spi/defaultrepositoryselector.h
@@ -36,8 +36,9 @@
 		LOG4CXX_CAST_ENTRY(RepositorySelector)
 		END_LOG4CXX_CAST_MAP()
 
-		DefaultRepositorySelector(const LoggerRepositoryPtr& repository1);
-		virtual LoggerRepositoryPtr& getLoggerRepository();
+        DefaultRepositorySelector(const LoggerRepositoryPtr repository1);
+        ~DefaultRepositorySelector(){}
+        virtual LoggerRepositoryPtr getLoggerRepository();
 
 	private:
 		LoggerRepositoryPtr repository;
diff --git a/src/main/include/log4cxx/spi/repositoryselector.h b/src/main/include/log4cxx/spi/repositoryselector.h
index cf36f58..af141b7 100644
--- a/src/main/include/log4cxx/spi/repositoryselector.h
+++ b/src/main/include/log4cxx/spi/repositoryselector.h
@@ -44,7 +44,7 @@
 	public:
 		DECLARE_ABSTRACT_LOG4CXX_OBJECT(RepositorySelector)
 		virtual ~RepositorySelector() {}
-		virtual LoggerRepositoryPtr& getLoggerRepository() = 0;
+        virtual LoggerRepositoryPtr getLoggerRepository() = 0;
 };
 LOG4CXX_PTR_DEF(RepositorySelector);
 }  //namespace spi
diff --git a/src/main/include/log4cxx/spi/rootlogger.h b/src/main/include/log4cxx/spi/rootlogger.h
index f2f3e8c..671dfa9 100644
--- a/src/main/include/log4cxx/spi/rootlogger.h
+++ b/src/main/include/log4cxx/spi/rootlogger.h
@@ -40,19 +40,21 @@
 		The root logger names itself as "root". However, the root
 		logger cannot be retrieved by name.
 		*/
-		RootLogger(log4cxx::helpers::Pool& pool, const LevelPtr& level);
+        RootLogger(log4cxx::helpers::Pool& pool, const LevelPtr level);
+
+        ~RootLogger(){}
 
 		/**
 		Return the assigned level value without walking the logger
 		hierarchy.
 		*/
-		virtual const LevelPtr& getEffectiveLevel() const;
+        virtual const LevelPtr getEffectiveLevel() const;
 
 		/**
 		            Setting a null value to the level of the root logger may have catastrophic
 		            results. We prevent this here.
 		            */
-		void setLevel(const LevelPtr& level);
+        void setLevel(const LevelPtr level);
 };
 }  // namespace spi
 } // namespace log4cxx
diff --git a/src/main/include/log4cxx/xml/domconfigurator.h b/src/main/include/log4cxx/xml/domconfigurator.h
index fa737ce..fde17fd 100644
--- a/src/main/include/log4cxx/xml/domconfigurator.h
+++ b/src/main/include/log4cxx/xml/domconfigurator.h
@@ -286,7 +286,7 @@
     @param repository The hierarchy to operation upon.
     */
     void doConfigure(const File& filename,
-                     spi::LoggerRepositoryPtr& repository);
+                     spi::LoggerRepositoryPtr repository);
 
 protected:
     static LogString getAttribute(