diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index 2813814ae14f759bb838d2b8e448f82254079fc8..b78110296fa52e4568f848128c981fd72a9e784a 100755
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -111,13 +111,13 @@ void LLSingletonBase::pop_initializing()
     if (list.empty())
     {
         logerrs("Underflow in stack of currently-initializing LLSingletons at ",
-                typeid(*this).name(), "::getInstance()");
+                demangle(typeid(*this).name()).c_str(), "::getInstance()");
     }
     if (list.back() != this)
     {
         logerrs("Push/pop mismatch in stack of currently-initializing LLSingletons: ",
-                typeid(*this).name(), "::getInstance() trying to pop ",
-                typeid(*list.back()).name());
+                demangle(typeid(*this).name()).c_str(), "::getInstance() trying to pop ",
+                demangle(typeid(*list.back()).name()).c_str());
     }
     // Here we're sure that list.back() == this. Whew, pop it.
     list.pop_back();
@@ -148,7 +148,7 @@ void LLSingletonBase::capture_dependency(EInitState initState)
             {
                 // 'found' is an iterator; *found is an LLSingletonBase*; **found
                 // is the actual LLSingletonBase instance.
-                out << typeid(**found).name() << " -> ";
+                out << demangle(typeid(**found).name()) << " -> ";
             }
             // We promise to capture dependencies from both the constructor
             // and the initSingleton() method, so an LLSingleton's instance
@@ -161,7 +161,8 @@ void LLSingletonBase::capture_dependency(EInitState initState)
             // Decide which log helper to call based on initState. They have
             // identical signatures.
             ((initState == CONSTRUCTING)? logerrs : logwarns)
-                ("LLSingleton circularity: ", out.str().c_str(), typeid(*this).name(), "");
+                ("LLSingleton circularity: ", out.str().c_str(),
+                 demangle(typeid(*this).name()).c_str(), "");
         }
         else
         {
@@ -232,12 +233,12 @@ void LLSingletonBase::cleanupAll()
             }
             catch (const std::exception& e)
             {
-                logwarns("Exception in ", typeid(*sp).name(),
+                logwarns("Exception in ", demangle(typeid(*sp).name()).c_str(),
                          "::cleanupSingleton(): ", e.what());
             }
             catch (...)
             {
-                logwarns("Unknown exception in ", typeid(*sp).name(),
+                logwarns("Unknown exception in ", demangle(typeid(*sp).name()).c_str(),
                          "::cleanupSingleton()");
             }
         }
@@ -252,14 +253,14 @@ void LLSingletonBase::deleteAll()
     {
         // Capture the class name first: in case of exception, don't count on
         // being able to extract it later.
-        const char* name = typeid(*sp).name();
+        const std::string name = demangle(typeid(*sp).name());
         try
         {
             // Call static method through instance function pointer.
             if (! sp->mDeleteSingleton)
             {
                 // This Should Not Happen... but carry on.
-                logwarns(name, "::mDeleteSingleton not initialized!");
+                logwarns(name.c_str(), "::mDeleteSingleton not initialized!");
             }
             else
             {
@@ -270,11 +271,11 @@ void LLSingletonBase::deleteAll()
         }
         catch (const std::exception& e)
         {
-            logwarns("Exception in ", name, "::deleteSingleton(): ", e.what());
+            logwarns("Exception in ", name.c_str(), "::deleteSingleton(): ", e.what());
         }
         catch (...)
         {
-            logwarns("Unknown exception in ", name, "::deleteSingleton()");
+            logwarns("Unknown exception in ", name.c_str(), "::deleteSingleton()");
         }
     }
 }
@@ -348,3 +349,8 @@ void LLSingletonBase::logwarns(const char* p1, const char* p2, const char* p3, c
         std::cerr << p1 << p2 << p3 << p4 << std::endl;
     }
 }
+
+std::string LLSingletonBase::demangle(const char* mangled)
+{
+    return LLError::Log::demangle(mangled);
+}
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index a82101c367da87c517bce904a5d5c6b004e03919..253e0b9a6b90b302a1b8daf3cc1e8c821d048421 100755
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -104,6 +104,7 @@ class LLSingletonBase: private boost::noncopyable
     // delegate LL_WARNS() logging to llsingleton.cpp
     static void logwarns(const char* p1, const char* p2="",
                          const char* p3="", const char* p4="");
+    static std::string demangle(const char* mangled);
 
     // obtain canonical ref_ptr_t
     static ref_ptr_t get_master_refcount();
@@ -337,11 +338,13 @@ class LLSingleton : public LLSingletonBase
         {
         case UNINITIALIZED:
             // should never be uninitialized at this point
-            logerrs("Uninitialized singleton ", typeid(DERIVED_TYPE).name());
+            logerrs("Uninitialized singleton ",
+                    demangle(typeid(DERIVED_TYPE).name()).c_str());
             return NULL;
 
         case CONSTRUCTING:
-            logerrs("Tried to access singleton ", typeid(DERIVED_TYPE).name(),
+            logerrs("Tried to access singleton ",
+                    demangle(typeid(DERIVED_TYPE).name()).c_str(),
                     " from singleton constructor!");
             return NULL;
 
@@ -361,7 +364,8 @@ class LLSingleton : public LLSingletonBase
             break;
 
         case DELETED:
-            logwarns("Trying to access deleted singleton ", typeid(DERIVED_TYPE).name(),
+            logwarns("Trying to access deleted singleton ",
+                     demangle(typeid(DERIVED_TYPE).name()).c_str(),
                      " -- creating new instance");
             SingletonLifetimeManager::construct();
             // same as first time construction