diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h
index 8a1d2c4707e735823e94e17018240c4e8ad2fe9b..d6223bb4d24e732ceb01df1627434fd631dcda5f 100644
--- a/indra/llappearance/llavatarappearancedefines.h
+++ b/indra/llappearance/llavatarappearancedefines.h
@@ -127,8 +127,7 @@ class LLAvatarAppearanceDictionary : public LLSingleton<LLAvatarAppearanceDictio
 	//--------------------------------------------------------------------
 	// Constructors and Destructors
 	//--------------------------------------------------------------------
-public:
-	LLAvatarAppearanceDictionary();
+	LLSINGLETON(LLAvatarAppearanceDictionary);
 	virtual ~LLAvatarAppearanceDictionary();
 private:
 	void createAssociations();
diff --git a/indra/llappearance/lltexlayer.h b/indra/llappearance/lltexlayer.h
index 959d6e499abfb348bf8709e2b4c6b618871a9e3c..9318b23fd199b32841d84a7192748634dcf282e2 100644
--- a/indra/llappearance/lltexlayer.h
+++ b/indra/llappearance/lltexlayer.h
@@ -293,9 +293,9 @@ class LLTexLayerSetBuffer : public virtual LLRefCount
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>
 {
-public:
-	LLTexLayerStaticImageList();
+	LLSINGLETON(LLTexLayerStaticImageList);
 	~LLTexLayerStaticImageList();
+public:
 	LLGLTexture*		getTexture(const std::string& file_name, BOOL is_mask);
 	LLImageTGA*			getImageTGA(const std::string& file_name);
 	void				deleteCachedImages();
diff --git a/indra/llappearance/llwearabletype.cpp b/indra/llappearance/llwearabletype.cpp
index 87109a5906ec7263b5d1957f4c6bcbe2781fc476..207e0c4011f2e9c9496ea6c34b487d991b92f8a8 100644
--- a/indra/llappearance/llwearabletype.cpp
+++ b/indra/llappearance/llwearabletype.cpp
@@ -71,8 +71,7 @@ struct WearableEntry : public LLDictionaryEntry
 class LLWearableDictionary : public LLSingleton<LLWearableDictionary>,
 							 public LLDictionary<LLWearableType::EType, WearableEntry>
 {
-public:
-	LLWearableDictionary();
+	LLSINGLETON(LLWearableDictionary);
 };
 
 LLWearableDictionary::LLWearableDictionary()
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 5ae2df39945b6b2517fae061c6895a578c0a8b65..4304db36bea26b30380a85184f47cc5f45dbd8f7 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -63,8 +63,7 @@ struct AssetEntry : public LLDictionaryEntry
 class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
 						  public LLDictionary<LLAssetType::EType, AssetEntry>
 {
-public:
-	LLAssetDictionary();
+	LLSINGLETON(LLAssetDictionary);
 };
 
 LLAssetDictionary::LLAssetDictionary()
diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h
index 0da7a3a6e4744437564b3be7a0ce38a6a05fe167..bbe2d22af4e1b09609ff52ea93dee84002267116 100644
--- a/indra/llcommon/llcoros.h
+++ b/indra/llcommon/llcoros.h
@@ -85,6 +85,7 @@ class Suspending;
  */
 class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
 {
+    LLSINGLETON(LLCoros);
 public:
     /// Canonical boost::dcoroutines::coroutine signature we use
     typedef boost::dcoroutines::coroutine<void()> coro;
@@ -175,8 +176,6 @@ class LL_COMMON_API LLCoros: public LLSingleton<LLCoros>
     class Future;
 
 private:
-    LLCoros();
-    friend class LLSingleton<LLCoros>;
     friend class llcoro::Suspending;
     friend llcoro::id llcoro::get_id();
     std::string generateDistinctName(const std::string& prefix) const;
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index a34b50f816ee3dc9aa2e2cad1664f94ad7f8ff10..2ef748e3e434c547a395f12452353ef85236bb9e 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -374,9 +374,8 @@ namespace
 
 	class Globals : public LLSingleton<Globals>
 	{
+		LLSINGLETON(Globals);
 	public:
-		Globals();
-
 		std::ostringstream messageStream;
 		bool messageStreamInUse;
 
@@ -449,9 +448,8 @@ namespace LLError
 
 	class Settings : public LLSingleton<Settings>
 	{
+		LLSINGLETON(Settings);
 	public:
-		Settings();
-
 		SettingsConfigPtr getSettingsConfig();
 
 		void reset();
@@ -486,8 +484,7 @@ namespace LLError
 		mRecorders.clear();
 	}
 
-	Settings::Settings()
-		: LLSingleton<Settings>(),
+	Settings::Settings():
 		mSettingsConfig(new SettingsConfig())
 	{
 	}
diff --git a/indra/llcommon/llevents.h b/indra/llcommon/llevents.h
index ba4fcd766ee594ff2b9c04b2582dc30fa75fb3a5..6c8b66f5968823db5d7f7ed03be0643f4650d42a 100644
--- a/indra/llcommon/llevents.h
+++ b/indra/llcommon/llevents.h
@@ -209,7 +209,7 @@ class LLEventPump;
  */
 class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
 {
-    friend class LLSingleton<LLEventPumps>;
+    LLSINGLETON(LLEventPumps);
 public:
     /**
      * Find or create an LLEventPump instance with a specific name. We return
@@ -252,7 +252,6 @@ class LL_COMMON_API LLEventPumps: public LLSingleton<LLEventPumps>
     void unregister(const LLEventPump&);
 
 private:
-    LLEventPumps();
     ~LLEventPumps();
 
 testable:
diff --git a/indra/llcommon/llinitdestroyclass.h b/indra/llcommon/llinitdestroyclass.h
index 9c662114752d78ad78b6722f927d9e401739a44f..5f979614fe0ee94b4b8036d983a1006ae1d507ee 100644
--- a/indra/llcommon/llinitdestroyclass.h
+++ b/indra/llcommon/llinitdestroyclass.h
@@ -78,9 +78,7 @@ class LLInitClassList :
 	public LLCallbackRegistry, 
 	public LLSingleton<LLInitClassList>
 {
-	friend class LLSingleton<LLInitClassList>;
-private:
-	LLInitClassList() {}
+	LLSINGLETON_EMPTY_CTOR(LLInitClassList);
 };
 
 /**
@@ -94,9 +92,7 @@ class LLDestroyClassList :
 	public LLCallbackRegistry, 
 	public LLSingleton<LLDestroyClassList>
 {
-	friend class LLSingleton<LLDestroyClassList>;
-private:
-	LLDestroyClassList() {}
+	LLSINGLETON_EMPTY_CTOR(LLDestroyClassList);
 };
 
 /**
diff --git a/indra/llcommon/llpounceable.h b/indra/llcommon/llpounceable.h
index 77b711bdc6d1cca135cbc59affdab6f8d91505b9..0421ce966a7276ece6570a555ab4120d60f1ad86 100644
--- a/indra/llcommon/llpounceable.h
+++ b/indra/llcommon/llpounceable.h
@@ -76,7 +76,8 @@ template <typename T>
 class LLPounceableQueueSingleton:
     public LLSingleton<LLPounceableQueueSingleton<T> >
 {
-private:
+    LLSINGLETON_EMPTY_CTOR(LLPounceableQueueSingleton);
+
     typedef LLPounceableTraits<T, LLPounceableStatic> traits;
     typedef typename traits::owner_ptr owner_ptr;
     typedef typename traits::signal_t signal_t;
diff --git a/indra/llcommon/llregistry.h b/indra/llcommon/llregistry.h
index fde729f8f93e0655fc3233c287637fb828175458..750fe9fdc8a0d3193e99cbcbf1c257d624324f77 100644
--- a/indra/llcommon/llregistry.h
+++ b/indra/llcommon/llregistry.h
@@ -247,7 +247,10 @@ class LLRegistrySingleton
 	:	public LLRegistry<KEY, VALUE, COMPARATOR>,
 		public LLSingleton<DERIVED_TYPE>
 {
-	friend class LLSingleton<DERIVED_TYPE>;
+	// This LLRegistrySingleton doesn't use LLSINGLETON(LLRegistrySingleton)
+	// because the concrete class is actually DERIVED_TYPE, not
+	// LLRegistrySingleton. So each concrete subclass needs
+	// LLSINGLETON(whatever) -- not this intermediate base class.
 public:
 	typedef LLRegistry<KEY, VALUE, COMPARATOR>		registry_t;
 	typedef const KEY&								ref_const_key_t;
diff --git a/indra/llcommon/llsingleton.cpp b/indra/llcommon/llsingleton.cpp
index 24ccc8ddb429452f1e9fd685477c135abc7ea0d7..9025e53bb27a2d42d908f957a82242039e1cd170 100644
--- a/indra/llcommon/llsingleton.cpp
+++ b/indra/llcommon/llsingleton.cpp
@@ -57,8 +57,7 @@ bool oktolog();
 class LLSingletonBase::MasterList:
     public LLSingleton<LLSingletonBase::MasterList>
 {
-private:
-    friend class LLSingleton<LLSingletonBase::MasterList>;
+    LLSINGLETON_EMPTY_CTOR(MasterList);
 
 public:
     // No need to make this private with accessors; nobody outside this source
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index 92fba4c1a8e6b1713e00f599b31eb7bf4468435c..1b915dfd6e96d927fd520ba58415c52387295049 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -223,7 +223,13 @@ LLSingletonBase::LLSingletonBase(tag<DERIVED_TYPE>):
  * Derive your class from LLSingleton, passing your subclass name as
  * LLSingleton's template parameter, like so:
  *
- *   class Foo: public LLSingleton<Foo>{};
+ *   class Foo: public LLSingleton<Foo>
+ *   {
+ *       // use this macro at start of every LLSingleton subclass
+ *       LLSINGLETON(Foo);
+ *   public:
+ *       // ...
+ *   };
  *
  *   Foo& instance = Foo::instance();
  *
@@ -279,6 +285,16 @@ class LLSingleton : public LLSingletonBase
         return new DERIVED_TYPE();
     }
 
+    // We know of no way to instruct the compiler that every subclass
+    // constructor MUST be private. However, we can make the LLSINGLETON()
+    // macro both declare a private constructor and provide the required
+    // friend declaration. How can we ensure that every subclass uses
+    // LLSINGLETON()? By making that macro provide a definition for this pure
+    // virtual method. If you get "can't instantiate class due to missing pure
+    // virtual method" for this method, then add LLSINGLETON(yourclass) in the
+    // subclass body.
+    virtual void you_must_use_LLSINGLETON_macro() = 0;
+
     // stores pointer to singleton instance
     struct SingletonLifetimeManager
     {
@@ -450,4 +466,54 @@ class LLSingleton : public LLSingletonBase
 template<typename T>
 typename LLSingleton<T>::SingletonData LLSingleton<T>::sData;
 
+/**
+ * Use LLSINGLETON(Foo); at the start of an LLSingleton<Foo> subclass body
+ * when you want to declare an out-of-line constructor:
+ *
+ * @code
+ *   class Foo: public LLSingleton<Foo>
+ *   {
+ *       // use this macro at start of every LLSingleton subclass
+ *       LLSINGLETON(Foo);
+ *   public:
+ *       // ...
+ *   };
+ *   // ...
+ *   [inline]
+ *   Foo::Foo() { ... }
+ * @endcode
+ *
+ * Unfortunately, this mechanism does not permit you to define even a simple
+ * (but nontrivial) constructor within the class body. If it's literally
+ * trivial, use LLSINGLETON_EMPTY_CTOR(); if not, use LLSINGLETON() and define
+ * the constructor outside the class body. If you must define it in a header
+ * file, use 'inline' (unless it's a template class) to avoid duplicate-symbol
+ * errors at link time.
+ */
+#define LLSINGLETON(DERIVED_CLASS)                                      \
+private:                                                                \
+    /* implement LLSingleton pure virtual method whose sole purpose */  \
+    /* is to remind people to use this macro */                         \
+    virtual void you_must_use_LLSINGLETON_macro() {}                    \
+    friend class LLSingleton<DERIVED_CLASS>;                            \
+    DERIVED_CLASS()
+
+/**
+ * Use LLSINGLETON_EMPTY_CTOR(Foo); at the start of an LLSingleton<Foo>
+ * subclass body when the constructor is trivial:
+ *
+ * @code
+ *   class Foo: public LLSingleton<Foo>
+ *   {
+ *       // use this macro at start of every LLSingleton subclass
+ *       LLSINGLETON_EMPTY_CTOR(Foo);
+ *   public:
+ *       // ...
+ *   };
+ * @endcode
+ */
+#define LLSINGLETON_EMPTY_CTOR(DERIVED_CLASS)                           \
+    /* LLSINGLETON() is carefully implemented to permit exactly this */ \
+    LLSINGLETON(DERIVED_CLASS) {}
+
 #endif
diff --git a/indra/llcommon/tests/llsingleton_test.cpp b/indra/llcommon/tests/llsingleton_test.cpp
index a05f650f25f8d5e18330bd4d62417ecd32522ae7..56886bc73fd9185932f76c82d0d72232cc5c4e5c 100644
--- a/indra/llcommon/tests/llsingleton_test.cpp
+++ b/indra/llcommon/tests/llsingleton_test.cpp
@@ -34,21 +34,22 @@
 // Capture execution sequence by appending to log string.
 std::string sLog;
 
-#define DECLARE_CLASS(CLS)                      \
-struct CLS: public LLSingleton<CLS>             \
-{                                               \
-    static enum dep_flag {                      \
-        DEP_NONE, /* no dependency */           \
-        DEP_CTOR, /* dependency in ctor */      \
+#define DECLARE_CLASS(CLS)                          \
+struct CLS: public LLSingleton<CLS>                 \
+{                                                   \
+    LLSINGLETON(CLS);                               \
+    ~CLS();                                         \
+public:                                             \
+    static enum dep_flag {                          \
+        DEP_NONE, /* no dependency */               \
+        DEP_CTOR, /* dependency in ctor */          \
         DEP_INIT  /* dependency in initSingleton */ \
-    } sDepFlag;                                 \
-                                                \
-    CLS();                                      \
-    void initSingleton();                       \
-    void cleanupSingleton();                    \
-    ~CLS();                                     \
-};                                              \
-                                                \
+    } sDepFlag;                                     \
+                                                    \
+    void initSingleton();                           \
+    void cleanupSingleton();                        \
+};                                                  \
+                                                    \
 CLS::dep_flag CLS::sDepFlag = DEP_NONE
 
 DECLARE_CLASS(A);
@@ -93,7 +94,7 @@ namespace tut
         // We need a class created with the LLSingleton template to test with.
         class LLSingletonTest: public LLSingleton<LLSingletonTest>
         {
-
+            LLSINGLETON_EMPTY_CTOR(LLSingletonTest);
         };
     };
 
diff --git a/indra/llinventory/lleconomy.cpp b/indra/llinventory/lleconomy.cpp
index e10402196fd568e1f1154fe3d8fef45445d55523..2a023d8c24dc4aa4481967f5496cb232d3358047 100644
--- a/indra/llinventory/lleconomy.cpp
+++ b/indra/llinventory/lleconomy.cpp
@@ -31,7 +31,7 @@
 #include "v3math.h"
 
 
-LLGlobalEconomy::LLGlobalEconomy()
+LLBaseEconomy::LLBaseEconomy()
 :	mObjectCount( -1 ),
 	mObjectCapacity( -1 ),
 	mPriceObjectClaim( -1 ),
@@ -45,15 +45,15 @@ LLGlobalEconomy::LLGlobalEconomy()
 	mPriceGroupCreate( -1 )
 { }
 
-LLGlobalEconomy::~LLGlobalEconomy()
+LLBaseEconomy::~LLBaseEconomy()
 { }
 
-void LLGlobalEconomy::addObserver(LLEconomyObserver* observer)
+void LLBaseEconomy::addObserver(LLEconomyObserver* observer)
 {
 	mObservers.push_back(observer);
 }
 
-void LLGlobalEconomy::removeObserver(LLEconomyObserver* observer)
+void LLBaseEconomy::removeObserver(LLEconomyObserver* observer)
 {
 	std::list<LLEconomyObserver*>::iterator it =
 		std::find(mObservers.begin(), mObservers.end(), observer);
@@ -63,7 +63,7 @@ void LLGlobalEconomy::removeObserver(LLEconomyObserver* observer)
 	}
 }
 
-void LLGlobalEconomy::notifyObservers()
+void LLBaseEconomy::notifyObservers()
 {
 	for (std::list<LLEconomyObserver*>::iterator it = mObservers.begin();
 		it != mObservers.end();
@@ -74,7 +74,7 @@ void LLGlobalEconomy::notifyObservers()
 }
 
 // static
-void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data)
+void LLBaseEconomy::processEconomyData(LLMessageSystem *msg, LLBaseEconomy* econ_data)
 {
 	S32 i;
 	F32 f;
@@ -117,7 +117,7 @@ void LLGlobalEconomy::processEconomyData(LLMessageSystem *msg, LLGlobalEconomy*
 	econ_data->notifyObservers();
 }
 
-S32	LLGlobalEconomy::calculateTeleportCost(F32 distance) const
+S32	LLBaseEconomy::calculateTeleportCost(F32 distance) const
 {
 	S32 min_cost = getTeleportMinPrice();
 	F32 exponent = getTeleportPriceExponent();
@@ -135,13 +135,13 @@ S32	LLGlobalEconomy::calculateTeleportCost(F32 distance) const
 	return cost;
 }
 
-S32	LLGlobalEconomy::calculateLightRent(const LLVector3& object_size) const
+S32	LLBaseEconomy::calculateLightRent(const LLVector3& object_size) const
 {
 	F32 intensity_mod = llmax(object_size.magVec(), 1.f);
 	return (S32)(intensity_mod * getPriceRentLight());
 }
 
-void LLGlobalEconomy::print()
+void LLBaseEconomy::print()
 {
 	LL_INFOS() << "Global Economy Settings: " << LL_ENDL;
 	LL_INFOS() << "Object Capacity: " << mObjectCapacity << LL_ENDL;
@@ -159,8 +159,7 @@ void LLGlobalEconomy::print()
 }
 
 LLRegionEconomy::LLRegionEconomy()
-:	LLGlobalEconomy(),
-	mPriceObjectRent( -1.f ),
+:	mPriceObjectRent( -1.f ),
 	mPriceObjectScaleFactor( -1.f ),
 	mEnergyEfficiency( -1.f ),
 	mBasePriceParcelClaimDefault(-1),
@@ -187,7 +186,7 @@ void LLRegionEconomy::processEconomyData(LLMessageSystem *msg, void** user_data)
 
 	LLRegionEconomy *this_ptr = (LLRegionEconomy*)user_data;
 
-	LLGlobalEconomy::processEconomyData(msg, this_ptr);
+	LLBaseEconomy::processEconomyData(msg, this_ptr);
 
 	msg->getS32Fast(_PREHASH_Info, _PREHASH_PriceParcelClaim, i);
 	this_ptr->setBasePriceParcelClaimDefault(i);
@@ -252,7 +251,7 @@ S32 LLRegionEconomy::getPriceParcelRent() const
 
 void LLRegionEconomy::print()
 {
-	this->LLGlobalEconomy::print();
+	this->LLBaseEconomy::print();
 
 	LL_INFOS() << "Region Economy Settings: " << LL_ENDL;
 	LL_INFOS() << "Land (square meters): " << mAreaTotal << LL_ENDL;
diff --git a/indra/llinventory/lleconomy.h b/indra/llinventory/lleconomy.h
index 83836b7ce1d83b95467d58ab859acbec52c7a811..cdfde171c1834371f9af16ecce60999935577252 100644
--- a/indra/llinventory/lleconomy.h
+++ b/indra/llinventory/lleconomy.h
@@ -42,11 +42,11 @@ class LLEconomyObserver
 	virtual void onEconomyDataChange() = 0;
 };
 
-class LLGlobalEconomy: public LLSingleton<LLGlobalEconomy>
+class LLBaseEconomy
 {
 public:
-	LLGlobalEconomy();
-	virtual ~LLGlobalEconomy();
+	LLBaseEconomy();
+	virtual ~LLBaseEconomy();
 
 	virtual void print();
 
@@ -54,7 +54,7 @@ class LLGlobalEconomy: public LLSingleton<LLGlobalEconomy>
 	void	removeObserver(LLEconomyObserver* observer);
 	void	notifyObservers();
 
-	static void processEconomyData(LLMessageSystem *msg, LLGlobalEconomy* econ_data);
+	static void processEconomyData(LLMessageSystem *msg, LLBaseEconomy* econ_data);
 
 	S32		calculateTeleportCost(F32 distance) const;
 	S32		calculateLightRent(const LLVector3& object_size) const;
@@ -101,8 +101,12 @@ class LLGlobalEconomy: public LLSingleton<LLGlobalEconomy>
 	std::list<LLEconomyObserver*> mObservers;
 };
 
+class LLGlobalEconomy: public LLSingleton<LLGlobalEconomy>, public LLBaseEconomy
+{
+	LLSINGLETON_EMPTY_CTOR(LLGlobalEconomy);
+};
 
-class LLRegionEconomy : public LLGlobalEconomy
+class LLRegionEconomy : public LLBaseEconomy
 {
 public:
 	LLRegionEconomy();
diff --git a/indra/llinventory/llfoldertype.cpp b/indra/llinventory/llfoldertype.cpp
index 86aca77de894f8a4f49a1c3e34d5f6328d900185..b0daf639fad2c054e77f45b21584fa795f1fc585 100644
--- a/indra/llinventory/llfoldertype.cpp
+++ b/indra/llinventory/llfoldertype.cpp
@@ -51,8 +51,7 @@ struct FolderEntry : public LLDictionaryEntry
 class LLFolderDictionary : public LLSingleton<LLFolderDictionary>,
 						   public LLDictionary<LLFolderType::EType, FolderEntry>
 {
-public:
-	LLFolderDictionary();
+	LLSINGLETON(LLFolderDictionary);
 protected:
 	virtual LLFolderType::EType notFound() const
 	{
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index 8807b36117047dd08658ebe9feeaec5ef0fb5993..d1e6807f52138a3fa5fd2ed6a64b5433d6a337b9 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -63,8 +63,7 @@ struct InventoryEntry : public LLDictionaryEntry
 class LLInventoryDictionary : public LLSingleton<LLInventoryDictionary>,
 							  public LLDictionary<LLInventoryType::EType, InventoryEntry>
 {
-public:
-	LLInventoryDictionary();
+	LLSINGLETON(LLInventoryDictionary);
 };
 
 LLInventoryDictionary::LLInventoryDictionary()
diff --git a/indra/llmessage/llcoproceduremanager.h b/indra/llmessage/llcoproceduremanager.h
index 497367b80cdc5713415a1cbd5f27320fcde950a8..7d0e83180ce1593dc3451b96be834f319e300c2e 100644
--- a/indra/llmessage/llcoproceduremanager.h
+++ b/indra/llmessage/llcoproceduremanager.h
@@ -37,7 +37,8 @@ class LLCoprocedurePool;
 
 class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
 {
-    friend class LLSingleton < LLCoprocedureManager > ;
+    LLSINGLETON(LLCoprocedureManager);
+    virtual ~LLCoprocedureManager();
 
 public:
     typedef boost::function<U32(const std::string &)> SettingQuery_t;
@@ -45,9 +46,6 @@ class LLCoprocedureManager : public LLSingleton < LLCoprocedureManager >
 
     typedef boost::function<void(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &, const LLUUID &id)> CoProcedure_t;
 
-    LLCoprocedureManager();
-    virtual ~LLCoprocedureManager();
-
     /// Places the coprocedure on the queue for processing. 
     /// 
     /// @param name Is used for debugging and should identify this coroutine.
diff --git a/indra/llmessage/llexperiencecache.h b/indra/llmessage/llexperiencecache.h
index 1002b33f801865acf6c7665cc65da017ecee7f78..8ee7080d3822ae52b9c288877c845540fccb9fd3 100644
--- a/indra/llmessage/llexperiencecache.h
+++ b/indra/llmessage/llexperiencecache.h
@@ -43,7 +43,7 @@ class LLUUID;
 
 class LLExperienceCache: public LLSingleton < LLExperienceCache >
 {
-    friend class LLSingleton < LLExperienceCache > ;
+    LLSINGLETON(LLExperienceCache);
 
 public:
     typedef boost::function<std::string(const std::string &)> CapabilityQuery_t;
@@ -103,7 +103,6 @@ class LLExperienceCache: public LLSingleton < LLExperienceCache >
     static const int PROPERTY_SUSPENDED;	// 1 << 7
 
 private:
-    LLExperienceCache();
     virtual ~LLExperienceCache();
 
     virtual void initSingleton();
diff --git a/indra/llmessage/llproxy.h b/indra/llmessage/llproxy.h
index bd23dd39defcb644ba2d904fd9c9748cf3d8c7ca..688dff7c8320916b9f2027f91f16d0cd6408867f 100644
--- a/indra/llmessage/llproxy.h
+++ b/indra/llmessage/llproxy.h
@@ -218,14 +218,14 @@ enum LLSocks5AuthType
  */
 class LLProxy: public LLSingleton<LLProxy>
 {
-	LOG_CLASS(LLProxy);
-public:
 	/*###########################################################################################
 	METHODS THAT DO NOT LOCK mProxyMutex!
 	###########################################################################################*/
 	// Constructor, cannot have parameters due to LLSingleton parent class. Call from main thread only.
-	LLProxy();
+	LLSINGLETON(LLProxy);
+	LOG_CLASS(LLProxy);
 
+public:
 	// Static check for enabled status for UDP packets. Call from main thread only.
 	static bool isSOCKSProxyEnabled() { return sUDPProxyEnabled; }
 
@@ -239,9 +239,11 @@ class LLProxy: public LLSingleton<LLProxy>
 	/*###########################################################################################
 	METHODS THAT LOCK mProxyMutex! DO NOT CALL WHILE mProxyMutex IS LOCKED!
 	###########################################################################################*/
+private:
 	// Destructor, closes open connections. Do not call directly, use cleanupClass().
 	~LLProxy();
 
+public:
 	// Delete LLProxy singleton. Allows the apr_socket used in the SOCKS 5 control channel to be
 	// destroyed before the call to apr_terminate. Call from main thread only.
 	static void cleanupClass();
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index 681de441cee1824b9ee34384628fd49df12999c3..f6c5d9e228d8087ddbb0f985aa18f895d91b2973 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -69,10 +69,10 @@ const S32 MESSAGE_MAX_PER_FRAME = 400;
 
 class LLMessageStringTable : public LLSingleton<LLMessageStringTable>
 {
-public:
-	LLMessageStringTable();
+	LLSINGLETON(LLMessageStringTable);
 	~LLMessageStringTable();
 
+public:
 	char *getString(const char *str);
 
 	U32	 mUsed;
diff --git a/indra/llmessage/tests/networkio.h b/indra/llmessage/tests/networkio.h
index 2aff90ca1ef8657f0c56cced2cc9a33c02f98041..e579b2fb89785e670041b46e2137abca708cd9e2 100644
--- a/indra/llmessage/tests/networkio.h
+++ b/indra/llmessage/tests/networkio.h
@@ -43,7 +43,7 @@
 // init time. Use the lazy, on-demand initialization we get from LLSingleton.
 class NetworkIO: public LLSingleton<NetworkIO>
 {
-public:
+    LLSINGLETON(NetworkIO);
     NetworkIO():
         mServicePump(NULL),
         mDone(false)
@@ -68,6 +68,7 @@ class NetworkIO: public LLSingleton<NetworkIO>
                                                        boost::bind(&NetworkIO::done, this, _1));
     }
 
+public:
     bool pump(F32 timeout=10)
     {
         // Reset the done flag so we don't pop out prematurely
diff --git a/indra/llui/llclipboard.h b/indra/llui/llclipboard.h
index 58d80e26876419977f48b4f216dbb780a5a76609..a668ac1ac6cfe9a30963d58340127117d23be931 100644
--- a/indra/llui/llclipboard.h
+++ b/indra/llui/llclipboard.h
@@ -48,10 +48,10 @@
 
 class LLClipboard : public LLSingleton<LLClipboard>
 {
-public:
-	LLClipboard();
+	LLSINGLETON(LLClipboard);
 	~LLClipboard();
 	
+public:
 	// Clears the clipboard
 	void reset();
 	// Returns the state of the clipboard so client can know if it has been modified (comparing with tracked state)
diff --git a/indra/llui/llcommandmanager.h b/indra/llui/llcommandmanager.h
index f2f2145953c3f35820dbb6f2f6146fc69c39922a..8cec5e2b244e6d3e1b1dbdb32f3f711392675b5c 100644
--- a/indra/llui/llcommandmanager.h
+++ b/indra/llui/llcommandmanager.h
@@ -173,6 +173,9 @@ class LLCommand
 class LLCommandManager
 :	public LLSingleton<LLCommandManager>
 {
+	LLSINGLETON(LLCommandManager);
+	~LLCommandManager();
+
 public:
 	struct Params : public LLInitParam::Block<Params>
 	{
@@ -184,9 +187,6 @@ class LLCommandManager
 		}
 	};
 
-	LLCommandManager();
-	~LLCommandManager();
-
 	U32 commandCount() const;
 	LLCommand * getCommand(U32 commandIndex);
 	LLCommand * getCommand(const LLCommandId& commandId);
diff --git a/indra/llui/llcontainerview.h b/indra/llui/llcontainerview.h
index ac92b19977512043dc5e15ea2e0877f654742ea1..99267d978aa49f7c5283f846441bd15e81a7044c 100644
--- a/indra/llui/llcontainerview.h
+++ b/indra/llui/llcontainerview.h
@@ -35,7 +35,9 @@
 class LLScrollContainer;
 
 struct ContainerViewRegistry : public LLChildRegistry<ContainerViewRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(ContainerViewRegistry);
+};
 
 class LLContainerView : public LLView
 {
diff --git a/indra/llui/llfunctorregistry.h b/indra/llui/llfunctorregistry.h
index f5364f48636d12c81e7e9fe46e6052a5fcc2ffa5..e43974bc52fa9d44324538d05de1fadbb17a1340 100644
--- a/indra/llui/llfunctorregistry.h
+++ b/indra/llui/llfunctorregistry.h
@@ -53,14 +53,8 @@
 template <typename FUNCTOR_TYPE>
 class LLFunctorRegistry : public LLSingleton<LLFunctorRegistry<FUNCTOR_TYPE> >
 {
-	friend class LLSingleton<LLFunctorRegistry>;
+	LLSINGLETON(LLFunctorRegistry);
 	LOG_CLASS(LLFunctorRegistry);
-private:
-	LLFunctorRegistry() : LOGFUNCTOR("LogFunctor"), DONOTHING("DoNothing")
-	{
-		mMap[LOGFUNCTOR] = log_functor;
-		mMap[DONOTHING] = do_nothing;
-	}
 
 public:
 	typedef FUNCTOR_TYPE ResponseFunctor;
@@ -124,6 +118,14 @@ class LLFunctorRegistry : public LLSingleton<LLFunctorRegistry<FUNCTOR_TYPE> >
 	FunctorMap mMap;
 };
 
+template <typename FUNCTOR_TYPE>
+LLFunctorRegistry<FUNCTOR_TYPE>::LLFunctorRegistry() :
+	LOGFUNCTOR("LogFunctor"), DONOTHING("DoNothing")
+{
+	mMap[LOGFUNCTOR] = log_functor;
+	mMap[DONOTHING] = do_nothing;
+}
+
 template <typename FUNCTOR_TYPE>
 class LLFunctorRegistration
 {
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index a245ebe1b9cce788732535aa26a5c8e8ba9aaee3..f772dbc6b49940921d246c99080753f49f773291 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -40,7 +40,9 @@ class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack>
 public:
 
 	struct LayoutStackRegistry : public LLChildRegistry<LayoutStackRegistry>
-	{};
+	{
+		LLSINGLETON_EMPTY_CTOR(LayoutStackRegistry);
+	};
 
 	struct Params : public LLInitParam::Block<Params, LLView::Params>
 	{
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 628dedb906ed4c2b871c24f7e32fca22079664ec..c7f7f6848cd7fa186e7564a365f6616af817026d 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -347,7 +347,9 @@ class LLMenuItemCheckGL
 
 // child widget registry
 struct MenuRegistry : public LLChildRegistry<MenuRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(MenuRegistry);
+};
 
 
 class LLMenuGL 
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 354add0b82a0e022bc8d64f8bb53d49c463bf48e..024332ee65c66fd624aa439ebdd4b68e6bd38c81 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -884,9 +884,9 @@ class LLNotifications :
 	public LLSingleton<LLNotifications>, 
 	public LLNotificationChannelBase
 {
+	LLSINGLETON(LLNotifications);
 	LOG_CLASS(LLNotifications);
 
-	friend class LLSingleton<LLNotifications>;
 public:
 
     // Needed to clear up RefCounted things prior to actual destruction
@@ -966,8 +966,6 @@ class LLNotifications :
 	bool isVisibleByRules(LLNotificationPtr pNotification);
 	
 private:
-	// we're a singleton, so we don't have a public constructor
-	LLNotifications();
 	/*virtual*/ void initSingleton();
 	
 	void loadPersistentNotifications();
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index c2185f24ded66e8c4b303eb0931bb86866980393..b8f47ef6badd427fdf00b03df3821278c99b0420 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -268,8 +268,9 @@ typedef boost::function<LLPanel* (void)> LLPanelClassCreatorFunc;
 class LLRegisterPanelClass
 :	public LLSingleton< LLRegisterPanelClass >
 {
+	LLSINGLETON_EMPTY_CTOR(LLRegisterPanelClass);
 public:
-	// reigister with either the provided builder, or the generic templated builder
+	// register with either the provided builder, or the generic templated builder
 	void addPanelClass(const std::string& tag,LLPanelClassCreatorFunc func)
 	{
 		mPanelClassesNames[tag] = func;
diff --git a/indra/llui/llresmgr.h b/indra/llui/llresmgr.h
index a652dcd2c06cf08bed409c7010a6d339ede7dc98..b19d8d40b89f48912284950d1c8bbe849304cbd7 100644
--- a/indra/llui/llresmgr.h
+++ b/indra/llui/llresmgr.h
@@ -42,9 +42,9 @@ enum LLLOCALE_ID
 
 class LLResMgr : public LLSingleton<LLResMgr>
 {
-public:
-	LLResMgr();
+	LLSINGLETON(LLResMgr);
 
+public:
 	void				setLocale( LLLOCALE_ID locale_id );
 	LLLOCALE_ID			getLocale() const						{ return mLocale; }
 
diff --git a/indra/llui/llscrollcontainer.h b/indra/llui/llscrollcontainer.h
index f64cf43a8ed48ce2c8863979535bdf4e3e5fd4b8..c4c4d0a136b7ba052bbccc951c7f49644a42a3ac 100644
--- a/indra/llui/llscrollcontainer.h
+++ b/indra/llui/llscrollcontainer.h
@@ -48,7 +48,9 @@ class LLUICtrlFactory;
  *****************************************************************************/
 
 struct ScrollContainerRegistry : public LLChildRegistry<ScrollContainerRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(ScrollContainerRegistry);
+};
 
 class LLScrollContainer : public LLUICtrl
 {
diff --git a/indra/llui/llspellcheck.h b/indra/llui/llspellcheck.h
index 5ecc9aa110648529ae0fb60752f79582c3ceb867..acac589e433dd8d33c452641c1638bb751199559 100644
--- a/indra/llui/llspellcheck.h
+++ b/indra/llui/llspellcheck.h
@@ -36,10 +36,8 @@ class Hunspell;
 
 class LLSpellChecker : public LLSingleton<LLSpellChecker>, public LLInitClass<LLSpellChecker>
 {
-	friend class LLSingleton<LLSpellChecker>;
+	LLSINGLETON(LLSpellChecker);
 	friend class LLInitClass<LLSpellChecker>;
-protected:
-	LLSpellChecker();
 	~LLSpellChecker();
 
 public:
diff --git a/indra/llui/llstatview.h b/indra/llui/llstatview.h
index bc78d3b5fdca9379bd0e8e1a01e0bea68fcafe1a..af4db7d7ea0a56f50ef8e64bf97e19637e477be4 100644
--- a/indra/llui/llstatview.h
+++ b/indra/llui/llstatview.h
@@ -35,7 +35,9 @@ class LLStatBar;
 
 // widget registrars
 struct StatViewRegistry : public LLChildRegistry<StatViewRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(StatViewRegistry);
+};
 
 class LLStatView : public LLContainerView
 {
diff --git a/indra/llui/lltextparser.h b/indra/llui/lltextparser.h
index 400aeeb8be78dd22d330a34f4b0a37dcf00fe890..3d71e40452d84342a708e0dd1db41553110432e5 100644
--- a/indra/llui/lltextparser.h
+++ b/indra/llui/lltextparser.h
@@ -37,14 +37,14 @@ class LLColor4;
 
 class LLTextParser : public LLSingleton<LLTextParser>
 {
+	LLSINGLETON(LLTextParser);
+
 public:
 	typedef enum e_condition_type { CONTAINS, MATCHES, STARTS_WITH, ENDS_WITH } EConditionType;
 	typedef enum e_highlight_type { PART, ALL } EHighlightType;
 	typedef enum e_highlight_position { WHOLE, START, MIDDLE, END } EHighlightPosition;
 	typedef enum e_dialog_action { ACTION_NONE, ACTION_CLOSE, ACTION_ADD, ACTION_COPY, ACTION_UPDATE } EDialogAction;
 
-	LLTextParser();
-
 	LLSD parsePartialLineHighlights(const std::string &text,const LLColor4 &color, EHighlightPosition part=WHOLE, S32 index=0);
 	bool parseFullLineHighlights(const std::string &text, LLColor4 *color);
 
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index fad127fc4cd440d980115bd66333c0ca2616d21b..0b1fbe536748946108178440b823c9421846c394 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -129,9 +129,10 @@ class LLInspector : public LLToolTip
 
 class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
 {
+	LLSINGLETON(LLToolTipMgr);
 	LOG_CLASS(LLToolTipMgr);
+
 public:
-	LLToolTipMgr();
 	void show(const LLToolTip::Params& params);
 	void show(const std::string& message);
 
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index 6a7a681d57a005775764cda908c343023439ea82..44472070cc4f4249d1dc1c7daebc21bcd4089f4f 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -38,7 +38,8 @@ class LLUIColor;
 
 class LLUIColorTable : public LLSingleton<LLUIColorTable>
 {
-LOG_CLASS(LLUIColorTable);
+	LLSINGLETON_EMPTY_CTOR(LLUIColorTable);
+	LOG_CLASS(LLUIColorTable);
 
 	// consider using sorted vector, can be much faster
 	typedef std::map<std::string, LLUIColor>  string_color_map_t;
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 99553ee0d26c701fb042895c54c15d6a7d987498..550bee5c709e7989e0506a3fa1ee3814faba1435 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -258,18 +258,25 @@ class LLUICtrl
 
 	class LLTextInputFilter : public LLQueryFilter, public LLSingleton<LLTextInputFilter>
 	{
+		LLSINGLETON_EMPTY_CTOR(LLTextInputFilter);
 		/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const 
 		{
 			return filterResult_t(view->isCtrl() && static_cast<const LLUICtrl *>(view)->acceptsTextInput(), TRUE);
 		}
 	};
-	
+
 	template <typename F, typename DERIVED> class CallbackRegistry : public LLRegistrySingleton<std::string, F, DERIVED >
 	{};	
 
-	class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>{};
+	class CommitCallbackRegistry : public CallbackRegistry<commit_callback_t, CommitCallbackRegistry>
+	{
+		LLSINGLETON_EMPTY_CTOR(CommitCallbackRegistry);
+	};
 	// the enable callback registry is also used for visiblity callbacks
-	class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>{};
+	class EnableCallbackRegistry : public CallbackRegistry<enable_callback_t, EnableCallbackRegistry>
+	{
+		LLSINGLETON_EMPTY_CTOR(EnableCallbackRegistry);
+	};
 		
 protected:
 
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index 3ce39c947f7e87f90fcc69f98f6aec82864b8dbf..0151c896a7406ec7fba217b526f014862441889e 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -57,22 +57,24 @@ class LLChildRegistry : public LLRegistrySingleton<std::string, LLWidgetCreatorF
 
 class LLDefaultChildRegistry : public LLChildRegistry<LLDefaultChildRegistry>
 {
-protected:
-	LLDefaultChildRegistry(){}
-	friend class LLSingleton<LLDefaultChildRegistry>;
+	LLSINGLETON_EMPTY_CTOR(LLDefaultChildRegistry);
 };
 
 // lookup widget name by type
 class LLWidgetNameRegistry 
 :	public LLRegistrySingleton<const std::type_info*, std::string, LLWidgetNameRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(LLWidgetNameRegistry);
+};
 
 // lookup function for generating empty param block by widget type
 // this is used for schema generation
 //typedef const LLInitParam::BaseBlock& (*empty_param_block_func_t)();
 //class LLDefaultParamBlockRegistry
 //:	public LLRegistrySingleton<const std::type_info*, empty_param_block_func_t, LLDefaultParamBlockRegistry>
-//{};
+//{
+//	LLSINGLETON(LLDefaultParamBlockRegistry);
+//};
 
 extern LLTrace::BlockTimerStatHandle FTM_WIDGET_SETUP;
 extern LLTrace::BlockTimerStatHandle FTM_WIDGET_CONSTRUCTION;
@@ -85,31 +87,15 @@ extern template class LLUICtrlFactory* LLSingleton<class LLUICtrlFactory>::getIn
 
 class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 {
-private:
-	friend class LLSingleton<LLUICtrlFactory>;
-	LLUICtrlFactory();
+	LLSINGLETON(LLUICtrlFactory);
 	~LLUICtrlFactory();
 
 	// only partial specialization allowed in inner classes, so use extra dummy parameter
 	template <typename PARAM_BLOCK, int DUMMY>
 	class ParamDefaults : public LLSingleton<ParamDefaults<PARAM_BLOCK, DUMMY> > 
 	{
+		LLSINGLETON(ParamDefaults);
 	public:
-		ParamDefaults()
-		{
-			// look up template file for this param block...
-			const std::string* param_block_tag = LLWidgetNameRegistry::instance().getValue(&typeid(PARAM_BLOCK));
-			if (param_block_tag)
-			{	// ...and if it exists, back fill values using the most specific template first
-				PARAM_BLOCK params;
-				LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, params);
-				mPrototype.fillFrom(params);
-			}
-			// recursively fill from base class param block
-			((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY>::instance().get());
-
-		}
-
 		const PARAM_BLOCK& get() { return mPrototype; }
 
 	private:
@@ -120,6 +106,7 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 	template<int DUMMY>
 	class ParamDefaults<LLInitParam::BaseBlock, DUMMY> : public LLSingleton<ParamDefaults<LLInitParam::BaseBlock, DUMMY> >
 	{
+		LLSINGLETON(ParamDefaults);
 	public:
 		const LLInitParam::BaseBlock& get() { return mBaseBlock; }
 	private:
@@ -297,6 +284,25 @@ class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
 	std::vector<std::string>	mFileNames;
 };
 
+template <typename PARAM_BLOCK, int DUMMY>
+LLUICtrlFactory::ParamDefaults<PARAM_BLOCK, DUMMY>::ParamDefaults()
+{
+	// look up template file for this param block...
+	const std::string* param_block_tag = LLWidgetNameRegistry::instance().getValue(&typeid(PARAM_BLOCK));
+	if (param_block_tag)
+	{	// ...and if it exists, back fill values using the most specific template first
+		PARAM_BLOCK params;
+		LLUICtrlFactory::loadWidgetTemplate(*param_block_tag, params);
+		mPrototype.fillFrom(params);
+	}
+	// recursively fill from base class param block
+	((typename PARAM_BLOCK::base_block_t&)mPrototype).fillFrom(ParamDefaults<typename PARAM_BLOCK::base_block_t, DUMMY>::instance().get());
+
+}
+
+template <int DUMMY>
+LLUICtrlFactory::ParamDefaults<LLInitParam::BaseBlock, DUMMY>::ParamDefaults() {}
+
 // this is here to make gcc happy with reference to LLUICtrlFactory
 template<typename DERIVED>
 template<typename T> 
diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h
index 24c3a2b513c3826fa11ffbd07976146f1f0e77c4..efafe543abc65278835b292d6195bdecc561221f 100644
--- a/indra/llui/llurlregistry.h
+++ b/indra/llui/llurlregistry.h
@@ -62,9 +62,9 @@ void LLUrlRegistryNullCallback(const std::string &url,
 ///
 class LLUrlRegistry : public LLSingleton<LLUrlRegistry>
 {
-public:
+	LLSINGLETON(LLUrlRegistry);
 	~LLUrlRegistry();
-
+public:
 	/// add a new Url handler to the registry (will be freed on destruction)
 	/// optionally force it to the front of the list, making it take
 	/// priority over other regular expression matches for URLs
@@ -89,9 +89,6 @@ class LLUrlRegistry : public LLSingleton<LLUrlRegistry>
 	bool isUrl(const LLWString &text);
 
 private:
-	LLUrlRegistry();
-	friend class LLSingleton<LLUrlRegistry>;
-
 	std::vector<LLUrlEntryBase *> mUrlEntry;
 	LLUrlEntryBase*	mUrlEntryTrusted;
 	LLUrlEntryBase*	mUrlEntryIcon;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 62c3f401bf9c9ce29cb1655a923e7120c306b640..2f27eebcd859181c8bc04b8e6ed4a2a8f6a0054b 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -1892,6 +1892,7 @@ class CompareByTabOrder
 
 class SortByTabOrder : public LLQuerySorter, public LLSingleton<SortByTabOrder>
 {
+	LLSINGLETON_EMPTY_CTOR(SortByTabOrder);
 	/*virtual*/ void sort(LLView * parent, LLView::child_list_t &children) const 
 	{
 		children.sort(CompareByTabOrder(parent->getTabOrder(), parent->getDefaultTabGroup()));
@@ -1915,6 +1916,7 @@ const LLViewQuery & LLView::getTabOrderQuery()
 // This class is only used internally by getFocusRootsQuery below. 
 class LLFocusRootsFilter : public LLQueryFilter, public LLSingleton<LLFocusRootsFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLFocusRootsFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const 
 	{
 		return filterResult_t(view->isCtrl() && view->isFocusRoot(), !view->isFocusRoot());
diff --git a/indra/llui/llviewereventrecorder.h b/indra/llui/llviewereventrecorder.h
index 375efcc3de870ab83ca2c8590fa651dafdebc18d..d1059d55deb75bdfecbc46b83cc44711e66ad013 100644
--- a/indra/llui/llviewereventrecorder.h
+++ b/indra/llui/llviewereventrecorder.h
@@ -44,13 +44,10 @@
 
 class LLViewerEventRecorder : public LLSingleton<LLViewerEventRecorder>
 {
-
- public:
-
-  LLViewerEventRecorder(); // TODO Protect constructor better if we can (not happy in private section) - could add a factory... - we are singleton
+  LLSINGLETON(LLViewerEventRecorder);
   ~LLViewerEventRecorder();
 
-
+ public:
   void updateMouseEventInfo(S32 local_x,S32 local_y, S32 global_x, S32 global_y,  std::string mName);
   void setMouseLocalCoords(S32 x,S32 y);
   void setMouseGlobalCoords(S32 x,S32 y);
diff --git a/indra/llui/llviewquery.h b/indra/llui/llviewquery.h
index 9044c4ff29c16d7d016e4f9853ff834ca67d9b9b..21bb1be26f8d5c86a17e19c569446d79ecbebf8d 100644
--- a/indra/llui/llviewquery.h
+++ b/indra/llui/llviewquery.h
@@ -54,31 +54,37 @@ class LLQuerySorter
 
 class LLLeavesFilter : public LLQueryFilter, public LLSingleton<LLLeavesFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLLeavesFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
 };
 
 class LLRootsFilter : public LLQueryFilter, public LLSingleton<LLRootsFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLRootsFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
 };
 
 class LLVisibleFilter : public LLQueryFilter, public LLSingleton<LLVisibleFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLVisibleFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
 };
 
 class LLEnabledFilter : public LLQueryFilter, public LLSingleton<LLEnabledFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLEnabledFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
 };
 
 class LLTabStopFilter : public LLQueryFilter, public LLSingleton<LLTabStopFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLTabStopFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
 };
 
 class LLCtrlFilter : public LLQueryFilter, public LLSingleton<LLCtrlFilter>
 {
+	LLSINGLETON_EMPTY_CTOR(LLCtrlFilter);
 	/*virtual*/ filterResult_t operator() (const LLView* const view, const viewList_t & children) const;
 };
 
diff --git a/indra/llui/llxuiparser.h b/indra/llui/llxuiparser.h
index ad2a39cab7f0082f84520bfc1bd0b8156c9bc1a1..b356cff98c7007a9259c4b96516d219581bdaf1d 100644
--- a/indra/llui/llxuiparser.h
+++ b/indra/llui/llxuiparser.h
@@ -41,7 +41,9 @@ class LLView;
 // lookup widget type by name
 class LLWidgetTypeRegistry
 :	public LLRegistrySingleton<std::string, const std::type_info*, LLWidgetTypeRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(LLWidgetTypeRegistry);
+};
 
 
 // global static instance for registering all widget types
@@ -51,7 +53,9 @@ typedef LLRegistry<std::string, LLWidgetCreatorFunc> widget_registry_t;
 
 class LLChildRegistryRegistry
 : public LLRegistrySingleton<const std::type_info*, widget_registry_t, LLChildRegistryRegistry>
-{};
+{
+	LLSINGLETON_EMPTY_CTOR(LLChildRegistryRegistry);
+};
 
 class LLXSDWriter : public LLInitParam::Parser
 {
diff --git a/indra/media_plugins/cef/windows_volume_catcher.cpp b/indra/media_plugins/cef/windows_volume_catcher.cpp
index 0cfb810906b578e4ae3466b32ca0a8c808dd9132..c9ea3ed5979af835b4a556e4a7ecac5fbd677d29 100644
--- a/indra/media_plugins/cef/windows_volume_catcher.cpp
+++ b/indra/media_plugins/cef/windows_volume_catcher.cpp
@@ -31,17 +31,16 @@
 #include "llsingleton.h"
 class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
 {
-friend LLSingleton<VolumeCatcherImpl>;
+	LLSINGLETON(VolumeCatcherImpl);
+	// This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
+	~VolumeCatcherImpl();
+
 public:
 
 	void setVolume(F32 volume);
 	void setPan(F32 pan);
 	
 private:
-	// This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
-	VolumeCatcherImpl();
-	~VolumeCatcherImpl();
-
 	typedef void (WINAPI *set_volume_func_t)(F32);
 	typedef void (WINAPI *set_mute_func_t)(bool);
 
diff --git a/indra/newview/llaccountingcostmanager.h b/indra/newview/llaccountingcostmanager.h
index f251ceffd47694742ea1cc671713a5b40ad61349..55e1d19f05f45a298f070bdc01c7108efe01d5bc 100644
--- a/indra/newview/llaccountingcostmanager.h
+++ b/indra/newview/llaccountingcostmanager.h
@@ -58,9 +58,9 @@ class LLAccountingCostObserver
 //===============================================================================
 class LLAccountingCostManager : public LLSingleton<LLAccountingCostManager>
 {
+	LLSINGLETON(LLAccountingCostManager);
+
 public:
-	//Ctor
-	LLAccountingCostManager();
 	//Store an object that will be eventually fetched
 	void addObject( const LLUUID& objectID );
 	//Request quotas for object list
diff --git a/indra/newview/llagentpicksinfo.h b/indra/newview/llagentpicksinfo.h
index abf7027ed22cadd79cc0a5c0ca4526415a796c5a..f981e08ff7715c6b7d60e602a9a2873d6b7db27f 100644
--- a/indra/newview/llagentpicksinfo.h
+++ b/indra/newview/llagentpicksinfo.h
@@ -36,14 +36,12 @@ struct LLAvatarPicks;
  */
 class LLAgentPicksInfo : public LLSingleton<LLAgentPicksInfo>
 {
+	LLSINGLETON(LLAgentPicksInfo);
+	virtual ~LLAgentPicksInfo();
+
 	class LLAgentPicksObserver;
 
 public:
-
-	LLAgentPicksInfo();
-	
-	virtual ~LLAgentPicksInfo();
-
 	/**
 	 * Requests number of picks from server. 
 	 * 
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index e01a28770e5ef0aa6ab7150c114a82e54e6279db..dde041e818fbcdce8521ca0a52c3fa83c3fbf6a6 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -42,9 +42,10 @@ class LLOutfitUnLockTimer;
 
 class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 {
+	LLSINGLETON(LLAppearanceMgr);
+	~LLAppearanceMgr();
 	LOG_CLASS(LLAppearanceMgr);
 
-	friend class LLSingleton<LLAppearanceMgr>;
 	friend class LLOutfitUnLockTimer;
 	
 public:
@@ -233,10 +234,6 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
     static void debugAppearanceUpdateCOF(const LLSD& content);
 
 	std::string		mAppearanceServiceURL;
-	
-protected:
-	LLAppearanceMgr();
-	~LLAppearanceMgr();
 
 private:
 
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index bddc50746a9bdc208e2be350b06fc7447efe55ff..d10f8388b11567e1b5f61a80cd57918402186363 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -383,6 +383,7 @@ const char* const VIEWER_WINDOW_CLASSNAME = "Second Life";
  */
 class LLDeferredTaskList: public LLSingleton<LLDeferredTaskList>
 {
+	LLSINGLETON_EMPTY_CTOR(LLDeferredTaskList);
 	LOG_CLASS(LLDeferredTaskList);
 
 	friend class LLAppViewer;
@@ -732,7 +733,7 @@ LLAppViewer::LLAppViewer()
 LLAppViewer::~LLAppViewer()
 {
 	delete mSettingsLocationList;
-	LLViewerEventRecorder::instance().~LLViewerEventRecorder();
+	LLViewerEventRecorder::deleteSingleton();
 
 	LLLoginInstance::instance().setUpdaterService(0);
 	
diff --git a/indra/newview/llattachmentsmgr.h b/indra/newview/llattachmentsmgr.h
index bb7d35edbcb740fab527b167831093b0f2a9acb5..a4ef762e8b1b07a02efb185426c766b31739cfd1 100644
--- a/indra/newview/llattachmentsmgr.h
+++ b/indra/newview/llattachmentsmgr.h
@@ -62,6 +62,9 @@ class LLViewerInventoryItem;
 //--------------------------------------------------------------------------------
 class LLAttachmentsMgr: public LLSingleton<LLAttachmentsMgr>
 {
+    LLSINGLETON(LLAttachmentsMgr);
+	virtual ~LLAttachmentsMgr();
+
 public:
     // Stores info for attachments that will be requested during idle.
 	struct AttachmentsInfo
@@ -72,9 +75,6 @@ class LLAttachmentsMgr: public LLSingleton<LLAttachmentsMgr>
 	};
 	typedef std::deque<AttachmentsInfo> attachments_vec_t;
 
-	LLAttachmentsMgr();
-	virtual ~LLAttachmentsMgr();
-
 	void addAttachmentRequest(const LLUUID& item_id,
                               const U8 attachment_pt,
                               const BOOL add);
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
index 9eecc2d9814911608793d5195a72a7e202e1cdaf..23cc3136468575a3ce1dce365cc4cb525c94c28e 100644
--- a/indra/newview/llautoreplace.h
+++ b/indra/newview/llautoreplace.h
@@ -191,6 +191,7 @@ class LLAutoReplaceSettings
  */
 class LLAutoReplace : public LLSingleton<LLAutoReplace>
 {
+    LLSINGLETON(LLAutoReplace);
 public:
     /// Callback that provides the hook for use in text entry methods
     void autoreplaceCallback(S32& replacement_start, S32& replacement_length, LLWString& replacement_string, S32& cursor_pos, const LLWString& input_text);
@@ -202,8 +203,6 @@ class LLAutoReplace : public LLSingleton<LLAutoReplace>
     void setSettings(const LLAutoReplaceSettings& settings);
 
 private:
-    friend class LLSingleton<LLAutoReplace>;
-    LLAutoReplace();
     /*virtual*/ void initSingleton();
 
     LLAutoReplaceSettings mSettings; ///< configuration information
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index a6e745448a98c921cd4a1aa46238d01b18251426..e4f9a338f2f5078c315d1e5a693884c16dfa52ab 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -689,6 +689,8 @@ namespace action_give_inventory
 
 	struct LLShareInfo : public LLSingleton<LLShareInfo>
 	{
+		LLSINGLETON_EMPTY_CTOR(LLShareInfo);
+	public:
 		std::vector<LLAvatarName> mAvatarNames;
 		uuid_vec_t mAvatarUuids;
 	};
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 5b5720f4ac8fd74887b723c5feefe9d36e940ae8..a1dacd1a270a201a13038786c9c71c489f221604 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -37,6 +37,8 @@ class LLAvatarName;
 
 class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
 {
+	LLSINGLETON(LLAvatarIconIDCache);
+
 public:
 	struct LLAvatarIconIDCacheItem
 	{
@@ -46,10 +48,6 @@ class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
 		bool expired();
 	};
 
-	LLAvatarIconIDCache()
-	:	mFilename("avatar_icons_cache.txt")
-	{}
-
 	void				load	();
 	void				save	();
 
@@ -64,6 +62,11 @@ class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
 	std::map<LLUUID,LLAvatarIconIDCacheItem> mCache;//we cache only LLUID and time
 };
 
+inline
+LLAvatarIconIDCache::LLAvatarIconIDCache()
+	:	mFilename("avatar_icons_cache.txt")
+{}
+
 namespace LLAvatarIconCtrlEnums
 {
 	enum ESymbolPos
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 1dcd2c9b907b674a1f80d1f442914d408bba0e9c..d5c5c75c6914d7a8942a5da13470af7a5ea0c0a8 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -187,13 +187,12 @@ class LLAvatarPropertiesObserver
 class LLAvatarPropertiesProcessor
 	: public LLSingleton<LLAvatarPropertiesProcessor>
 {
-public:
-	
-	LLAvatarPropertiesProcessor();
+	LLSINGLETON(LLAvatarPropertiesProcessor);
 	virtual ~LLAvatarPropertiesProcessor();
 
+public:
 	void addObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer);
-	
+
 	void removeObserver(const LLUUID& avatar_id, LLAvatarPropertiesObserver* observer);
 
 	// Request various types of avatar data.  Duplicate requests will be
diff --git a/indra/newview/llavatarrenderinfoaccountant.h b/indra/newview/llavatarrenderinfoaccountant.h
index 870ef4f394ac44870ad4b09472bad2e883422084..6b5fa7bc35d21c7b95ebabc06e66c9dd893f0beb 100644
--- a/indra/newview/llavatarrenderinfoaccountant.h
+++ b/indra/newview/llavatarrenderinfoaccountant.h
@@ -38,13 +38,13 @@ class LLViewerRegion;
 // that is sent to or fetched from regions.
 class LLAvatarRenderInfoAccountant : public LLSingleton<LLAvatarRenderInfoAccountant>
 {
+	LLSINGLETON(LLAvatarRenderInfoAccountant);
+	~LLAvatarRenderInfoAccountant();
+
   private:
 	LOG_CLASS(LLAvatarRenderInfoAccountant);
 
   public:
-	LLAvatarRenderInfoAccountant();
-	~LLAvatarRenderInfoAccountant();
-
 	void sendRenderInfoToRegion(LLViewerRegion * regionp);
 	void getRenderInfoFromRegion(LLViewerRegion * regionp);
 
diff --git a/indra/newview/llavatarrendernotifier.h b/indra/newview/llavatarrendernotifier.h
index 2a2704de28550719508abf44421039b50cbbcc34..bb82af560b92c9eb8f774015bf637295b3eac5b1 100644
--- a/indra/newview/llavatarrendernotifier.h
+++ b/indra/newview/llavatarrendernotifier.h
@@ -37,9 +37,9 @@ class LLViewerRegion;
 // reported that user's agent is too 'heavy' for their settings
 class LLAvatarRenderNotifier : public LLSingleton<LLAvatarRenderNotifier>
 {
-public:
-	LLAvatarRenderNotifier();
+	LLSINGLETON(LLAvatarRenderNotifier);
 
+public:
     void displayNotification(bool show_over_limit);
 	bool isNotificationVisible();
 
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index a5de8a53271dc434fa5cae04ad7ee59d1ce47705..8b9d0dda8b6ca2158b3e90bdec497039bc397fe6 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -43,6 +43,9 @@ namespace LLNotificationsUI
  */
 class LLChannelManager : public LLSingleton<LLChannelManager>
 {
+	LLSINGLETON(LLChannelManager);
+	virtual ~LLChannelManager();
+
 public:
 
 
@@ -65,9 +68,6 @@ class LLChannelManager : public LLSingleton<LLChannelManager>
 		}
 	};
 
-	LLChannelManager();	
-	virtual ~LLChannelManager();
-
 	// On LoginCompleted - show StartUp toast
 	void onLoginCompleted();
 	// removes a channel intended for the startup toast and allows other channels to show their toasts
diff --git a/indra/newview/llchicletbar.cpp b/indra/newview/llchicletbar.cpp
index 254e3f61a81a8763829cda1ca716c64d2e36a8a9..c4f959bfa9c03f27d59ef26ec23b92dfab65d520 100644
--- a/indra/newview/llchicletbar.cpp
+++ b/indra/newview/llchicletbar.cpp
@@ -38,7 +38,7 @@ namespace
 	const std::string& PANEL_CHICLET_NAME	= "chiclet_list_panel";
 }
 
-LLChicletBar::LLChicletBar(const LLSD&)
+LLChicletBar::LLChicletBar()
 :	mChicletPanel(NULL),
 	mToolbarStack(NULL)
 {
diff --git a/indra/newview/llchicletbar.h b/indra/newview/llchicletbar.h
index 956c82cb77026036fbd0cc486d46fc51a8833828..6c521dc1d504f176b0f3cfc367ed10ece092af14 100644
--- a/indra/newview/llchicletbar.h
+++ b/indra/newview/llchicletbar.h
@@ -38,8 +38,9 @@ class LLChicletBar
 	: public LLSingleton<LLChicletBar>
 	, public LLPanel
 {
+	LLSINGLETON(LLChicletBar);
 	LOG_CLASS(LLChicletBar);
-	friend class LLSingleton<LLChicletBar>;
+
 public:
 
 	BOOL postBuild();
@@ -82,8 +83,6 @@ class LLChicletBar
 	void fitWithTopInfoBar();
 
 protected:
-	LLChicletBar(const LLSD& key = LLSD());
-
 	LLChicletPanel* 	mChicletPanel;
 	LLLayoutStack*		mToolbarStack;
 };
diff --git a/indra/newview/llconversationlog.h b/indra/newview/llconversationlog.h
index 62f08144b9e94d763072393e49f637cca5a1092d..035cbcb9451e7eb41be8747176b15ece750f84eb 100644
--- a/indra/newview/llconversationlog.h
+++ b/indra/newview/llconversationlog.h
@@ -109,7 +109,7 @@ class LLConversation
 
 class LLConversationLog : public LLSingleton<LLConversationLog>, LLIMSessionObserver
 {
-	friend class LLSingleton<LLConversationLog>;
+	LLSINGLETON(LLConversationLog);
 public:
 
 	void removeConversation(const LLConversation& conversation);
@@ -157,7 +157,6 @@ class LLConversationLog : public LLSingleton<LLConversationLog>, LLIMSessionObse
 
 private:
 
-	LLConversationLog();
 	virtual ~LLConversationLog()
 	{
 		if (mAvatarNameCacheConnection.connected())
diff --git a/indra/newview/lldaycyclemanager.h b/indra/newview/lldaycyclemanager.h
index 3d2144960da160d3429ec6b039f7db70f554911a..04db9d5dacedeaa6675f69fafbb19a590dc1ae02 100644
--- a/indra/newview/lldaycyclemanager.h
+++ b/indra/newview/lldaycyclemanager.h
@@ -40,6 +40,7 @@
  */
 class LLDayCycleManager : public LLSingleton<LLDayCycleManager>
 {
+	LLSINGLETON_EMPTY_CTOR(LLDayCycleManager);
 	LOG_CLASS(LLDayCycleManager);
 
 public:
@@ -66,7 +67,6 @@ class LLDayCycleManager : public LLSingleton<LLDayCycleManager>
 	boost::signals2::connection setModifyCallback(const modify_signal_t::slot_type& cb);
 
 private:
-	friend class LLSingleton<LLDayCycleManager>;
 	/*virtual*/ void initSingleton();
 
 	void loadAllPresets();
diff --git a/indra/newview/lldeferredsounds.h b/indra/newview/lldeferredsounds.h
index bf1eb629570b8be297fc82325821094e8d05444b..33f02b35215b2e219df508369e62b561b9569fb6 100644
--- a/indra/newview/lldeferredsounds.h
+++ b/indra/newview/lldeferredsounds.h
@@ -33,7 +33,7 @@ struct SoundData;
 
 class LLDeferredSounds : public LLSingleton<LLDeferredSounds>
 {
-private:
+	LLSINGLETON_EMPTY_CTOR(LLDeferredSounds);
 	std::vector<SoundData> soundVector;
 public:
 	//Add sounds to be played once progress bar is hidden (such as after teleport or loading screen)
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
index 7836e2cb94e578251a6804a544db9cc2a2d51d09..7d2712eec708f611338e0bae252facb0a078f8a8 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.cpp
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -69,8 +69,7 @@ BOOL LLDoNotDisturbNotificationStorageTimer::tick()
 }
 
 LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
-	: LLSingleton<LLDoNotDisturbNotificationStorage>()
-	, LLNotificationStorage("")
+	: LLNotificationStorage("")
     , mDirty(false)
 {
     nameToPayloadParameterMap[toastName] = "SESSION_ID";
diff --git a/indra/newview/lldonotdisturbnotificationstorage.h b/indra/newview/lldonotdisturbnotificationstorage.h
index 6e68b0d1be1013bec70431a7f010bda5e33ddb53..e6cb7835e311b4277df3daf26c2363c3e8d29b62 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.h
+++ b/indra/newview/lldonotdisturbnotificationstorage.h
@@ -47,14 +47,14 @@ class LLDoNotDisturbNotificationStorageTimer : public LLEventTimer
 
 class LLDoNotDisturbNotificationStorage : public LLSingleton<LLDoNotDisturbNotificationStorage>, public LLNotificationStorage
 {
+	LLSINGLETON(LLDoNotDisturbNotificationStorage);
+	~LLDoNotDisturbNotificationStorage();
+
 	LOG_CLASS(LLDoNotDisturbNotificationStorage);
 public:
     static const char * toastName;
     static const char * offerName;
 
-	LLDoNotDisturbNotificationStorage();
-	~LLDoNotDisturbNotificationStorage();
-
 	void initialize();
     bool getDirty();
     void resetDirty();
diff --git a/indra/newview/llenvmanager.h b/indra/newview/llenvmanager.h
index c7877303fc1a507ed2b234b781d950b5706edade..6a0a267f4e355b0d78945f2469c8dc423eca9ae3 100644
--- a/indra/newview/llenvmanager.h
+++ b/indra/newview/llenvmanager.h
@@ -162,14 +162,13 @@ class LLEnvPrefs
  */
 class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
 {
+	LLSINGLETON(LLEnvManagerNew);
 	LOG_CLASS(LLEnvManagerNew);
 public:
 	typedef boost::signals2::signal<void()> prefs_change_signal_t;
 	typedef boost::signals2::signal<void()> region_settings_change_signal_t;
 	typedef boost::signals2::signal<void(bool)> region_settings_applied_signal_t;
 
-	LLEnvManagerNew();
-
 	// getters to access user env. preferences
 	bool getUseRegionSettings() const;
 	bool getUseDayCycle() const;
@@ -231,7 +230,6 @@ class LLEnvManagerNew : public LLSingleton<LLEnvManagerNew>
 	void onRegionSettingsApplyResponse(bool ok);
 
 private:
-	friend class LLSingleton<LLEnvManagerNew>;
 	/*virtual*/ void initSingleton();
 
 	void loadUserPrefs();
diff --git a/indra/newview/llestateinfomodel.h b/indra/newview/llestateinfomodel.h
index fcfbd1ce7db2c9c0abd88ae6c33353948ac52141..e7a6a2a725c9f1d04407e4aaf52a3ef914132d30 100644
--- a/indra/newview/llestateinfomodel.h
+++ b/indra/newview/llestateinfomodel.h
@@ -38,6 +38,7 @@ class LLMessageSystem;
  */
 class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
 {
+	LLSINGLETON(LLEstateInfoModel);
 	LOG_CLASS(LLEstateInfoModel);
 
 public:
@@ -73,11 +74,8 @@ class LLEstateInfoModel : public LLSingleton<LLEstateInfoModel>
 protected:
 	typedef std::vector<std::string> strings_t;
 
-	friend class LLSingleton<LLEstateInfoModel>;
 	friend class LLDispatchEstateUpdateInfo;
 
-	LLEstateInfoModel();
-
 	/// refresh model with data from the incoming server message
 	void update(const strings_t& strings);
 
diff --git a/indra/newview/llexperiencelog.h b/indra/newview/llexperiencelog.h
index ac227db336c5ac761b76da771feda8ce57af7a83..09e0cd8821bd6fd3ae96a52f17f052c16b726300 100644
--- a/indra/newview/llexperiencelog.h
+++ b/indra/newview/llexperiencelog.h
@@ -33,6 +33,7 @@
 
 class LLExperienceLog : public LLSingleton<LLExperienceLog>
 {
+	LLSINGLETON(LLExperienceLog);
 public:
 	typedef boost::signals2::signal<void(LLSD&)> 
 		callback_signal_t;
@@ -62,7 +63,6 @@ class LLExperienceLog : public LLSingleton<LLExperienceLog>
 	void setEventsToSave(LLSD new_events){mEventsToSave = new_events; }
 	bool isNotExpired(std::string& date);
 protected:
-	LLExperienceLog();
 	void handleExperienceMessage(LLSD& message);
 
 
@@ -81,7 +81,6 @@ class LLExperienceLog : public LLSingleton<LLExperienceLog>
 	bool mNotifyNewEvent;
 
 	friend class LLExperienceLogDispatchHandler;
-	friend class LLSingleton<LLExperienceLog>;
 };
 
 
diff --git a/indra/newview/llfacebookconnect.h b/indra/newview/llfacebookconnect.h
index 2a2cdb54991d432344412720500b5f2a9bb1b353..7fd4070f54dfeb872b98ffc0b2e322fe3d9e44f7 100644
--- a/indra/newview/llfacebookconnect.h
+++ b/indra/newview/llfacebookconnect.h
@@ -43,6 +43,8 @@ class LLEventPump;
  */
 class LLFacebookConnect : public LLSingleton<LLFacebookConnect>
 {
+	LLSINGLETON(LLFacebookConnect);
+	~LLFacebookConnect() {};
 	LOG_CLASS(LLFacebookConnect);
 public:
     enum EConnectionState
@@ -86,10 +88,7 @@ class LLFacebookConnect : public LLSingleton<LLFacebookConnect>
     void openFacebookWeb(std::string url);
 
 private:
-	friend class LLSingleton<LLFacebookConnect>;
 
-	LLFacebookConnect();
-	~LLFacebookConnect() {};
  	std::string getFacebookConnectURL(const std::string& route = "", bool include_read_from_master = false);
 
     EConnectionState mConnectionState;
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index b1e5edd372b87dcf0a77ee0550f4ee552e071a80..cac32c7f2a6dfce51212e59a0e7e6cf08b28d753 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -174,6 +174,7 @@ class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
 class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
 	, public LLDestroyClass<LLFavoritesOrderStorage>
 {
+	LLSINGLETON(LLFavoritesOrderStorage);
 	LOG_CLASS(LLFavoritesOrderStorage);
 public:
 	/**
@@ -222,10 +223,6 @@ class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
 	std::map<LLUUID,std::string> mFavoriteNames;
 
 private:
-	friend class LLSingleton<LLFavoritesOrderStorage>;
-	LLFavoritesOrderStorage() : mIsDirty(false), mUpdateRequired(false){ load(); }
-	~LLFavoritesOrderStorage() {}
-    
 	/**
 	 * Removes sort indexes for items which are not in Favorites bar for now.
 	 */
@@ -275,4 +272,10 @@ class LLFavoritesOrderStorage : public LLSingleton<LLFavoritesOrderStorage>
 	};
 
 };
+
+inline
+LLFavoritesOrderStorage::LLFavoritesOrderStorage() :
+	mIsDirty(false), mUpdateRequired(false)
+{ load(); }
+
 #endif // LL_LLFAVORITESBARCTRL_H
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index c3d87cea0bf8a7c0f3f42261ccbfc3b99200e895..54bd07329a9541fd8ea5176610724c99fb31ea44 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -97,20 +97,10 @@ class LLFeatureList
 
 class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManager>
 {
-public:
-	LLFeatureManager()
-	:	LLFeatureList("default"),
-
-		mInited(FALSE),
-		mTableVersion(0),
-		mSafe(FALSE),
-		mGPUClass(GPU_CLASS_UNKNOWN),
-		mExpectedGLVersion(0.f),
-		mGPUSupported(FALSE)		
-	{
-	}
+	LLSINGLETON(LLFeatureManager);
 	~LLFeatureManager() {cleanupFeatureTables();}
 
+public:
 	// initialize this by loading feature table and gpu table
 	void init();
 
@@ -181,5 +171,17 @@ class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManag
 	BOOL		mGPUSupported;
 };
 
+inline
+LLFeatureManager::LLFeatureManager()
+:	LLFeatureList("default"),
+
+	mInited(FALSE),
+	mTableVersion(0),
+	mSafe(FALSE),
+	mGPUClass(GPU_CLASS_UNKNOWN),
+	mExpectedGLVersion(0.f),
+	mGPUSupported(FALSE)
+{
+}
 
 #endif // LL_LLFEATUREMANAGER_H
diff --git a/indra/newview/llflickrconnect.h b/indra/newview/llflickrconnect.h
index 0155804da0f95e766822374b5e416435de6a9728..43cadca708957bcc170c502ef55e760435222e7c 100644
--- a/indra/newview/llflickrconnect.h
+++ b/indra/newview/llflickrconnect.h
@@ -43,6 +43,8 @@ class LLEventPump;
  */
 class LLFlickrConnect : public LLSingleton<LLFlickrConnect>
 {
+	LLSINGLETON(LLFlickrConnect);
+	~LLFlickrConnect() {};
 	LOG_CLASS(LLFlickrConnect);
 public:
     enum EConnectionState
@@ -80,10 +82,7 @@ class LLFlickrConnect : public LLSingleton<LLFlickrConnect>
     void openFlickrWeb(std::string url);
 
 private:
-	friend class LLSingleton<LLFlickrConnect>;
 
-	LLFlickrConnect();
-	~LLFlickrConnect() {};
  	std::string getFlickrConnectURL(const std::string& route = "", bool include_read_from_master = false);
 
     EConnectionState mConnectionState;
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index ae3800e17badd84b298351641c0280a708419142..2fb912a93048b87340a4b6e4e8d32e0a230f14f6 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -37,9 +37,10 @@ class LLFriendCardsManager
 	: public LLSingleton<LLFriendCardsManager>
 	, public LLFriendObserver
 {
+	LLSINGLETON(LLFriendCardsManager);
+	~LLFriendCardsManager();
 	LOG_CLASS(LLFriendCardsManager);
 
-	friend class LLSingleton<LLFriendCardsManager>;
 	friend class CreateFriendCardCallback;
 
 public:
@@ -97,8 +98,6 @@ class LLFriendCardsManager
 private:
 	typedef boost::function<void()> callback_t;
 
-	LLFriendCardsManager();
-	~LLFriendCardsManager();
 
 
 	/**
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 26a5924ec307f4c499ad792586267f890e8b1fe4..402bdf6039952df5e1391eaddaf190df64b74514 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -51,6 +51,8 @@ class LLGestureManagerObserver
 
 class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchItemsObserver
 {
+	LLSINGLETON(LLGestureMgr);
+	~LLGestureMgr();
 public:
 
 	typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t;
@@ -58,8 +60,6 @@ class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchIt
 	typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
 	typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
 
-	LLGestureMgr();
-	~LLGestureMgr();
 
 	void init();
 
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index e5ce76803582042cf1915ec41a9db05c303bf25d..940ef6eea13af48a80782c117585e3aed2235b8c 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -348,6 +348,8 @@ struct LLRoleActionSet
 
 class LLGroupMgr : public LLSingleton<LLGroupMgr>
 {
+	LLSINGLETON(LLGroupMgr);
+	~LLGroupMgr();
 	LOG_CLASS(LLGroupMgr);
 	
 public:
@@ -369,8 +371,6 @@ class LLGroupMgr : public LLSingleton<LLGroupMgr>
 
 
 public:
-	LLGroupMgr();
-	~LLGroupMgr();
 
 	void addObserver(LLGroupMgrObserver* observer);
 	void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
diff --git a/indra/newview/llhudmanager.h b/indra/newview/llhudmanager.h
index 9c5d49decd0aff979431310167fdacb95fcc520e..7782739690dca1e83e31da5120262d70e4870c19 100644
--- a/indra/newview/llhudmanager.h
+++ b/indra/newview/llhudmanager.h
@@ -36,10 +36,10 @@ class LLMessageSystem;
 
 class LLHUDManager : public LLSingleton<LLHUDManager>
 {
-public:
-	LLHUDManager();
+	LLSINGLETON(LLHUDManager);
 	~LLHUDManager();
 
+public:
 	LLHUDEffect *createViewerEffect(const U8 type, BOOL send_to_sim = TRUE, BOOL originated_here = TRUE);
 
 	void updateEffects();
diff --git a/indra/newview/llimagefiltersmanager.h b/indra/newview/llimagefiltersmanager.h
index 4751933065bfa9c8fa9635d3a5f550e10238da0d..f1ed3cf1c395cdbac8a695ba45942fcdcf34e886 100644
--- a/indra/newview/llimagefiltersmanager.h
+++ b/indra/newview/llimagefiltersmanager.h
@@ -34,6 +34,8 @@
 
 class LLImageFiltersManager : public LLSingleton<LLImageFiltersManager>
 {
+	LLSINGLETON(LLImageFiltersManager);
+	~LLImageFiltersManager();
 	LOG_CLASS(LLImageFiltersManager);
 public:
     const std::vector<std::string> getFiltersList() const;
@@ -43,10 +45,7 @@ class LLImageFiltersManager : public LLSingleton<LLImageFiltersManager>
 	void loadAllFilters();
 	void loadFiltersFromDir(const std::string& dir);
     
-    friend class LLSingleton<LLImageFiltersManager>;
 	/*virtual*/ void initSingleton();
-	LLImageFiltersManager();
-	~LLImageFiltersManager();
     
 	// List of filters : first is the user friendly localized name, second is the xml file name
     std::map<std::string,std::string> mFiltersList;
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index d4bea1e44300d3d44c5535ed2e2f7e0a4f307738..da40ac83931f38e3258516b4412e8732ac562052 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -62,6 +62,7 @@ class LLSessionTimeoutTimer : public LLEventTimer
  */
 class LLIMModel :  public LLSingleton<LLIMModel>
 {
+	LLSINGLETON(LLIMModel);
 public:
 
 	struct LLIMSession : public boost::signals2::trackable
@@ -152,7 +153,6 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 	};
 	
 
-	LLIMModel();
 
 	/** Session id to session object */
 	std::map<LLUUID, LLIMSession*> mId2SessionMap;
@@ -313,6 +313,7 @@ class LLIMSessionObserver
 
 class LLIMMgr : public LLSingleton<LLIMMgr>
 {
+	LLSINGLETON(LLIMMgr);
 	friend class LLIMModel;
 
 public:
@@ -323,8 +324,6 @@ class LLIMMgr : public LLSingleton<LLIMMgr>
 		INVITATION_TYPE_IMMEDIATE = 2
 	};
 
-	LLIMMgr();
-	virtual ~LLIMMgr() {};
 
 	// Add a message to a session. The session can keyed to sesion id
 	// or agent id.
diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
index 013a5a7629afe0e0631d9440d8d76713c662162c..495180f087a50097dfb5ba052085baf71a1e5938 100644
--- a/indra/newview/llinventoryicon.cpp
+++ b/indra/newview/llinventoryicon.cpp
@@ -46,8 +46,7 @@ struct IconEntry : public LLDictionaryEntry
 class LLIconDictionary : public LLSingleton<LLIconDictionary>,
 						 public LLDictionary<LLInventoryType::EIconName, IconEntry>
 {
-public:
-	LLIconDictionary();
+	LLSINGLETON(LLIconDictionary);
 };
 
 typedef LLPointer<LLUIImage> LLUIImagePtr;
diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h
index 19fbfc2ed3b3e40b2f285f38b31c57d484200d20..00d2908c1b52775af1b626e734cd949f5de37458 100644
--- a/indra/newview/llinventorymodelbackgroundfetch.h
+++ b/indra/newview/llinventorymodelbackgroundfetch.h
@@ -43,9 +43,9 @@
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 class LLInventoryModelBackgroundFetch : public LLSingleton<LLInventoryModelBackgroundFetch>
 {
-public:
-	LLInventoryModelBackgroundFetch();
+	LLSINGLETON(LLInventoryModelBackgroundFetch);
 	~LLInventoryModelBackgroundFetch();
+public:
 
 	// Start and stop background breadth-first fetching of inventory contents.
 	// This gets triggered when performing a filter-search.
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 9fef42c5df11996246dd882ba1c4718f11533cb5..1cecbabd3b5302f1850af6e0eb1dfee636e3ea3c 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -103,6 +103,7 @@ class LLLocationHistoryItem {
 
 class LLLocationHistory: public LLSingleton<LLLocationHistory>
 {
+	LLSINGLETON(LLLocationHistory);
 	LOG_CLASS(LLLocationHistory);
 
 public:
@@ -117,7 +118,6 @@ class LLLocationHistory: public LLSingleton<LLLocationHistory>
 	typedef boost::function<void(EChangeType event)>			history_changed_callback_t;
 	typedef boost::signals2::signal<void(EChangeType event)>	history_changed_signal_t;
 	
-	LLLocationHistory();
 	
 	void					addItem(const LLLocationHistoryItem& item);
 	bool					touchItem(const LLLocationHistoryItem& item);
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 639641d1c25bf07c71e75322bba7a6724034558a..00c029d79b02018b07ff17c05cdb3ae827173e41 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -132,15 +132,9 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
 
 class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
 {
-public:
-	LLLogChatTimeScanner()
-	{
-		// Note, date/time facets will be destroyed by string streams
-		mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
-		mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
-		mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
-	}
+	LLSINGLETON(LLLogChatTimeScanner);
 
+public:
 	date getTodayPacificDate()
 	{
 		typedef	boost::date_time::local_adjustor<ptime, -8, no_dst> pst;
@@ -205,6 +199,15 @@ class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
 	std::stringstream mTimeStream;
 };
 
+inline
+LLLogChatTimeScanner::LLLogChatTimeScanner()
+{
+	// Note, date/time facets will be destroyed by string streams
+	mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
+	mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
+	mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
+}
+
 LLLogChat::save_history_signal_t * LLLogChat::sSaveHistorySignal = NULL;
 
 std::map<LLUUID,LLLoadHistoryThread *> LLLogChat::sLoadHistoryThreads;
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index c6773bbf6807ad635273ea4cf8620b7a14384d0b..282ddc1cea2d824f073b92f0701325009b73794a 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -40,12 +40,12 @@ class LLUpdaterService;
 // negotiate user authentication attempts.
 class LLLoginInstance : public LLSingleton<LLLoginInstance>
 {
+	LLSINGLETON(LLLoginInstance);
+	~LLLoginInstance();
+
 public:
 	class Disposable;
 
-	LLLoginInstance();
-	~LLLoginInstance();
-
 	void connect(LLPointer<LLCredential> credentials); // Connect to the current grid choice.
 	void connect(const std::string& uri, LLPointer<LLCredential> credentials);	// Connect to the given uri.
 	void reconnect(); // reconnect using the current credentials.
diff --git a/indra/newview/llmainlooprepeater.h b/indra/newview/llmainlooprepeater.h
index f84c0ca94c2d1b4c812533d655e689a357c275a8..2ec3a74e4ae3bc4a446182cc444c5d654cd044d6 100644
--- a/indra/newview/llmainlooprepeater.h
+++ b/indra/newview/llmainlooprepeater.h
@@ -43,9 +43,8 @@
 class LLMainLoopRepeater:
 	public LLSingleton<LLMainLoopRepeater>
 {
+	LLSINGLETON(LLMainLoopRepeater);
 public:
-	LLMainLoopRepeater(void);
-	
 	// Start the repeater service.
 	void start(void);
 	
diff --git a/indra/newview/llmarketplacefunctions.h b/indra/newview/llmarketplacefunctions.h
index 9d795c6ced836e1c1287382168d739efeb82b0a6..ec312baca395b65116c27286cfe73c53ec7f3229 100644
--- a/indra/newview/llmarketplacefunctions.h
+++ b/indra/newview/llmarketplacefunctions.h
@@ -86,11 +86,10 @@ namespace MarketplaceFetchCodes
 class LLMarketplaceInventoryImporter
 	: public LLSingleton<LLMarketplaceInventoryImporter>
 {
+	LLSINGLETON(LLMarketplaceInventoryImporter);
 public:
 	static void update();
-	
-	LLMarketplaceInventoryImporter();
-	
+
 	typedef boost::signals2::signal<void (bool)> status_changed_signal_t;
 	typedef boost::signals2::signal<void (U32, const LLSD&)> status_report_signal_t;
 
@@ -181,10 +180,11 @@ class LLSLMDeleteListingsResponder;
 class LLMarketplaceData
     : public LLSingleton<LLMarketplaceData>
 {
-    friend class LLSingleton < LLMarketplaceData > ;
+    LLSINGLETON(LLMarketplaceData);
+    virtual ~LLMarketplaceData();
 
 public:
-	friend class LLSLMGetMerchantResponder;
+    friend class LLSLMGetMerchantResponder;
     friend class LLSLMGetListingsResponder;
     friend class LLSLMCreateListingsResponder;
     friend class LLSLMGetListingResponder;
@@ -242,9 +242,6 @@ class LLMarketplaceData
     void decrementValidationWaiting(const LLUUID& folder_id, S32 count = 1);
 
 private:
-    LLMarketplaceData();
-    virtual ~LLMarketplaceData();
-
     // Modify Marketplace data set  : each method returns true if the function succeeds, false if error
     // Used internally only by SLM Responders when data are received from the SLM Server
     bool addListing(const LLUUID& folder_id, S32 listing_id, const LLUUID& version_id, bool is_listed, const std::string& edit_url, S32 count);
diff --git a/indra/newview/llmaterialmgr.h b/indra/newview/llmaterialmgr.h
index 36dd0904b6dad1791a554048c06b3121a42aa8ef..60b58d17de7156d0234e6a5a39e4fd33e7e0ee7b 100644
--- a/indra/newview/llmaterialmgr.h
+++ b/indra/newview/llmaterialmgr.h
@@ -38,9 +38,7 @@ class LLViewerRegion;
 
 class LLMaterialMgr : public LLSingleton<LLMaterialMgr>
 {
-	friend class LLSingleton<LLMaterialMgr>;
-protected:
-	LLMaterialMgr();
+	LLSINGLETON(LLMaterialMgr);
 	virtual ~LLMaterialMgr();
 
 public:
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
index 8879cfd7fbf8ed593b4ba58df20737bbdf3766c0..63d97f6ac2da08e6103d6567b1bfb2158946e0f0 100644
--- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
@@ -41,8 +41,7 @@
 #include "llpathfindingnavmeshstatus.h"
 #include "llviewerregion.h"
 
-LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh() 
-	: LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>(),
+LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh() :
 	mIsInitialized(false),
 	mCanRebakeRegion(false),
 	mRebakeNavMeshMode(kRebakeNavMesh_Default),
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.h b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
index 7b1d2873bad0933e54a0823ddbd7da84f11b6f48..649a387dd3c70db09d278e574021d8833a8bc90c 100644
--- a/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
@@ -37,6 +37,8 @@ class LLPathfindingNavMeshStatus;
 
 class LLMenuOptionPathfindingRebakeNavmesh : public LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>
 {
+	LLSINGLETON(LLMenuOptionPathfindingRebakeNavmesh);
+	virtual ~LLMenuOptionPathfindingRebakeNavmesh();
 	LOG_CLASS(LLMenuOptionPathfindingRebakeNavmesh);
 
 public:
@@ -49,8 +51,6 @@ class LLMenuOptionPathfindingRebakeNavmesh : public LLSingleton<LLMenuOptionPath
 		kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
 	} ERebakeNavMeshMode;
 
-	LLMenuOptionPathfindingRebakeNavmesh();
-	virtual ~LLMenuOptionPathfindingRebakeNavmesh();
 
 	void               initialize();
 	void               quit();
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index 63d1a81ca6ec7d9a7675c157f2ec0ca4b0ef7b29..4ceddc97fd81f3d00d7fe58215a8b5817d181af7 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -71,6 +71,8 @@ class LLMute
 
 class LLMuteList : public LLSingleton<LLMuteList>
 {
+	LLSINGLETON(LLMuteList);
+	~LLMuteList();
 public:
 	// reasons for auto-unmuting a resident
 	enum EAutoReason 
@@ -81,8 +83,6 @@ class LLMuteList : public LLSingleton<LLMuteList>
 		AR_COUNT			// enum count
 	};
 
-	LLMuteList();
-	~LLMuteList();
 
 	void addObserver(LLMuteListObserver* observer);
 	void removeObserver(LLMuteListObserver* observer);
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 3f74c9d51bea6c36b748d475cc0e79bcdbadb541..a44c6dd6997e315dd6722579861276ac8b3d8896 100755
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -85,12 +85,12 @@ class LLPullButton: public LLButton
 class LLNavigationBar
 	:	public LLPanel, public LLSingleton<LLNavigationBar>, private LLDestroyClass<LLNavigationBar>
 {
+	LLSINGLETON(LLNavigationBar);
+	virtual ~LLNavigationBar();
 	LOG_CLASS(LLNavigationBar);
 	friend class LLDestroyClass<LLNavigationBar>;
-	
+
 public:
-	LLNavigationBar();
-	virtual ~LLNavigationBar();
 	
 	/*virtual*/ void	draw();
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/llnotificationmanager.h b/indra/newview/llnotificationmanager.h
index f37c6b833c0b406827d1427ca03c09488089a919..52c79cc68970d172a37dd3a9abe6c3e9f8625396 100644
--- a/indra/newview/llnotificationmanager.h
+++ b/indra/newview/llnotificationmanager.h
@@ -46,11 +46,11 @@ class LLToast;
  */
 class LLNotificationManager : public LLSingleton<LLNotificationManager>
 {
-	typedef std::pair<std::string, LLEventHandler*> eventhandlers;
-public:	
-	LLNotificationManager();	
+	LLSINGLETON(LLNotificationManager);
 	virtual ~LLNotificationManager();
+	typedef std::pair<std::string, LLEventHandler*> eventhandlers;
 
+public:
 	//TODO: make private
 	// this method initialize handlers' map for different types of notifications
 	void init(void);
diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp
index 3418b33d377897bbe88faca093017a802c6d5082..35fdfa88bb52d39ca7d313949cc16d4d01f5d764 100644
--- a/indra/newview/llnotificationstorage.cpp
+++ b/indra/newview/llnotificationstorage.cpp
@@ -45,9 +45,10 @@ typedef boost::function<LLNotificationResponderInterface * (const LLSD& pParams)
 
 class LLResponderRegistry : public LLRegistrySingleton<std::string, responder_constructor_t, LLResponderRegistry>
 {
-    public:
-        template<typename RESPONDER_TYPE> static LLNotificationResponderInterface * create(const LLSD& pParams);
-        LLNotificationResponderInterface * createResponder(const std::string& pNotificationName, const LLSD& pParams);
+    LLSINGLETON_EMPTY_CTOR(LLResponderRegistry);
+public:
+    template<typename RESPONDER_TYPE> static LLNotificationResponderInterface * create(const LLSD& pParams);
+    LLNotificationResponderInterface * createResponder(const std::string& pNotificationName, const LLSD& pParams);
 };
 
 template<typename RESPONDER_TYPE> LLNotificationResponderInterface * LLResponderRegistry::create(const LLSD& pParams)
diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h
index 87d4b0c998d060d870aa9dfbfa704b985892f508..77041db68d094c475df3615fac856a6024f0f475 100644
--- a/indra/newview/lloutfitobserver.h
+++ b/indra/newview/lloutfitobserver.h
@@ -36,10 +36,10 @@
  */
 class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitObserver>
 {
-public:
+	LLSINGLETON(LLOutfitObserver);
 	virtual ~LLOutfitObserver();
 
-	friend class LLSingleton<LLOutfitObserver>;
+public:
 
 	virtual void changed(U32 mask);
 
@@ -58,7 +58,6 @@ class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitO
 	void addOutfitLockChangedCallback(const signal_t::slot_type& cb) { mOutfitLockChanged.connect(cb); }
 
 protected:
-	LLOutfitObserver();
 
 	/** Get a version of an inventory category specified by its UUID */
 	static S32 getCategoryVersion(const LLUUID& cat_id);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index b7e1b2d3a432e8441f665bc60c9657dfdfc8c516..f2d43a103772fd81506033d369b972e79ae80e21 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -117,8 +117,7 @@ class LLEditWearableDictionary : public LLSingleton<LLEditWearableDictionary>
         //--------------------------------------------------------------------
         // Constructors and Destructors
         //--------------------------------------------------------------------
-public:
-        LLEditWearableDictionary();
+        LLSINGLETON(LLEditWearableDictionary);
         virtual ~LLEditWearableDictionary();
         
         //--------------------------------------------------------------------
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 3de9dc2f8058defc0b7559078c4ac8aace2e2970..fe0608d5441594e958547554213017c52425502d 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -104,7 +104,9 @@ class LLTeleportHistoryFlatItem : public LLPanel
 ////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////
 
-class LLTeleportHistoryFlatItemStorage: public LLSingleton<LLTeleportHistoryFlatItemStorage> {
+class LLTeleportHistoryFlatItemStorage: public LLSingleton<LLTeleportHistoryFlatItemStorage>
+{
+	LLSINGLETON_EMPTY_CTOR(LLTeleportHistoryFlatItemStorage);
 protected:
 	typedef std::vector< LLHandle<LLTeleportHistoryFlatItem> > flat_item_list_t;
 
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
index 274d70c6f9d3619a59c78c60e6cd2526ee398621..78dd99702906f95f2f32bc6aa0045d838ceb6dbb 100644
--- a/indra/newview/llpaneltopinfobar.h
+++ b/indra/newview/llpaneltopinfobar.h
@@ -37,6 +37,8 @@ class LLParcelChangeObserver;
 
 class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>, private LLDestroyClass<LLPanelTopInfoBar>
 {
+	LLSINGLETON(LLPanelTopInfoBar);
+	~LLPanelTopInfoBar();
 	LOG_CLASS(LLPanelTopInfoBar);
 
 	friend class LLDestroyClass<LLPanelTopInfoBar>;
@@ -44,9 +46,6 @@ class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>,
 public:
 	typedef boost::signals2::signal<void ()> resize_signal_t;
 
-	LLPanelTopInfoBar();
-	~LLPanelTopInfoBar();
-
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void draw();
 
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
index 711a869e823d478ac8a7946f7c94e2d0e98e3b67..cb4c07a417bb3d9ab012f8d9a54f9f7975431443 100644
--- a/indra/newview/llpathfindingmanager.cpp
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -144,8 +144,7 @@ typedef boost::shared_ptr<LinksetsResponder> LinksetsResponderPtr;
 // LLPathfindingManager
 //---------------------------------------------------------------------------
 
-LLPathfindingManager::LLPathfindingManager()
-	: LLSingleton<LLPathfindingManager>(),
+LLPathfindingManager::LLPathfindingManager():
 	mNavMeshMap(),
 	mAgentStateSignal()
 {
diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h
index e8fad590ba7c9e8cb0a04fe7d87d82be37a3e970..a44cd892da61c4d45028bb4680fa76c27f2e3bc6 100644
--- a/indra/newview/llpathfindingmanager.h
+++ b/indra/newview/llpathfindingmanager.h
@@ -48,6 +48,9 @@ class LinksetsResponder;
 
 class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
 {
+	LLSINGLETON(LLPathfindingManager);
+	virtual ~LLPathfindingManager();
+
 	friend class LLNavMeshSimStateChangeNode;
 	friend class NavMeshStatusResponder;
 	friend class LLAgentStateChangeNode;
@@ -60,9 +63,6 @@ class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
 		kRequestError
 	} ERequestStatus;
 
-	LLPathfindingManager();
-	virtual ~LLPathfindingManager();
-
 	void initSystem();
 	void quitSystem();
 
diff --git a/indra/newview/llpathfindingpathtool.cpp b/indra/newview/llpathfindingpathtool.cpp
index 006755e20b1c48952c202a5f83e7f8270ba5efb3..318732510117efed78fa0bdbf3376db23c1de13d 100644
--- a/indra/newview/llpathfindingpathtool.cpp
+++ b/indra/newview/llpathfindingpathtool.cpp
@@ -46,7 +46,6 @@
 
 LLPathfindingPathTool::LLPathfindingPathTool()
 	: LLTool(PATH_TOOL_NAME),
-	LLSingleton<LLPathfindingPathTool>(),
 	mFinalPathData(),
 	mTempPathData(),
 	mPathResult(LLPathingLib::LLPL_NO_PATH),
diff --git a/indra/newview/llpathfindingpathtool.h b/indra/newview/llpathfindingpathtool.h
index 97284265f19b0d4327de284b82b0dee170fbe41c..88cb3a15f89e1e2131d4f613b1ebd746712a9616 100644
--- a/indra/newview/llpathfindingpathtool.h
+++ b/indra/newview/llpathfindingpathtool.h
@@ -36,6 +36,9 @@
 
 class LLPathfindingPathTool : public LLTool, public LLSingleton<LLPathfindingPathTool>
 {
+	LLSINGLETON(LLPathfindingPathTool);
+	virtual ~LLPathfindingPathTool();
+
 public:
 	typedef enum
 	{
@@ -59,9 +62,6 @@ class LLPathfindingPathTool : public LLTool, public LLSingleton<LLPathfindingPat
 		kCharacterTypeD
 	} ECharacterType;
 
-	LLPathfindingPathTool();
-	virtual ~LLPathfindingPathTool();
-
 	typedef boost::function<void (void)>         path_event_callback_t;
 	typedef boost::signals2::signal<void (void)> path_event_signal_t;
 	typedef boost::signals2::connection          path_event_slot_t;
diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp
index 9c0222d0bcef0eee343455e4dac879cc81043ad8..264382ae8280be64506e877e961f2d57073d1ea3 100644
--- a/indra/newview/llpersistentnotificationstorage.cpp
+++ b/indra/newview/llpersistentnotificationstorage.cpp
@@ -36,9 +36,8 @@
 #include "llscriptfloater.h"
 #include "llviewermessage.h"
 #include "llviewernetwork.h"
-LLPersistentNotificationStorage::LLPersistentNotificationStorage()
-	: LLSingleton<LLPersistentNotificationStorage>()
-	, LLNotificationStorage("")
+LLPersistentNotificationStorage::LLPersistentNotificationStorage():
+	  LLNotificationStorage("")
 	, mLoaded(false)
 {
 }
diff --git a/indra/newview/llpersistentnotificationstorage.h b/indra/newview/llpersistentnotificationstorage.h
index bf0306380e7bd1f3c9658222451d4ea5fa48659d..40c9923c7412036cc0b26cf1cb5ab860e0cb4acc 100644
--- a/indra/newview/llpersistentnotificationstorage.h
+++ b/indra/newview/llpersistentnotificationstorage.h
@@ -45,10 +45,10 @@ class LLSD;
 
 class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage>, public LLNotificationStorage
 {
+	LLSINGLETON(LLPersistentNotificationStorage);
+	~LLPersistentNotificationStorage();
 	LOG_CLASS(LLPersistentNotificationStorage);
 public:
-	LLPersistentNotificationStorage();
-	~LLPersistentNotificationStorage();
 
 	void saveNotifications();
 	void loadNotifications();
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
index 21f9885f2786c9d4ec95c0db2462a62488982e50..0014e32267ffd026a9c698e29a3dd20d8b2fb7e6 100644
--- a/indra/newview/llpresetsmanager.h
+++ b/indra/newview/llpresetsmanager.h
@@ -46,6 +46,9 @@ enum EDefaultOptions
 
 class LLPresetsManager : public LLSingleton<LLPresetsManager>
 {
+	LLSINGLETON(LLPresetsManager);
+	~LLPresetsManager();
+
 public:
 
 	typedef std::list<std::string> preset_name_list_t;
@@ -67,9 +70,6 @@ class LLPresetsManager : public LLSingleton<LLPresetsManager>
 
 	preset_name_list_t mPresetNames;
 
-	LLPresetsManager();
-	~LLPresetsManager();
-
 	preset_list_signal_t mPresetListChangeSignal;
 
   private:
diff --git a/indra/newview/llproductinforequest.h b/indra/newview/llproductinforequest.h
index 75dbf220d17cdf140bba4aea684e9b3a101293a7..d1036374e8008302ff83f8b8d68ee12f4d7eaade 100644
--- a/indra/newview/llproductinforequest.h
+++ b/indra/newview/llproductinforequest.h
@@ -41,12 +41,11 @@
  */
 class LLProductInfoRequestManager : public LLSingleton<LLProductInfoRequestManager>
 {
+	LLSINGLETON(LLProductInfoRequestManager);
 public:
-	LLProductInfoRequestManager();
 	std::string getDescriptionForSku(const std::string& sku);
 
 private:
-	friend class LLSingleton<LLProductInfoRequestManager>;	
 	/* virtual */ void initSingleton();
 
     void getLandDescriptionsCoro(std::string url);
diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h
index d0d637686749fe2490ea5ef5525c56b07f4eb9d8..c7aaf604f5dd554ce64d4d60f47f2cf5c80cbf70 100644
--- a/indra/newview/llrecentpeople.h
+++ b/indra/newview/llrecentpeople.h
@@ -50,6 +50,7 @@ class LLDate;
  */
 class LLRecentPeople: public LLSingleton<LLRecentPeople>, public LLOldEvents::LLSimpleListener
 {
+	LLSINGLETON_EMPTY_CTOR(LLRecentPeople);
 	LOG_CLASS(LLRecentPeople);
 public:
 	typedef boost::signals2::signal<void ()> signal_t;
diff --git a/indra/newview/llregioninfomodel.h b/indra/newview/llregioninfomodel.h
index d22a0de4635bfd14abd5e7f862aeb86073fd26aa..ea9640efda99e81461f2df77fa5c3fee7df53b4e 100644
--- a/indra/newview/llregioninfomodel.h
+++ b/indra/newview/llregioninfomodel.h
@@ -36,6 +36,7 @@ class LLMessageSystem;
  */
 class LLRegionInfoModel : public LLSingleton<LLRegionInfoModel>
 {
+	LLSINGLETON(LLRegionInfoModel);
 	LOG_CLASS(LLRegionInfoModel);
 
 public:
@@ -73,10 +74,8 @@ class LLRegionInfoModel : public LLSingleton<LLRegionInfoModel>
 	std::string	mSimType;
 
 protected:
-	friend class LLSingleton<LLRegionInfoModel>;
 	friend class LLViewerRegion;
 
-	LLRegionInfoModel();
 
 	/**
 	 * Refresh model with data from the incoming server message.
diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h
index cb5af50c5f083e737a7f5aab4a693b18fa466794..5b0d1891378fbbbb4975e6010e13c691952972ff 100644
--- a/indra/newview/llremoteparcelrequest.h
+++ b/indra/newview/llremoteparcelrequest.h
@@ -74,9 +74,10 @@ class LLRemoteParcelInfoObserver
 
 class LLRemoteParcelInfoProcessor : public LLSingleton<LLRemoteParcelInfoProcessor>
 {
-public:
+	LLSINGLETON_EMPTY_CTOR(LLRemoteParcelInfoProcessor);
 	virtual ~LLRemoteParcelInfoProcessor() {}
 
+public:
 	void addObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer);
 	void removeObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer);
 
diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h
index 5223a314f39b392b3c74cdd5d29a6eaec6d42011..2ac958e7b831781ed54a730f70d9c92969c0f688 100644
--- a/indra/newview/llrootview.h
+++ b/indra/newview/llrootview.h
@@ -32,7 +32,9 @@
 #include "lltooltip.h"
 
 class LLRootViewRegistry : public LLChildRegistry<LLRootViewRegistry>
-{};
+{
+	LLSINGLETON(LLRootViewRegistry);
+};
 
 class LLRootView : public LLView
 {
diff --git a/indra/newview/llscenemonitor.h b/indra/newview/llscenemonitor.h
index 2b6ea57b96016a88663da97aa9865d0e399ee141..7cd531bd34667c510e492f3d396ba63226e792b1 100644
--- a/indra/newview/llscenemonitor.h
+++ b/indra/newview/llscenemonitor.h
@@ -39,10 +39,10 @@ class LLViewerTexture;
 
 class LLSceneMonitor : public LLSingleton<LLSceneMonitor>
 {
+	LLSINGLETON(LLSceneMonitor);
+	~LLSceneMonitor();
 	LOG_CLASS(LLSceneMonitor);
 public:
-	LLSceneMonitor();
-	~LLSceneMonitor();
 
 	void freezeAvatar(LLCharacter* avatarp);
 	void setDebugViewerVisible(bool visible);
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index 70451194b38bbde051a7f5c3a7b1a9193db1d5d8..c0b84abdcb1f9eb6123a6b2524828f92914dddd7 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -41,6 +41,7 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
 	// *TODO
 	// LLScriptFloaterManager and LLScriptFloater will need some refactoring after we 
 	// know how script notifications should look like.
+	LLSINGLETON_EMPTY_CTOR(LLScriptFloaterManager);
 public:
 
 	typedef enum e_object_type
diff --git a/indra/newview/llsearchhistory.h b/indra/newview/llsearchhistory.h
index ade81675c21ac3560c7645c8ec43d64b9c4e9409..5aab5e6765ce4df17da7fdbb7911dfe289f89c3c 100644
--- a/indra/newview/llsearchhistory.h
+++ b/indra/newview/llsearchhistory.h
@@ -37,6 +37,7 @@
  */
 class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyClass<LLSearchHistory>
 {
+	LLSINGLETON(LLSearchHistory);
 	friend class LLDestroyClass<LLSearchHistory>;
 public:
 
@@ -72,7 +73,6 @@ class LLSearchHistory : public LLSingleton<LLSearchHistory>, private LLDestroyCl
 	 */
 	void addEntry(const std::string& search_text);
 
-	LLSearchHistory();
 
 	/**
 	 * Class for storing data about single search request.
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index bc50e443f80035b09cd354f691d871e9f0ccc2a1..c167ecd2360f65d75fe67bf0beabfa7bc385cc21 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -388,6 +388,9 @@ struct LLSelectGetFirstTest;
 
 class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
 {
+	LLSINGLETON(LLSelectMgr);
+	~LLSelectMgr();
+
 public:
 	static BOOL					sRectSelectInclusive;	// do we need to surround an object to pick it?
 	static BOOL					sRenderHiddenSelections;	// do we show selection silhouettes that are occluded?
@@ -413,9 +416,6 @@ class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
 	LLCachedControl<bool>					mDebugSelectMgr;
 
 public:
-	LLSelectMgr();
-	~LLSelectMgr();
-
 	static void cleanupGlobals();
 
 	// LLEditMenuHandler interface
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 5cff70f37767cdf42aace17853c62923a548f2b0..617bae39844c3a3880031ab703ed7f87ea3ba8cf 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -341,20 +341,18 @@ class LLIMSpeakerMgr : public LLSpeakerMgr
 
 class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
 {
+	LLSINGLETON(LLActiveSpeakerMgr);
 	LOG_CLASS(LLActiveSpeakerMgr);
 
-public:
-	LLActiveSpeakerMgr();
 protected:
 	virtual void updateSpeakerList();
 };
 
 class LLLocalSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLLocalSpeakerMgr>
 {
-	LOG_CLASS(LLLocalSpeakerMgr);
-public:
-	LLLocalSpeakerMgr();
+	LLSINGLETON(LLLocalSpeakerMgr);
 	~LLLocalSpeakerMgr ();
+	LOG_CLASS(LLLocalSpeakerMgr);
 protected:
 	virtual void updateSpeakerList();
 };
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
index 78fe7863c8090226f197d9267ea4649e48a01e4f..5ca1d4b4a57d597c558f4594052f70ed31acacb3 100644
--- a/indra/newview/llspeakingindicatormanager.cpp
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -48,6 +48,8 @@
  */
 class SpeakingIndicatorManager : public LLSingleton<SpeakingIndicatorManager>, LLVoiceClientParticipantObserver
 {
+	LLSINGLETON(SpeakingIndicatorManager);
+	~SpeakingIndicatorManager();
 	LOG_CLASS(SpeakingIndicatorManager);
 public:
 
@@ -91,10 +93,6 @@ class SpeakingIndicatorManager : public LLSingleton<SpeakingIndicatorManager>, L
 	typedef speaking_indicators_mmap_t::const_iterator indicator_const_iterator;
 	typedef std::pair<indicator_const_iterator, indicator_const_iterator> indicator_range_t;
 
-	friend class LLSingleton<SpeakingIndicatorManager>;
-	SpeakingIndicatorManager();
-	~SpeakingIndicatorManager();
-
 	/**
 	 * Callback to determine when voice channel is changed.
 	 *
diff --git a/indra/newview/llstylemap.h b/indra/newview/llstylemap.h
index 8aa0af535c38f9aa062db679b52a6cb7da2d9c33..96b392059372bf38463a5b32c875fff1f0a678e5 100644
--- a/indra/newview/llstylemap.h
+++ b/indra/newview/llstylemap.h
@@ -39,6 +39,7 @@ typedef std::map<LLUUID, LLStyle::Params> style_map_t;
 
 class LLStyleMap : public LLSingleton<LLStyleMap>
 {
+	LLSINGLETON_EMPTY_CTOR(LLStyleMap);
 public:
 	// Just like the [] accessor but it will add the entry in if it doesn't exist.
 	const LLStyle::Params &lookupAgent(const LLUUID &source); 
diff --git a/indra/newview/llsyntaxid.h b/indra/newview/llsyntaxid.h
index 0afa6dc04ba2868e21f7600351991fea1a0c83ae..1360b3e042efc43b716d67d5341179ef00714e55 100644
--- a/indra/newview/llsyntaxid.h
+++ b/indra/newview/llsyntaxid.h
@@ -38,9 +38,9 @@ class fetchKeywordsFileResponder;
 
 class LLSyntaxIdLSL : public LLSingleton<LLSyntaxIdLSL>
 {
-	friend class LLSingleton<LLSyntaxIdLSL>;
+	LLSINGLETON(LLSyntaxIdLSL);
 	friend class fetchKeywordsFileResponder;
-	
+
 private:
     std::set<std::string> mInflightFetches;
 	typedef boost::signals2::signal<void()> syntax_id_changed_signal_t;
@@ -67,7 +67,6 @@ class LLSyntaxIdLSL : public LLSingleton<LLSyntaxIdLSL>
 	LLSD			mKeywordsXml;
 	
 public:
-	LLSyntaxIdLSL();
 	void initialize();
 	bool keywordFetchInProgress();
 	LLSD getKeywordsXML() const { return mKeywordsXml; };
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index e9c29c39bf3e945d91a57f4260d8ad705919f56d..db0ccdda59cec04280062ed2f148131c152df4c6 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -73,6 +73,8 @@ class LLTeleportHistoryItem
  */
 class LLTeleportHistory: public LLSingleton<LLTeleportHistory>
 {
+	LLSINGLETON(LLTeleportHistory);
+	~LLTeleportHistory();
 	LOG_CLASS(LLTeleportHistory);
 
 public:
@@ -81,9 +83,6 @@ class LLTeleportHistory: public LLSingleton<LLTeleportHistory>
 	typedef boost::function<void()>				history_callback_t;
 	typedef boost::signals2::signal<void()>		history_signal_t;
 	
-	LLTeleportHistory();
-	~LLTeleportHistory();
-
 	/**
 	 * Go back in the history.
 	 */
diff --git a/indra/newview/llteleporthistorystorage.h b/indra/newview/llteleporthistorystorage.h
index cf4c85a9910106a91c9f69be4cfe62dea049cb0a..946ac0af1aaed473bb4fd6e1adce22ae1a985708 100644
--- a/indra/newview/llteleporthistorystorage.h
+++ b/indra/newview/llteleporthistorystorage.h
@@ -68,6 +68,8 @@ class LLTeleportHistoryPersistentItem
  */
 class LLTeleportHistoryStorage: public LLSingleton<LLTeleportHistoryStorage>
 {
+	LLSINGLETON(LLTeleportHistoryStorage);
+	~LLTeleportHistoryStorage();
 	LOG_CLASS(LLTeleportHistoryStorage);
 
 public:
@@ -78,9 +80,6 @@ class LLTeleportHistoryStorage: public LLSingleton<LLTeleportHistoryStorage>
 	typedef boost::function<void(S32 removed_index)>		history_callback_t;
 	typedef boost::signals2::signal<void(S32 removed_index)>	history_signal_t;
 
-	LLTeleportHistoryStorage();
-	~LLTeleportHistoryStorage();
-
 	/**
 	 * @return history items.
 	 */
diff --git a/indra/newview/lltextureatlasmanager.h b/indra/newview/lltextureatlasmanager.h
index b643056198d9a2278969a8461e25c7f50848ab7a..1b8df708c6299abfb79bdb42e6da5bb76f693fa7 100644
--- a/indra/newview/lltextureatlasmanager.h
+++ b/indra/newview/lltextureatlasmanager.h
@@ -85,12 +85,11 @@ class LLTextureAtlasSlot : public LLRefCount
 
 class LLTextureAtlasManager : public LLSingleton<LLTextureAtlasManager>
 {
-private:
+	LLSINGLETON(LLTextureAtlasManager);
+	~LLTextureAtlasManager();
 	typedef std::list<LLPointer<LLTextureAtlas> > ll_texture_atlas_list_t ;
 
 public:
-	LLTextureAtlasManager();
-	~LLTextureAtlasManager();
 
 	LLPointer<LLTextureAtlasSlot> reserveAtlasSlot(S32 sub_texture_size, S8 ncomponents, 
 		LLSpatialGroup* groupp, LLViewerTexture* imagep) ;
diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h
index 2ec6911de91e4520a1b461f6e3347d8009decf3d..c108d8325681b0f54317f5d5899f05444bcb5ae7 100644
--- a/indra/newview/lltoolbrush.h
+++ b/indra/newview/lltoolbrush.h
@@ -43,10 +43,10 @@ class LLViewerRegion;
 
 class LLToolBrushLand : public LLTool, public LLEditMenuHandler, public LLSingleton<LLToolBrushLand>
 {
+	LLSINGLETON(LLToolBrushLand);
 	typedef std::set<LLViewerRegion*> region_list_t;
 
 public:
-	LLToolBrushLand();
 	
 	// x,y in window coords, 0,0 = left,bot
 	virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index 2b4fa757f671e96c3dbf183400f2650c6361b9ca..d9adec82b48a32b8bb42591139463ff4cb18bea4 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -683,7 +683,7 @@ LLToolCompGun::LLToolCompGun()
 	: LLToolComposite(std::string("Mouselook"))
 {
 	mGun = new LLToolGun(this);
-	mGrab = new LLToolGrab(this);
+	mGrab = new LLToolGrabBase(this);
 	mNull = sNullTool;
 
 	setCurrentTool(mGun);
diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h
index e75d3c22e28fb116af78f1106518b8601a57468f..86506f725ef4a93fa3563955759efa453589bd6c 100644
--- a/indra/newview/lltoolcomp.h
+++ b/indra/newview/lltoolcomp.h
@@ -103,9 +103,9 @@ class LLToolComposite : public LLTool
 
 class LLToolCompInspect : public LLToolComposite, public LLSingleton<LLToolCompInspect>
 {
-public:
-	LLToolCompInspect();
+	LLSINGLETON(LLToolCompInspect);
 	virtual ~LLToolCompInspect();
+public:
 
 	// Overridden from LLToolComposite
     virtual BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
@@ -128,9 +128,9 @@ class LLToolCompInspect : public LLToolComposite, public LLSingleton<LLToolCompI
 
 class LLToolCompTranslate : public LLToolComposite, public LLSingleton<LLToolCompTranslate>
 {
-public:
-	LLToolCompTranslate();
+	LLSINGLETON(LLToolCompTranslate);
 	virtual ~LLToolCompTranslate();
+public:
 
 	// Overridden from LLToolComposite
 	virtual BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
@@ -149,9 +149,9 @@ class LLToolCompTranslate : public LLToolComposite, public LLSingleton<LLToolCom
 
 class LLToolCompScale : public LLToolComposite, public LLSingleton<LLToolCompScale>
 {
-public:
-	LLToolCompScale();
+	LLSINGLETON(LLToolCompScale);
 	virtual ~LLToolCompScale();
+public:
 
 	// Overridden from LLToolComposite
     virtual BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
@@ -171,9 +171,9 @@ class LLToolCompScale : public LLToolComposite, public LLSingleton<LLToolCompSca
 
 class LLToolCompRotate : public LLToolComposite, public LLSingleton<LLToolCompRotate>
 {
-public:
-	LLToolCompRotate();
+	LLSINGLETON(LLToolCompRotate);
 	virtual ~LLToolCompRotate();
+public:
 
 	// Overridden from LLToolComposite
     virtual BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
@@ -194,9 +194,9 @@ class LLToolCompRotate : public LLToolComposite, public LLSingleton<LLToolCompRo
 
 class LLToolCompCreate : public LLToolComposite, public LLSingleton<LLToolCompCreate>
 {
-public:
-	LLToolCompCreate();
+	LLSINGLETON(LLToolCompCreate);
 	virtual ~LLToolCompCreate();
+public:
 
 	// Overridden from LLToolComposite
     virtual BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
@@ -214,14 +214,14 @@ class LLToolCompCreate : public LLToolComposite, public LLSingleton<LLToolCompCr
 // LLToolCompGun
 
 class LLToolGun;
-class LLToolGrab;
+class LLToolGrabBase;
 class LLToolSelect;
 
 class LLToolCompGun : public LLToolComposite, public LLSingleton<LLToolCompGun>
 {
-public:
-	LLToolCompGun();
+	LLSINGLETON(LLToolCompGun);
 	virtual ~LLToolCompGun();
+public:
 
 	// Overridden from LLToolComposite
     virtual BOOL			handleHover(S32 x, S32 y, MASK mask);
@@ -237,7 +237,7 @@ class LLToolCompGun : public LLToolComposite, public LLSingleton<LLToolCompGun>
 
 protected:
 	LLToolGun*			mGun;
-	LLToolGrab*			mGrab;
+	LLToolGrabBase*		mGrab;
 	LLTool*				mNull;
 };
 
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 63be1ef09b2b94beb88421c02d152139540f7b6b..766046785b6cd13ac7e0ddc0d45a4528faeb6f7a 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -43,11 +43,10 @@ class LLPickInfo;
 
 class LLToolDragAndDrop : public LLTool, public LLSingleton<LLToolDragAndDrop>
 {
+	LLSINGLETON(LLToolDragAndDrop);
 public:
 	typedef boost::signals2::signal<void ()> enddrag_signal_t;
 
-	LLToolDragAndDrop();
-
 	// overridden from LLTool
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
@@ -281,8 +280,8 @@ class LLToolDragAndDrop : public LLTool, public LLSingleton<LLToolDragAndDrop>
 	class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>,
 									public LLDictionary<EDragAndDropType, DragAndDropEntry>
 	{
+		LLSINGLETON(LLDragAndDropDictionary);
 	public:
-		LLDragAndDropDictionary();
 		dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target);
 	};
 };
diff --git a/indra/newview/lltoolface.h b/indra/newview/lltoolface.h
index 7eb13b0fbcf2c4edf6a9969e7a20eb12ade009c2..e4b8ae12b87d4a62e95e727feee1527acc97b149 100644
--- a/indra/newview/lltoolface.h
+++ b/indra/newview/lltoolface.h
@@ -35,9 +35,9 @@ class LLPickInfo;
 class LLToolFace
 :	public LLTool, public LLSingleton<LLToolFace>
 {
-public:
-	LLToolFace();
+	LLSINGLETON(LLToolFace);
 	virtual ~LLToolFace();
+public:
 
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleDoubleClick(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h
index d23eb2cce63196a4b92a6a877df0539912f4298b..cfc235b6c2a411fba999d95e0de805f7fb13b532 100644
--- a/indra/newview/lltoolfocus.h
+++ b/indra/newview/lltoolfocus.h
@@ -34,9 +34,9 @@ class LLPickInfo;
 class LLToolCamera
 :	public LLTool, public LLSingleton<LLToolCamera>
 {
-public:
-	LLToolCamera();
+	LLSINGLETON(LLToolCamera);
 	virtual ~LLToolCamera();
+public:
 
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index c0ca4d7a9a4737fa316e3622e3f5cbf577f124b6..ed32e584a5aa86691a594e6ad3418f0795dc773b 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -69,7 +69,7 @@ extern BOOL gDebugClicks;
 //
 // Methods
 //
-LLToolGrab::LLToolGrab( LLToolComposite* composite )
+LLToolGrabBase::LLToolGrabBase( LLToolComposite* composite )
 :	LLTool( std::string("Grab"), composite ),
 	mMode( GRAB_INACTIVE ),
 	mVerticalDragging( FALSE ),
@@ -88,12 +88,12 @@ LLToolGrab::LLToolGrab( LLToolComposite* composite )
 	mHideBuildHighlight(FALSE)
 { }
 
-LLToolGrab::~LLToolGrab()
+LLToolGrabBase::~LLToolGrabBase()
 { }
 
 
 // virtual
-void LLToolGrab::handleSelect()
+void LLToolGrabBase::handleSelect()
 {
 	if(gFloaterTools)
 	{
@@ -106,7 +106,7 @@ void LLToolGrab::handleSelect()
 	gGrabBtnSpin = FALSE;
 }
 
-void LLToolGrab::handleDeselect()
+void LLToolGrabBase::handleDeselect()
 {
 	if( hasMouseCapture() )
 	{
@@ -123,7 +123,7 @@ void LLToolGrab::handleDeselect()
 
 }
 
-BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleDoubleClick(S32 x, S32 y, MASK mask)
 {
 	if (gDebugClicks)
 	{
@@ -133,7 +133,7 @@ BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask)
 	return FALSE;
 }
 
-BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	if (gDebugClicks)
 	{
@@ -152,7 +152,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask)
 	return TRUE;
 }
 
-void LLToolGrab::pickCallback(const LLPickInfo& pick_info)
+void LLToolGrabBase::pickCallback(const LLPickInfo& pick_info)
 {
 	LLToolGrab::getInstance()->mGrabPick = pick_info;
 	LLViewerObject	*objectp = pick_info.getObject();
@@ -182,7 +182,7 @@ void LLToolGrab::pickCallback(const LLPickInfo& pick_info)
 	}
 }
 
-BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
+BOOL LLToolGrabBase::handleObjectHit(const LLPickInfo& info)
 {
 	mGrabPick = info;
 	LLViewerObject* objectp = mGrabPick.getObject();
@@ -315,7 +315,7 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
 }
 
 
-void LLToolGrab::startSpin()
+void LLToolGrabBase::startSpin()
 {
 	LLViewerObject* objectp = mGrabPick.getObject();
 	if (!objectp)
@@ -339,7 +339,7 @@ void LLToolGrab::startSpin()
 }
 
 
-void LLToolGrab::stopSpin()
+void LLToolGrabBase::stopSpin()
 {
 	mSpinGrabbing = FALSE;
 
@@ -373,7 +373,7 @@ void LLToolGrab::stopSpin()
 }
 
 
-void LLToolGrab::startGrab()
+void LLToolGrabBase::startGrab()
 {
 	// Compute grab_offset in the OBJECT's root's coordinate frame
 	// (sometimes root == object)
@@ -422,7 +422,7 @@ void LLToolGrab::startGrab()
 }
 
 
-BOOL LLToolGrab::handleHover(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleHover(S32 x, S32 y, MASK mask)
 {
 	if (!gViewerWindow->getLeftMouseDown())
 	{
@@ -466,7 +466,7 @@ const F32 GRAB_SENSITIVITY_Y = 0.0075f;
 
 		
 // Dragging.
-void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverActive(S32 x, S32 y, MASK mask)
 {
 	LLViewerObject* objectp = mGrabPick.getObject();
 	if (!objectp || !hasMouseCapture() ) return;
@@ -724,7 +724,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
 }
  
 
-void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
 {
 	LLViewerObject* objectp = mGrabPick.getObject();
 	if (!objectp || !hasMouseCapture() ) return;
@@ -881,7 +881,7 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
  
 
 // Not dragging.  Just showing affordances
-void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverInactive(S32 x, S32 y, MASK mask)
 {
 	// JC - TODO - change cursor based on gGrabBtnVertical, gGrabBtnSpin
 	LL_DEBUGS("UserInput") << "hover handled by LLToolGrab (inactive-not over editable object)" << LL_ENDL;		
@@ -889,7 +889,7 @@ void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
 }
 
 // User is trying to do something that's not allowed.
-void LLToolGrab::handleHoverFailed(S32 x, S32 y, MASK mask)
+void LLToolGrabBase::handleHoverFailed(S32 x, S32 y, MASK mask)
 {
 	if( GRAB_NOOBJECT == mMode )
 	{
@@ -930,7 +930,7 @@ void LLToolGrab::handleHoverFailed(S32 x, S32 y, MASK mask)
 
 
 
-BOOL LLToolGrab::handleMouseUp(S32 x, S32 y, MASK mask)
+BOOL LLToolGrabBase::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	// call the base class to propogate info to sim
 	LLTool::handleMouseUp(x, y, mask);
@@ -961,7 +961,7 @@ BOOL LLToolGrab::handleMouseUp(S32 x, S32 y, MASK mask)
 	return TRUE;
 } 
 
-void LLToolGrab::stopEditing()
+void LLToolGrabBase::stopEditing()
 {
 	if( hasMouseCapture() )
 	{
@@ -969,7 +969,7 @@ void LLToolGrab::stopEditing()
 	}
 }
 
-void LLToolGrab::onMouseCaptureLost()
+void LLToolGrabBase::onMouseCaptureLost()
 {
 	LLViewerObject* objectp = mGrabPick.getObject();
 	if (!objectp)
@@ -1026,7 +1026,7 @@ void LLToolGrab::onMouseCaptureLost()
 }
 
 
-void LLToolGrab::stopGrab()
+void LLToolGrabBase::stopGrab()
 {
 	LLViewerObject* objectp = mGrabPick.getObject();
 	if (!objectp)
@@ -1067,29 +1067,29 @@ void LLToolGrab::stopGrab()
 }
 
 
-void LLToolGrab::draw()
+void LLToolGrabBase::draw()
 { }
 
-void LLToolGrab::render()
+void LLToolGrabBase::render()
 { }
 
-BOOL LLToolGrab::isEditing()
+BOOL LLToolGrabBase::isEditing()
 {
 	return (mGrabPick.getObject().notNull());
 }
 
-LLViewerObject* LLToolGrab::getEditingObject()
+LLViewerObject* LLToolGrabBase::getEditingObject()
 {
 	return mGrabPick.getObject();
 }
 
 
-LLVector3d LLToolGrab::getEditingPointGlobal()
+LLVector3d LLToolGrabBase::getEditingPointGlobal()
 {
 	return getGrabPointGlobal();
 }
 
-LLVector3d LLToolGrab::getGrabPointGlobal()
+LLVector3d LLToolGrabBase::getGrabPointGlobal()
 {
 	switch(mMode)
 	{
diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h
index 5d24c8813e4dcfef52c968aacf2ab91e909a1d13..02ed5c26d752c9ffb3eeddaf0cf73ca7002a8f1f 100644
--- a/indra/newview/lltoolgrab.h
+++ b/indra/newview/lltoolgrab.h
@@ -45,12 +45,17 @@ void send_ObjectGrab_message(LLViewerObject* object, const LLPickInfo & pick, co
 void send_ObjectDeGrab_message(LLViewerObject* object, const LLPickInfo & pick);
 
 
-
-class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
+/**
+ * LLToolGrabBase contains most of the semantics of LLToolGrab. It's just that
+ * LLToolGrab is an LLSingleton, but we also explicitly instantiate
+ * LLToolGrabBase as part of LLToolCompGun. You can't just make an extra
+ * instance of an LLSingleton!
+ */
+class LLToolGrabBase : public LLTool
 {
 public:
-	LLToolGrab( LLToolComposite* composite = NULL );
-	~LLToolGrab();
+	LLToolGrabBase(LLToolComposite* composite=NULL);
+	~LLToolGrabBase();
 
 	/*virtual*/ BOOL	handleHover(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
@@ -140,10 +145,14 @@ class LLToolGrab : public LLTool, public LLSingleton<LLToolGrab>
 	BOOL			mClickedInMouselook;
 };
 
+/// This is the LLSingleton instance of LLToolGrab.
+class LLToolGrab : public LLToolGrabBase, public LLSingleton<LLToolGrab>
+{
+	LLSINGLETON_EMPTY_CTOR(LLToolGrab);
+};
+
 extern BOOL gGrabBtnVertical;
 extern BOOL gGrabBtnSpin;
 extern LLTool* gGrabTransientTool;
 
 #endif  // LL_TOOLGRAB_H
-
-
diff --git a/indra/newview/lltoolindividual.h b/indra/newview/lltoolindividual.h
index 961a6a4d93d4c49f27f717acca790363dd8012c0..e7c2060fba01909da6a84bc444dc7f03d9e256bf 100644
--- a/indra/newview/lltoolindividual.h
+++ b/indra/newview/lltoolindividual.h
@@ -39,9 +39,9 @@ class LLPickInfo;
 
 class LLToolIndividual : public LLTool, public LLSingleton<LLToolIndividual>
 {
-public:
-	LLToolIndividual();
+	LLSINGLETON(LLToolIndividual);
 	virtual ~LLToolIndividual();
+public:
 
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index e5b45750d900f6fb2eebe1faea562f736f0748ea..28465d5d2cd1e83de8cbe1829bfd840822413fe9 100644
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -42,9 +42,9 @@ const MASK MASK_COPY			= MASK_SHIFT;
 
 class LLToolMgr : public LLSingleton<LLToolMgr>
 {
-public:
-	LLToolMgr();
+	LLSINGLETON(LLToolMgr);
 	~LLToolMgr();
+public:
 
 	// Must be called after gSavedSettings set up.
 	void			initTools();
diff --git a/indra/newview/lltoolobjpicker.h b/indra/newview/lltoolobjpicker.h
index 0c37be1f92471fbb87d0203b1b57d923b06b62e7..5ad9b67e217859e85709603b33b0ea29b775e53b 100644
--- a/indra/newview/lltoolobjpicker.h
+++ b/indra/newview/lltoolobjpicker.h
@@ -35,8 +35,8 @@ class LLPickInfo;
 
 class LLToolObjPicker : public LLTool, public LLSingleton<LLToolObjPicker>
 {
+	LLSINGLETON(LLToolObjPicker);
 public:
-	LLToolObjPicker();
 
 	virtual BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL		handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h
index 6391e675c551a7c7ffbf846097adbea8034a8352..95d155a474a4ea1005df415b3784524794bfb906 100644
--- a/indra/newview/lltoolpie.h
+++ b/indra/newview/lltoolpie.h
@@ -37,9 +37,9 @@ class LLObjectSelection;
 
 class LLToolPie : public LLTool, public LLSingleton<LLToolPie>
 {
+	LLSINGLETON(LLToolPie);
 	LOG_CLASS(LLToolPie);
 public:
-	LLToolPie( );
 
 	// Virtual functions inherited from LLMouseHandler
 	virtual BOOL		handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down);
diff --git a/indra/newview/lltoolpipette.h b/indra/newview/lltoolpipette.h
index 8a83bf31af641534257bcc459aeb94940d2d2608..7575d8ad18454b60ad66451af839338b4efdc6d0 100644
--- a/indra/newview/lltoolpipette.h
+++ b/indra/newview/lltoolpipette.h
@@ -43,10 +43,10 @@ class LLPickInfo;
 class LLToolPipette
 :	public LLTool, public LLSingleton<LLToolPipette>
 {
-public:
-	LLToolPipette();
+	LLSINGLETON(LLToolPipette);
 	virtual ~LLToolPipette();
 
+public:
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltoolselectland.h b/indra/newview/lltoolselectland.h
index b368a4b1533e8f69d2ad2afd797724f9615c3950..b5ba72f16d5d0073e3bcb6127cf12c136b1352c4 100644
--- a/indra/newview/lltoolselectland.h
+++ b/indra/newview/lltoolselectland.h
@@ -35,10 +35,10 @@ class LLParcelSelection;
 class LLToolSelectLand
 :	public LLTool, public LLSingleton<LLToolSelectLand>
 {
-public:
-	LLToolSelectLand( );
+	LLSINGLETON(LLToolSelectLand);
 	virtual ~LLToolSelectLand();
 
+public:
 	/*virtual*/ BOOL		handleMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL		handleDoubleClick(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL		handleMouseUp(S32 x, S32 y, MASK mask);
diff --git a/indra/newview/lltransientfloatermgr.h b/indra/newview/lltransientfloatermgr.h
index b4611c8c87bb4d2954938fba16110e08d9c72a06..d126543f1535b9cec4128121c1ff500d954c428e 100644
--- a/indra/newview/lltransientfloatermgr.h
+++ b/indra/newview/lltransientfloatermgr.h
@@ -38,9 +38,7 @@ class LLTransientFloater;
  */
 class LLTransientFloaterMgr: public LLSingleton<LLTransientFloaterMgr>
 {
-protected:
-	LLTransientFloaterMgr();
-	friend class LLSingleton<LLTransientFloaterMgr>;
+	LLSINGLETON(LLTransientFloaterMgr);
 
 public:
 	enum ETransientGroup
diff --git a/indra/newview/lltwitterconnect.h b/indra/newview/lltwitterconnect.h
index be481a17c10b9f4e27f97dea1cd8c79145f2150f..e77048cc35112390873121dd5dd4e2797ff8e674 100644
--- a/indra/newview/lltwitterconnect.h
+++ b/indra/newview/lltwitterconnect.h
@@ -43,6 +43,7 @@ class LLEventPump;
  */
 class LLTwitterConnect : public LLSingleton<LLTwitterConnect>
 {
+	LLSINGLETON(LLTwitterConnect);
 	LOG_CLASS(LLTwitterConnect);
 public:
     enum EConnectionState
@@ -81,10 +82,7 @@ class LLTwitterConnect : public LLSingleton<LLTwitterConnect>
     void openTwitterWeb(std::string url);
 
 private:
-	friend class LLSingleton<LLTwitterConnect>;
 
-	LLTwitterConnect();
-	~LLTwitterConnect() {};
  	std::string getTwitterConnectURL(const std::string& route = "", bool include_read_from_master = false);
 
     EConnectionState mConnectionState;
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index 08ba5a5f252cebade2b4399a5fda49e2a0f332c5..ad0c1734f9fd132b12eb91f39e5434d5cefdf06f 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -48,8 +48,7 @@ struct ViewerAssetEntry : public LLDictionaryEntry
 class LLViewerAssetDictionary : public LLSingleton<LLViewerAssetDictionary>,
 						  public LLDictionary<LLViewerAssetType::EType, ViewerAssetEntry>
 {
-public:
-	LLViewerAssetDictionary();
+	LLSINGLETON(LLViewerAssetDictionary);
 };
 
 LLViewerAssetDictionary::LLViewerAssetDictionary()
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index 8c302c65492456033c91401557c2474472321be9..16f9b63113d88699a0ffb8d74fe459decc9e8366 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -43,6 +43,9 @@ void audio_update_wind(bool force_update = true);
 
 class LLViewerAudio : public LLSingleton<LLViewerAudio>
 {
+	LLSINGLETON(LLViewerAudio);
+	virtual ~LLViewerAudio();
+
 public:
 
 	enum EFadeState
@@ -52,9 +55,6 @@ class LLViewerAudio : public LLSingleton<LLViewerAudio>
 		FADE_OUT,
 	};
 
-	LLViewerAudio();
-	virtual ~LLViewerAudio();
-	
 	void startInternetStreamWithAutoFade(std::string streamURI);
 	void stopInternetStreamWithAutoFade();
 	
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 7b2887d725b5458979a437725676bc5b6d824890..f8c973690a08aff2a3d26111348da4a931beb3ba 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -54,6 +54,7 @@ extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInst
 LL_ALIGN_PREFIX(16)
 class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
 {
+	LLSINGLETON(LLViewerCamera);
 public:
 	void* operator new(size_t size)
 	{
@@ -82,8 +83,6 @@ class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
 
 	static eCameraID sCurCameraID;
 
-	LLViewerCamera();
-
 	void updateCameraLocation(const LLVector3 &center,
 								const LLVector3 &up_direction,
 								const LLVector3 &point_of_interest);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index b8ff2cc9b4fee36e2bff7a9d220b6c76a62ff606..9cb2e0336a337a0786b1bd1892e4cf05c63faef7 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -103,8 +103,7 @@ struct ViewerFolderEntry : public LLDictionaryEntry
 class LLViewerFolderDictionary : public LLSingleton<LLViewerFolderDictionary>,
 								 public LLDictionary<LLFolderType::EType, ViewerFolderEntry>
 {
-public:
-	LLViewerFolderDictionary();
+	LLSINGLETON(LLViewerFolderDictionary);
 protected:
 	bool initEnsemblesFromFile(); // Reads in ensemble information from foldertypes.xml
 };
diff --git a/indra/newview/llviewerhelp.h b/indra/newview/llviewerhelp.h
index a983012e2ee4ca9025b8a39c0d6896a33f6a2bfc..da50e07a4362a092c2241e26929dbf6be5f52a87 100644
--- a/indra/newview/llviewerhelp.h
+++ b/indra/newview/llviewerhelp.h
@@ -39,7 +39,7 @@ class LLUICtrl;
 
 class LLViewerHelp : public LLHelp, public LLSingleton<LLViewerHelp>
 {
-	friend class LLSingleton<LLViewerHelp>;
+	LLSINGLETON_EMPTY_CTOR(LLViewerHelp);
 
  public:
 	/// display the specified help topic in the help viewer
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index d0813544f8c1456850ecc33198e699f4b42f6104..557e20a4b0858366c0bf2db1adc7b7539b0ae3cd 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -94,107 +94,10 @@ void doInventoryCb(LLPointer<LLInventoryCallback> cb, LLUUID id)
 ///----------------------------------------------------------------------------
 class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary>
 {
+	LLSINGLETON(LLLocalizedInventoryItemsDictionary);
 public:
 	std::map<std::string, std::string> mInventoryItemsDict;
 
-	LLLocalizedInventoryItemsDictionary()
-	{
-		mInventoryItemsDict["New Shape"]		= LLTrans::getString("New Shape");
-		mInventoryItemsDict["New Skin"]			= LLTrans::getString("New Skin");
-		mInventoryItemsDict["New Hair"]			= LLTrans::getString("New Hair");
-		mInventoryItemsDict["New Eyes"]			= LLTrans::getString("New Eyes");
-		mInventoryItemsDict["New Shirt"]		= LLTrans::getString("New Shirt");
-		mInventoryItemsDict["New Pants"]		= LLTrans::getString("New Pants");
-		mInventoryItemsDict["New Shoes"]		= LLTrans::getString("New Shoes");
-		mInventoryItemsDict["New Socks"]		= LLTrans::getString("New Socks");
-		mInventoryItemsDict["New Jacket"]		= LLTrans::getString("New Jacket");
-		mInventoryItemsDict["New Gloves"]		= LLTrans::getString("New Gloves");
-		mInventoryItemsDict["New Undershirt"]	= LLTrans::getString("New Undershirt");
-		mInventoryItemsDict["New Underpants"]	= LLTrans::getString("New Underpants");
-		mInventoryItemsDict["New Skirt"]		= LLTrans::getString("New Skirt");
-		mInventoryItemsDict["New Alpha"]		= LLTrans::getString("New Alpha");
-		mInventoryItemsDict["New Tattoo"]		= LLTrans::getString("New Tattoo");
-		mInventoryItemsDict["New Physics"]		= LLTrans::getString("New Physics");
-		mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
-
-		mInventoryItemsDict["New Gesture"]		= LLTrans::getString("New Gesture");
-		mInventoryItemsDict["New Script"]		= LLTrans::getString("New Script");
-		mInventoryItemsDict["New Folder"]		= LLTrans::getString("New Folder");
-		mInventoryItemsDict["New Note"]			= LLTrans::getString("New Note");
-		mInventoryItemsDict["Contents"]			= LLTrans::getString("Contents");
-
-		mInventoryItemsDict["Gesture"]			= LLTrans::getString("Gesture");
-		mInventoryItemsDict["Male Gestures"]	= LLTrans::getString("Male Gestures");
-		mInventoryItemsDict["Female Gestures"]	= LLTrans::getString("Female Gestures");
-		mInventoryItemsDict["Other Gestures"]	= LLTrans::getString("Other Gestures");
-		mInventoryItemsDict["Speech Gestures"]	= LLTrans::getString("Speech Gestures");
-		mInventoryItemsDict["Common Gestures"]	= LLTrans::getString("Common Gestures");
-
-		//predefined gestures
-
-		//male
-		mInventoryItemsDict["Male - Excuse me"]			= LLTrans::getString("Male - Excuse me");
-		mInventoryItemsDict["Male  - Get lost"]			= LLTrans::getString("Male - Get lost"); // double space after Male. EXT-8319
-		mInventoryItemsDict["Male - Blow kiss"]			= LLTrans::getString("Male - Blow kiss");
-		mInventoryItemsDict["Male - Boo"]				= LLTrans::getString("Male - Boo");
-		mInventoryItemsDict["Male - Bored"]				= LLTrans::getString("Male - Bored");
-		mInventoryItemsDict["Male - Hey"]				= LLTrans::getString("Male - Hey");
-		mInventoryItemsDict["Male - Laugh"]				= LLTrans::getString("Male - Laugh");
-		mInventoryItemsDict["Male - Repulsed"]			= LLTrans::getString("Male - Repulsed");
-		mInventoryItemsDict["Male - Shrug"]				= LLTrans::getString("Male - Shrug");
-		mInventoryItemsDict["Male - Stick tougue out"]	= LLTrans::getString("Male - Stick tougue out");
-		mInventoryItemsDict["Male - Wow"]				= LLTrans::getString("Male - Wow");
-
-		//female
-		mInventoryItemsDict["Female - Chuckle"]			= LLTrans::getString("Female - Chuckle");
-		mInventoryItemsDict["Female - Cry"]				= LLTrans::getString("Female - Cry");
-		mInventoryItemsDict["Female - Embarrassed"]		= LLTrans::getString("Female - Embarrassed");
-		mInventoryItemsDict["Female - Excuse me"]		= LLTrans::getString("Female - Excuse me");
-		mInventoryItemsDict["Female  - Get lost"]		= LLTrans::getString("Female - Get lost"); // double space after Female. EXT-8319
-		mInventoryItemsDict["Female - Blow kiss"]		= LLTrans::getString("Female - Blow kiss");
-		mInventoryItemsDict["Female - Boo"]				= LLTrans::getString("Female - Boo");
-		mInventoryItemsDict["Female - Bored"]			= LLTrans::getString("Female - Bored");
-		mInventoryItemsDict["Female - Hey"]				= LLTrans::getString("Female - Hey");
-		mInventoryItemsDict["Female - Hey baby"]		= LLTrans::getString("Female - Hey baby");
-		mInventoryItemsDict["Female - Laugh"]			= LLTrans::getString("Female - Laugh");
-		mInventoryItemsDict["Female - Looking good"]	= LLTrans::getString("Female - Looking good");
-		mInventoryItemsDict["Female - Over here"]		= LLTrans::getString("Female - Over here");
-		mInventoryItemsDict["Female - Please"]			= LLTrans::getString("Female - Please");
-		mInventoryItemsDict["Female - Repulsed"]		= LLTrans::getString("Female - Repulsed");
-		mInventoryItemsDict["Female - Shrug"]			= LLTrans::getString("Female - Shrug");
-		mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out");
-		mInventoryItemsDict["Female - Wow"]				= LLTrans::getString("Female - Wow");
-
-		//common
-		mInventoryItemsDict["/bow"]						= LLTrans::getString("/bow");
-		mInventoryItemsDict["/clap"]					= LLTrans::getString("/clap");
-		mInventoryItemsDict["/count"]					= LLTrans::getString("/count");
-		mInventoryItemsDict["/extinguish"]				= LLTrans::getString("/extinguish");
-		mInventoryItemsDict["/kmb"]						= LLTrans::getString("/kmb");
-		mInventoryItemsDict["/muscle"]					= LLTrans::getString("/muscle");
-		mInventoryItemsDict["/no"]						= LLTrans::getString("/no");
-		mInventoryItemsDict["/no!"]						= LLTrans::getString("/no!");
-		mInventoryItemsDict["/paper"]					= LLTrans::getString("/paper");
-		mInventoryItemsDict["/pointme"]					= LLTrans::getString("/pointme");
-		mInventoryItemsDict["/pointyou"]				= LLTrans::getString("/pointyou");
-		mInventoryItemsDict["/rock"]					= LLTrans::getString("/rock");
-		mInventoryItemsDict["/scissor"]					= LLTrans::getString("/scissor");
-		mInventoryItemsDict["/smoke"]					= LLTrans::getString("/smoke");
-		mInventoryItemsDict["/stretch"]					= LLTrans::getString("/stretch");
-		mInventoryItemsDict["/whistle"]					= LLTrans::getString("/whistle");
-		mInventoryItemsDict["/yes"]						= LLTrans::getString("/yes");
-		mInventoryItemsDict["/yes!"]					= LLTrans::getString("/yes!");
-		mInventoryItemsDict["afk"]						= LLTrans::getString("afk");
-		mInventoryItemsDict["dance1"]					= LLTrans::getString("dance1");
-		mInventoryItemsDict["dance2"]					= LLTrans::getString("dance2");
-		mInventoryItemsDict["dance3"]					= LLTrans::getString("dance3");
-		mInventoryItemsDict["dance4"]					= LLTrans::getString("dance4");
-		mInventoryItemsDict["dance5"]					= LLTrans::getString("dance5");
-		mInventoryItemsDict["dance6"]					= LLTrans::getString("dance6");
-		mInventoryItemsDict["dance7"]					= LLTrans::getString("dance7");
-		mInventoryItemsDict["dance8"]					= LLTrans::getString("dance8");
-	}
-
 	/**
 	 * Finds passed name in dictionary and replaces it with found localized value.
 	 *
@@ -217,6 +120,103 @@ class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInvent
 	}
 };
 
+LLLocalizedInventoryItemsDictionary::LLLocalizedInventoryItemsDictionary()
+{
+	mInventoryItemsDict["New Shape"]		= LLTrans::getString("New Shape");
+	mInventoryItemsDict["New Skin"]			= LLTrans::getString("New Skin");
+	mInventoryItemsDict["New Hair"]			= LLTrans::getString("New Hair");
+	mInventoryItemsDict["New Eyes"]			= LLTrans::getString("New Eyes");
+	mInventoryItemsDict["New Shirt"]		= LLTrans::getString("New Shirt");
+	mInventoryItemsDict["New Pants"]		= LLTrans::getString("New Pants");
+	mInventoryItemsDict["New Shoes"]		= LLTrans::getString("New Shoes");
+	mInventoryItemsDict["New Socks"]		= LLTrans::getString("New Socks");
+	mInventoryItemsDict["New Jacket"]		= LLTrans::getString("New Jacket");
+	mInventoryItemsDict["New Gloves"]		= LLTrans::getString("New Gloves");
+	mInventoryItemsDict["New Undershirt"]	= LLTrans::getString("New Undershirt");
+	mInventoryItemsDict["New Underpants"]	= LLTrans::getString("New Underpants");
+	mInventoryItemsDict["New Skirt"]		= LLTrans::getString("New Skirt");
+	mInventoryItemsDict["New Alpha"]		= LLTrans::getString("New Alpha");
+	mInventoryItemsDict["New Tattoo"]		= LLTrans::getString("New Tattoo");
+	mInventoryItemsDict["New Physics"]		= LLTrans::getString("New Physics");
+	mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
+
+	mInventoryItemsDict["New Gesture"]		= LLTrans::getString("New Gesture");
+	mInventoryItemsDict["New Script"]		= LLTrans::getString("New Script");
+	mInventoryItemsDict["New Folder"]		= LLTrans::getString("New Folder");
+	mInventoryItemsDict["New Note"]			= LLTrans::getString("New Note");
+	mInventoryItemsDict["Contents"]			= LLTrans::getString("Contents");
+
+	mInventoryItemsDict["Gesture"]			= LLTrans::getString("Gesture");
+	mInventoryItemsDict["Male Gestures"]	= LLTrans::getString("Male Gestures");
+	mInventoryItemsDict["Female Gestures"]	= LLTrans::getString("Female Gestures");
+	mInventoryItemsDict["Other Gestures"]	= LLTrans::getString("Other Gestures");
+	mInventoryItemsDict["Speech Gestures"]	= LLTrans::getString("Speech Gestures");
+	mInventoryItemsDict["Common Gestures"]	= LLTrans::getString("Common Gestures");
+
+	//predefined gestures
+
+	//male
+	mInventoryItemsDict["Male - Excuse me"]			= LLTrans::getString("Male - Excuse me");
+	mInventoryItemsDict["Male  - Get lost"]			= LLTrans::getString("Male - Get lost"); // double space after Male. EXT-8319
+	mInventoryItemsDict["Male - Blow kiss"]			= LLTrans::getString("Male - Blow kiss");
+	mInventoryItemsDict["Male - Boo"]				= LLTrans::getString("Male - Boo");
+	mInventoryItemsDict["Male - Bored"]				= LLTrans::getString("Male - Bored");
+	mInventoryItemsDict["Male - Hey"]				= LLTrans::getString("Male - Hey");
+	mInventoryItemsDict["Male - Laugh"]				= LLTrans::getString("Male - Laugh");
+	mInventoryItemsDict["Male - Repulsed"]			= LLTrans::getString("Male - Repulsed");
+	mInventoryItemsDict["Male - Shrug"]				= LLTrans::getString("Male - Shrug");
+	mInventoryItemsDict["Male - Stick tougue out"]	= LLTrans::getString("Male - Stick tougue out");
+	mInventoryItemsDict["Male - Wow"]				= LLTrans::getString("Male - Wow");
+
+	//female
+	mInventoryItemsDict["Female - Chuckle"]			= LLTrans::getString("Female - Chuckle");
+	mInventoryItemsDict["Female - Cry"]				= LLTrans::getString("Female - Cry");
+	mInventoryItemsDict["Female - Embarrassed"]		= LLTrans::getString("Female - Embarrassed");
+	mInventoryItemsDict["Female - Excuse me"]		= LLTrans::getString("Female - Excuse me");
+	mInventoryItemsDict["Female  - Get lost"]		= LLTrans::getString("Female - Get lost"); // double space after Female. EXT-8319
+	mInventoryItemsDict["Female - Blow kiss"]		= LLTrans::getString("Female - Blow kiss");
+	mInventoryItemsDict["Female - Boo"]				= LLTrans::getString("Female - Boo");
+	mInventoryItemsDict["Female - Bored"]			= LLTrans::getString("Female - Bored");
+	mInventoryItemsDict["Female - Hey"]				= LLTrans::getString("Female - Hey");
+	mInventoryItemsDict["Female - Hey baby"]		= LLTrans::getString("Female - Hey baby");
+	mInventoryItemsDict["Female - Laugh"]			= LLTrans::getString("Female - Laugh");
+	mInventoryItemsDict["Female - Looking good"]	= LLTrans::getString("Female - Looking good");
+	mInventoryItemsDict["Female - Over here"]		= LLTrans::getString("Female - Over here");
+	mInventoryItemsDict["Female - Please"]			= LLTrans::getString("Female - Please");
+	mInventoryItemsDict["Female - Repulsed"]		= LLTrans::getString("Female - Repulsed");
+	mInventoryItemsDict["Female - Shrug"]			= LLTrans::getString("Female - Shrug");
+	mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out");
+	mInventoryItemsDict["Female - Wow"]				= LLTrans::getString("Female - Wow");
+
+	//common
+	mInventoryItemsDict["/bow"]						= LLTrans::getString("/bow");
+	mInventoryItemsDict["/clap"]					= LLTrans::getString("/clap");
+	mInventoryItemsDict["/count"]					= LLTrans::getString("/count");
+	mInventoryItemsDict["/extinguish"]				= LLTrans::getString("/extinguish");
+	mInventoryItemsDict["/kmb"]						= LLTrans::getString("/kmb");
+	mInventoryItemsDict["/muscle"]					= LLTrans::getString("/muscle");
+	mInventoryItemsDict["/no"]						= LLTrans::getString("/no");
+	mInventoryItemsDict["/no!"]						= LLTrans::getString("/no!");
+	mInventoryItemsDict["/paper"]					= LLTrans::getString("/paper");
+	mInventoryItemsDict["/pointme"]					= LLTrans::getString("/pointme");
+	mInventoryItemsDict["/pointyou"]				= LLTrans::getString("/pointyou");
+	mInventoryItemsDict["/rock"]					= LLTrans::getString("/rock");
+	mInventoryItemsDict["/scissor"]					= LLTrans::getString("/scissor");
+	mInventoryItemsDict["/smoke"]					= LLTrans::getString("/smoke");
+	mInventoryItemsDict["/stretch"]					= LLTrans::getString("/stretch");
+	mInventoryItemsDict["/whistle"]					= LLTrans::getString("/whistle");
+	mInventoryItemsDict["/yes"]						= LLTrans::getString("/yes");
+	mInventoryItemsDict["/yes!"]					= LLTrans::getString("/yes!");
+	mInventoryItemsDict["afk"]						= LLTrans::getString("afk");
+	mInventoryItemsDict["dance1"]					= LLTrans::getString("dance1");
+	mInventoryItemsDict["dance2"]					= LLTrans::getString("dance2");
+	mInventoryItemsDict["dance3"]					= LLTrans::getString("dance3");
+	mInventoryItemsDict["dance4"]					= LLTrans::getString("dance4");
+	mInventoryItemsDict["dance5"]					= LLTrans::getString("dance5");
+	mInventoryItemsDict["dance6"]					= LLTrans::getString("dance6");
+	mInventoryItemsDict["dance7"]					= LLTrans::getString("dance7");
+	mInventoryItemsDict["dance8"]					= LLTrans::getString("dance8");
+}
 
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
diff --git a/indra/newview/llviewerjoystick.h b/indra/newview/llviewerjoystick.h
index 80c758a5af77991df14926a8b41651540259d171..016b435ee84648a54f4f04bf7d9baef7fe9cc847 100644
--- a/indra/newview/llviewerjoystick.h
+++ b/indra/newview/llviewerjoystick.h
@@ -45,10 +45,10 @@ typedef enum e_joystick_driver_state
 
 class LLViewerJoystick : public LLSingleton<LLViewerJoystick>
 {
-public:
-	LLViewerJoystick();
+	LLSINGLETON(LLViewerJoystick);
 	virtual ~LLViewerJoystick();
-	
+
+public:
 	void init(bool autoenable);
 	void terminate();
 
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index 2186ed3c5297d508e58c800aa262d3a5ed132f23..fd4315a319d25f2a9ed6aceb93856c0cb6903374 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -57,6 +57,7 @@ const F32 ORBIT_NUDGE_RATE = 0.05f;  // fraction of normal speed
 struct LLKeyboardActionRegistry 
 :	public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry>
 {
+	LLSINGLETON_EMPTY_CTOR(LLKeyboardActionRegistry);
 };
 
 LLViewerKeyboard gViewerKeyboard;
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 0b2a64868ea0c40710b1c288884c5b1cc959f96e..368c671f84b96cb553b86c4184d1c84efae91660 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -41,10 +41,10 @@ class LLViewerMediaFocus :
 	public LLFocusableElement, 
 	public LLSingleton<LLViewerMediaFocus>
 {
-public:
-	LLViewerMediaFocus();
+	LLSINGLETON(LLViewerMediaFocus);
 	~LLViewerMediaFocus();
-	
+
+public:
 	// Set/clear the face that has media focus (takes keyboard input and has the full set of controls)
 	void setFocusFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero);
 	void clearFocus();
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index d8f5c71f8d3bfff2a6b7c30e43832d939a81215d..b0eaa37541db4af72b8eb4c7ccda1bf30e0de7a3 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -210,6 +210,7 @@ void set_dad_inbox_object(const LLUUID& object_id);
 
 class LLViewerMessage : public  LLSingleton<LLViewerMessage>
 {
+	LLSINGLETON_EMPTY_CTOR(LLViewerMessage);
 public:
 	typedef boost::function<void()> teleport_started_callback_t;
 	typedef boost::signals2::signal<void()> teleport_started_signal_t;
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 6666aecca207f4c984bbd6e20d68bd7e638ba46f..b47cdbd11120b2545bab253c5f8fcb5509b5a2c1 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -91,13 +91,6 @@ LLGridManager::LLGridManager()
 }
 
 
-LLGridManager::LLGridManager(const std::string& grid_file)
-{
-	// initialize with an explicity grid file for testing.
-	LL_DEBUGS("GridManager")<<LL_ENDL;
-	initialize(grid_file);
-}
-
 //
 // LLGridManager - class for managing the list of known grids, and the current
 // selection
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index 8526c0ba7f35959b41e90fc81b3a072d3f128b22..e540ca956885ef79560734c9c4d706839b5dc1e6 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -58,16 +58,15 @@ class LLInvalidGridName
  **/
 class LLGridManager : public LLSingleton<LLGridManager>
 {
+	/// Instantiate the grid manager, load default grids, selects the default grid
+	LLSINGLETON(LLGridManager);
+	~LLGridManager();
+
   public:
 	/* ================================================================
 	 * @name Initialization and Configuration
 	 * @{
 	 */
-	/// Instantiate the grid manager, load default grids, selects the default grid
-	LLGridManager(const std::string& grid_file);
-	LLGridManager();
-	~LLGridManager();
-	
 	/// add grids from an external grids file
 	void initialize(const std::string& grid_file);
 	
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index bb6bbf33083127c29b7e04d8cf7d1c65b7d70ae5..29219843c9ef20b3ea5161a9d28dcd65b37882d4 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -75,6 +75,8 @@ class LLParcelObserver
 
 class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 {
+	LLSINGLETON(LLViewerParcelMgr);
+	~LLViewerParcelMgr();
 
 public:
 	typedef boost::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t;
@@ -82,9 +84,6 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 	typedef boost::function<void()> teleport_failed_callback_t;
 	typedef boost::signals2::signal<void()> teleport_failed_signal_t;
 
-	LLViewerParcelMgr();
-	~LLViewerParcelMgr();
-
 	static void cleanupGlobals();
 
 	BOOL	selectionEmpty() const;
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index 40e8e1d45df1322a758fa8682c9858ffce0972b9..ab1cd715ab225552ce52b213f0f0028a13dcf021 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -135,9 +135,8 @@ class LLViewerPartGroup
 
 class LLViewerPartSim : public LLSingleton<LLViewerPartSim>
 {
+	LLSINGLETON(LLViewerPartSim);
 public:
-	LLViewerPartSim();
-	virtual ~LLViewerPartSim(){}
 	void destroyClass();
 
 	typedef std::vector<LLViewerPartGroup *> group_list_t;
diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h
index 7843652589f7621b60fa7db3696dcbb3d3ecbabe..97a060d95e401102b79c8281e891a065b47201c1 100644
--- a/indra/newview/llviewerstats.h
+++ b/indra/newview/llviewerstats.h
@@ -246,13 +246,11 @@ extern LLTrace::EventStatHandle<LLUnit<F32, LLUnits::Percent> > OBJECT_CACHE_HIT
 
 class LLViewerStats : public LLSingleton<LLViewerStats>
 {
-public:
-	void resetStats();
+	LLSINGLETON(LLViewerStats);
+	~LLViewerStats();
 
 public:
-
-	LLViewerStats();
-	~LLViewerStats();
+	void resetStats();
 
 	void updateFrameStats(const F64Seconds time_diff);
 	
diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h
index d1744f4910d66eaac242ca3af0d3033988260b4f..c974bea49de5f38cdb55016809c719ab72dd1446 100644
--- a/indra/newview/llviewerstatsrecorder.h
+++ b/indra/newview/llviewerstatsrecorder.h
@@ -44,11 +44,11 @@ class LLViewerObject;
 
 class LLViewerStatsRecorder : public LLSingleton<LLViewerStatsRecorder>
 {
- public:
-	LOG_CLASS(LLViewerStatsRecorder);	 
-	LLViewerStatsRecorder();
+	LLSINGLETON(LLViewerStatsRecorder);
+	LOG_CLASS(LLViewerStatsRecorder);
 	~LLViewerStatsRecorder();
 
+ public:
 	void objectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size)
 	{
 #if LL_RECORD_VIEWER_STATS
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index ba7677083852f6d39aa555199fe42699996d5d06..070544063ac5854b3ae9ef8e4fb82c2438625e0a 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -237,6 +237,7 @@ class LLViewerTextureList
 
 class LLUIImageList : public LLImageProviderInterface, public LLSingleton<LLUIImageList>
 {
+	LLSINGLETON_EMPTY_CTOR(LLUIImageList);
 public:
 	// LLImageProviderInterface
 	/*virtual*/ LLPointer<LLUIImage> getUIImageByID(const LLUUID& id, S32 priority);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index e3e7b81f2f8724569701d7d1fe80e8cdc279ccc0..45cb014e4355d94b7ca190c8e000c4c78bbb4b49 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -288,13 +288,8 @@ class RecordToChatConsoleRecorder : public LLError::Recorder
 
 class RecordToChatConsole : public LLSingleton<RecordToChatConsole>
 {
+	LLSINGLETON(RecordToChatConsole);
 public:
-	RecordToChatConsole()
-		: LLSingleton<RecordToChatConsole>(),
-		mRecorder(new RecordToChatConsoleRecorder())
-	{
-	}
-
 	void startRecorder() { LLError::addRecorder(mRecorder); }
 	void stopRecorder() { LLError::removeRecorder(mRecorder); }
 
@@ -302,6 +297,11 @@ class RecordToChatConsole : public LLSingleton<RecordToChatConsole>
 	LLError::RecorderPtr mRecorder;
 };
 
+RecordToChatConsole::RecordToChatConsole():
+	mRecorder(new RecordToChatConsoleRecorder())
+{
+}
+
 ////////////////////////////////////////////////////////////////////////////
 //
 // LLDebugText
@@ -2120,10 +2120,7 @@ void LLViewerWindow::shutdownViews()
 
 	// destroy the nav bar, not currently part of gViewerWindow
 	// *TODO: Make LLNavigationBar part of gViewerWindow
-	if (LLNavigationBar::instanceExists())
-	{
-		delete LLNavigationBar::getInstance();
-	}
+	LLNavigationBar::deleteSingleton();
 	LL_INFOS() << "LLNavigationBar destroyed." << LL_ENDL ;
 	
 	// destroy menus after instantiating navbar above, as it needs
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 082f5f0b1d684ebf8bddf7c070b529ca4594031a..7aabde1b2da66d2ac36360dcaaf7db9080098efd 100644
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -223,6 +223,9 @@ class LLVOCachePartition : public LLViewerOctreePartition, public LLTrace::MemTr
 //
 class LLVOCache : public LLSingleton<LLVOCache>
 {
+	LLSINGLETON(LLVOCache);
+	~LLVOCache() ;
+
 private:
 	struct HeaderEntryInfo
 	{
@@ -253,13 +256,8 @@ class LLVOCache : public LLSingleton<LLVOCache>
 	};
 	typedef std::set<HeaderEntryInfo*, header_entry_less> header_entry_queue_t;
 	typedef std::map<U64, HeaderEntryInfo*> handle_entry_map_t;
-private:
-    friend class LLSingleton<LLVOCache>;
-	LLVOCache() ;
 
 public:
-	~LLVOCache() ;
-
 	void initCache(ELLPath location, U32 size, U32 cache_version) ;
 	void removeCache(ELLPath location, bool started = false) ;
 
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index ef15b2c79ee2d5c184d7cf6e59df2802168e3ad7..309c3eebddfea599b9decd08d3dc362fe096457b 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -167,8 +167,8 @@ class LLVoiceChannelGroup : public LLVoiceChannel
 
 class LLVoiceChannelProximal : public LLVoiceChannel, public LLSingleton<LLVoiceChannelProximal>
 {
+	LLSINGLETON(LLVoiceChannelProximal);
 public:
-	LLVoiceChannelProximal();
 
 	/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
 	/*virtual*/ void handleStatusChange(EStatusType status);
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index b05bcb23b705c8601327d32072647f87488b3abf..32637dcf42e796b0d6dac12261da23cab44efdf3 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -299,11 +299,11 @@ class LLVoiceEffectInterface
 
 class LLVoiceClient: public LLSingleton<LLVoiceClient>
 {
+	LLSINGLETON(LLVoiceClient);
 	LOG_CLASS(LLVoiceClient);
-public:
-	LLVoiceClient();	
 	~LLVoiceClient();
 
+public:
 	typedef boost::signals2::signal<void(void)> micro_changed_signal_t;
 	micro_changed_signal_t mMicroChangedSignal;
 
@@ -485,6 +485,8 @@ class LLVoiceClient: public LLSingleton<LLVoiceClient>
  **/
 class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage>
 {
+	LLSINGLETON(LLSpeakerVolumeStorage);
+	~LLSpeakerVolumeStorage();
 	LOG_CLASS(LLSpeakerVolumeStorage);
 public:
 
@@ -513,10 +515,6 @@ class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage>
 	void removeSpeakerVolume(const LLUUID& speaker_id);
 
 private:
-	friend class LLSingleton<LLSpeakerVolumeStorage>;
-	LLSpeakerVolumeStorage();
-	~LLSpeakerVolumeStorage();
-
 	const static std::string SETTINGS_FILE_NAME;
 
 	void load();
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index f32c7c975f668a037d19e1ec2a56a16cb001e7fc..81e924e4382c06b91919a7a4dad94a30815ff832 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -56,12 +56,11 @@ class LLVivoxVoiceClient :	public LLSingleton<LLVivoxVoiceClient>,
 							virtual public LLVoiceModuleInterface,
 							virtual public LLVoiceEffectInterface
 {
+	LLSINGLETON(LLVivoxVoiceClient);
 	LOG_CLASS(LLVivoxVoiceClient);
-public:
-	LLVivoxVoiceClient();	
 	virtual ~LLVivoxVoiceClient();
-	
-	
+
+public:
 	/// @name LLVoiceModuleInterface virtual implementations
 	///  @see LLVoiceModuleInterface
 	//@{
@@ -1027,10 +1026,10 @@ class LLVivoxProtocolParser : public LLIOPipe
 
 class LLVivoxSecurity :	public LLSingleton<LLVivoxSecurity>
 {
-  public:
-	LLVivoxSecurity();	
-	virtual ~LLVivoxSecurity();
+    LLSINGLETON(LLVivoxSecurity);
+    virtual ~LLVivoxSecurity();
 
+  public:
     std::string     connectorHandle() { return mConnectorHandle; };
     std::string     accountHandle()    { return mAccountHandle;    };
 
diff --git a/indra/newview/llwatchdog.h b/indra/newview/llwatchdog.h
index fee3ec6f2001c05d9127864480daa23ee3d6b1a4..9a6624258e90f43c43a114fa1250d579b45ec990 100644
--- a/indra/newview/llwatchdog.h
+++ b/indra/newview/llwatchdog.h
@@ -75,10 +75,10 @@ class LLWatchdogTimeout : public LLWatchdogEntry
 class LLWatchdogTimerThread; // Defined in the cpp
 class LLWatchdog : public LLSingleton<LLWatchdog>
 {
-public:
-	LLWatchdog();
+	LLSINGLETON(LLWatchdog);
 	~LLWatchdog();
 
+public:
 	// Add an entry to the watchdog.
 	void add(LLWatchdogEntry* e);
 	void remove(LLWatchdogEntry* e);
diff --git a/indra/newview/llwaterparammanager.h b/indra/newview/llwaterparammanager.h
index dc7d41be2ac57b0cff6712da49a30d4bb71d1126..3f169e439a607d52110112e5c2f19326f5a2e795 100644
--- a/indra/newview/llwaterparammanager.h
+++ b/indra/newview/llwaterparammanager.h
@@ -214,6 +214,8 @@ struct WaterExpFloatControl
 /// WindLight parameter manager class - what controls all the wind light shaders
 class LLWaterParamManager : public LLSingleton<LLWaterParamManager>
 {
+	LLSINGLETON(LLWaterParamManager);
+	~LLWaterParamManager();
 	LOG_CLASS(LLWaterParamManager);
 public:
 	typedef std::list<std::string> preset_name_list_t;
@@ -317,11 +319,7 @@ class LLWaterParamManager : public LLSingleton<LLWaterParamManager>
 	F32 mDensitySliderValue;
 
 private:
-	friend class LLSingleton<LLWaterParamManager>;
 	/*virtual*/ void initSingleton();
-	LLWaterParamManager();
-	~LLWaterParamManager();
-
 	void loadAllPresets();
 	void loadPresetsFromDir(const std::string& dir);
 	bool loadPreset(const std::string& path);
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 18a30f083bca8412ea1d221df0cb1db3e06b4d5c..6aa03e16ed01b30b80a075f727e9dfe0032b7cb3 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -411,8 +411,8 @@ class LLWearableItemsList : public LLInventoryItemsList
 	 */
 	class ContextMenu : public LLListContextMenu, public LLSingleton<ContextMenu>
 	{
+		LLSINGLETON(ContextMenu);
 	public:
-		ContextMenu();
 		/*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
 
 	protected:
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index d6f0fd09a6d5c0376c78ad8ff2327e3c06c9e747..782f7751e59f19f8702a0ea81f52a7df4510d3ea 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -41,9 +41,9 @@
 */
 class LLWearableList : public LLSingleton<LLWearableList>
 {
-public:
-	LLWearableList()	{}
+	LLSINGLETON_EMPTY_CTOR(LLWearableList);
 	~LLWearableList();
+public:
 	void cleanup() ;
 
 	S32					getLength() const { return mList.size(); }
diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h
index a3cbf6dc036cde80da35f5c19d5c20dffbec2f89..89297e94e1938308ce327b7116f44fef3ad22364 100644
--- a/indra/newview/llwindebug.h
+++ b/indra/newview/llwindebug.h
@@ -34,6 +34,7 @@
 class LLWinDebug:
 	public LLSingleton<LLWinDebug>
 {
+	LLSINGLETON(LLWinDebug);
 public:
 	static void init();
 	static void generateMinidump(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL);
diff --git a/indra/newview/llwlparammanager.h b/indra/newview/llwlparammanager.h
index e13aed98edfc507d5bec39592e9fdc8493cc67a1..a10102edf786fdb9102acecfb8efedb51b90ec50 100644
--- a/indra/newview/llwlparammanager.h
+++ b/indra/newview/llwlparammanager.h
@@ -213,6 +213,8 @@ struct LLWLParamKey : LLEnvKey
 /// WindLight parameter manager class - what controls all the wind light shaders
 class LLWLParamManager : public LLSingleton<LLWLParamManager>
 {
+	LLSINGLETON(LLWLParamManager);
+	~LLWLParamManager();
 	LOG_CLASS(LLWLParamManager);
 
 public:
@@ -375,11 +377,7 @@ class LLWLParamManager : public LLSingleton<LLWLParamManager>
 	static std::string getSysDir();
 	static std::string getUserDir();
 
-	friend class LLSingleton<LLWLParamManager>;
 	/*virtual*/ void initSingleton();
-	LLWLParamManager();
-	~LLWLParamManager();
-
 	// list of all the parameters, listed by name
 	std::map<LLWLParamKey, LLWLParamSet> mParamList;
 
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index b2d84180648ddfadc41c3ce0185f9354153451d8..c9ac241d5aae22473d0a302974d57ca00cb0aeab 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -61,8 +61,8 @@ class LLVOAvatar;
 
 class LLWorld : public LLSingleton<LLWorld>
 {
+	LLSINGLETON(LLWorld);
 public:
-	LLWorld();
 	void destroyClass();
 
 	LLViewerRegion*	addRegion(const U64 &region_handle, const LLHost &host);
diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h
index 1a168e4b4d4f76ee6d25499d00d45491e2c5085a..5e5caa6a74358e8b762fe2d40a7ff82e71bb52bf 100644
--- a/indra/newview/llworldmap.h
+++ b/indra/newview/llworldmap.h
@@ -193,10 +193,10 @@ const S32 MAP_BLOCK_RES = (MAP_MAX_SIZE / MAP_BLOCK_SIZE);
 
 class LLWorldMap : public LLSingleton<LLWorldMap>
 {
-public:
-	LLWorldMap();
+	LLSINGLETON(LLWorldMap);
 	~LLWorldMap();
 
+public:
 	// Clear all: list of region info, tiles, blocks and items
 	void reset();
 
diff --git a/indra/newview/llworldmapmessage.h b/indra/newview/llworldmapmessage.h
index ac1ea1607c793d6370d3f3e95cd4f414c9889a26..65276df06820835dcd2157d2a2aa76a63bd16b78 100644
--- a/indra/newview/llworldmapmessage.h
+++ b/indra/newview/llworldmapmessage.h
@@ -34,13 +34,13 @@ class LLMessageSystem;
 
 class LLWorldMapMessage : public LLSingleton<LLWorldMapMessage>
 {
+	LLSINGLETON(LLWorldMapMessage);
+	~LLWorldMapMessage();
+
 public:
 	typedef boost::function<void(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)>
 		url_callback_t;
 
-	LLWorldMapMessage();
-	~LLWorldMapMessage();
-
 	// Process incoming answers to map stuff requests
 	static void processMapBlockReply(LLMessageSystem*, void**);
 	static void processMapItemReply(LLMessageSystem*, void**);