diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index ff05b25fe941d06b483dcb5a429b0b9273ec00ed..ccc666e74d9295b02765317405def2f20076dacb 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -241,33 +241,15 @@ void LLCharacter::dumpCharacter( LLJoint* joint )
 //-----------------------------------------------------------------------------
 void LLCharacter::setAnimationData(std::string name, void *data)
 {
-	if(mAnimationData.getValue(name))
-	{
-		*mAnimationData[name] = data;
-	}
-	else
-	{
-		mAnimationData.addToHead(name, data);
-	}
+	mAnimationData[name] = data;
 }
 
 //-----------------------------------------------------------------------------
 // getAnimationData()
 //-----------------------------------------------------------------------------
-void * LLCharacter::getAnimationData(std::string name)
+void* LLCharacter::getAnimationData(std::string name)
 {
-	void **result = mAnimationData.getValue(name);
-	void *return_value;		// Necessary to suppress VC6 warning. JC
-	if (!result)
-	{
-		return_value = NULL;
-	}
-	else 
-	{
-		return_value = *result;
-	}
-
-	return return_value;
+	return get_if_there(mAnimationData, name, (void*)NULL);
 }
 
 //-----------------------------------------------------------------------------
@@ -275,7 +257,7 @@ void * LLCharacter::getAnimationData(std::string name)
 //-----------------------------------------------------------------------------
 void LLCharacter::removeAnimationData(std::string name)
 {
-	mAnimationData.remove(name);
+	mAnimationData.erase(name);
 }
 
 //-----------------------------------------------------------------------------
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index eb001d5fc7545a62a63d6d4f1bf9f0e3f4e7d2ca..a5719b068540e70a62c19336b182ba3622807bbd 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -39,9 +39,7 @@
 
 #include "lljoint.h"
 #include "llmotioncontroller.h"
-#include "llassoclist.h"
 #include "llvisualparam.h"
-#include "linked_lists.h"
 #include "string_table.h"
 #include "llmemory.h"
 #include "llthread.h"
@@ -255,7 +253,8 @@ public:
 protected:
 	LLMotionController	mMotionController;
 
-	LLAssocList<std::string, void *> mAnimationData;
+	typedef std::map<std::string, void *> animation_data_map_t;
+	animation_data_map_t mAnimationData;
 
 	F32					mPreferredPelvisHeight;
 	ESex				mSex;
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 1d00f18f2d79c063e2212f3e9e4da34ee13cc505..91d96904bafff31cfe8c89fd445c41d22adc733e 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -122,6 +122,7 @@ U32 LLKeyframeMotion::JointMotionList::dumpDiagInfo()
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
+
 //-----------------------------------------------------------------------------
 // ScaleCurve::ScaleCurve()
 //-----------------------------------------------------------------------------
@@ -136,7 +137,7 @@ LLKeyframeMotion::ScaleCurve::ScaleCurve()
 //-----------------------------------------------------------------------------
 LLKeyframeMotion::ScaleCurve::~ScaleCurve() 
 {
-	mKeys.deleteAllData();
+	mKeys.clear();
 	mNumKeys = 0;
 }
 
@@ -146,43 +147,42 @@ LLKeyframeMotion::ScaleCurve::~ScaleCurve()
 LLVector3 LLKeyframeMotion::ScaleCurve::getValue(F32 time, F32 duration)
 {
 	LLVector3 value;
-	F32 index_before, index_after;
-	ScaleKey* scale_before;
-	ScaleKey* scale_after;
 
-	mKeys.getInterval(time, index_before, index_after, scale_before, scale_after);
-	if (scale_before)
+	if (mKeys.empty())
 	{
-		if (!scale_after)
-		{
-			scale_after = &mLoopInKey;
-			index_after = duration;
-		}
-
-		if (index_after == index_before)
-		{
-			value = scale_after->mScale;
-		}
-		else
-		{
-			F32 u = (time - index_before) / (index_after - index_before);
-			value = interp(u, *scale_before, *scale_after);
-		}
+		value.clearVec();
+		return value;
+	}
+	
+	key_map_t::iterator right = mKeys.lower_bound(time);
+	if (right == mKeys.end())
+	{
+		// Past last key
+		--right;
+		value = right->second.mScale;
+	}
+	else if (right == mKeys.begin() || right->first == time)
+	{
+		// Before first key or exactly on a key
+		value = right->second.mScale;
 	}
 	else
 	{
-		// before first key
-		if (scale_after)
-		{
-			value = scale_after->mScale;
-		}
-		// no keys?
-		else
+		// Between two keys
+		key_map_t::iterator left = right; --left;
+		F32 index_before = left->first;
+		F32 index_after = right->first;
+		ScaleKey& scale_before = left->second;
+		ScaleKey& scale_after = right->second;
+		if (right == mKeys.end())
 		{
-			value.clearVec();
+			scale_after = mLoopInKey;
+			index_after = duration;
 		}
-	}
 
+		F32 u = (time - index_before) / (index_after - index_before);
+		value = interp(u, scale_before, scale_after);
+	}
 	return value;
 }
 
@@ -217,7 +217,7 @@ LLKeyframeMotion::RotationCurve::RotationCurve()
 //-----------------------------------------------------------------------------
 LLKeyframeMotion::RotationCurve::~RotationCurve()
 {
-	mKeys.deleteAllData();
+	mKeys.clear();
 	mNumKeys = 0;
 }
 
@@ -227,44 +227,42 @@ LLKeyframeMotion::RotationCurve::~RotationCurve()
 LLQuaternion LLKeyframeMotion::RotationCurve::getValue(F32 time, F32 duration)
 {
 	LLQuaternion value;
-	F32 index_before, index_after;
-	RotationKey* rot_before;
-	RotationKey* rot_after;
-
-	mKeys.getInterval(time, index_before, index_after, rot_before, rot_after);
 
-	if (rot_before)
+	if (mKeys.empty())
 	{
-		if (!rot_after)
-		{
-			rot_after = &mLoopInKey;
-			index_after = duration;
-		}
-
-		if (index_after == index_before)
-		{
-			value = rot_after->mRotation;
-		}
-		else
-		{
-			F32 u = (time - index_before) / (index_after - index_before);
-			value = interp(u, *rot_before, *rot_after);
-		}
+		value = LLQuaternion::DEFAULT;
+		return value;
+	}
+	
+	key_map_t::iterator right = mKeys.lower_bound(time);
+	if (right == mKeys.end())
+	{
+		// Past last key
+		--right;
+		value = right->second.mRotation;
+	}
+	else if (right == mKeys.begin() || right->first == time)
+	{
+		// Before first key or exactly on a key
+		value = right->second.mRotation;
 	}
 	else
 	{
-		// before first key
-		if (rot_after)
+		// Between two keys
+		key_map_t::iterator left = right; --left;
+		F32 index_before = left->first;
+		F32 index_after = right->first;
+		RotationKey& rot_before = left->second;
+		RotationKey& rot_after = right->second;
+		if (right == mKeys.end())
 		{
-			value = rot_after->mRotation;
-		}
-		// no keys?
-		else
-		{
-			value = LLQuaternion::DEFAULT;
+			rot_after = mLoopInKey;
+			index_after = duration;
 		}
-	}
 
+		F32 u = (time - index_before) / (index_after - index_before);
+		value = interp(u, rot_before, rot_after);
+	}
 	return value;
 }
 
@@ -300,7 +298,7 @@ LLKeyframeMotion::PositionCurve::PositionCurve()
 //-----------------------------------------------------------------------------
 LLKeyframeMotion::PositionCurve::~PositionCurve()
 {
-	mKeys.deleteAllData();
+	mKeys.clear();
 	mNumKeys = 0;
 }
 
@@ -310,46 +308,45 @@ LLKeyframeMotion::PositionCurve::~PositionCurve()
 LLVector3 LLKeyframeMotion::PositionCurve::getValue(F32 time, F32 duration)
 {
 	LLVector3 value;
-	F32 index_before, index_after;
-	PositionKey* pos_before;
-	PositionKey* pos_after;
 
-	mKeys.getInterval(time, index_before, index_after, pos_before, pos_after);
-
-	if (pos_before)
+	if (mKeys.empty())
 	{
-		if (!pos_after)
-		{
-			pos_after = &mLoopInKey;
-			index_after = duration;
-		}
-
-		if (index_after == index_before)
-		{
-			value = pos_after->mPosition;
-		}
-		else
-		{
-			F32 u = (time - index_before) / (index_after - index_before);
-			value = interp(u, *pos_before, *pos_after);
-		}
+		value.clearVec();
+		return value;
+	}
+	
+	key_map_t::iterator right = mKeys.lower_bound(time);
+	if (right == mKeys.end())
+	{
+		// Past last key
+		--right;
+		value = right->second.mPosition;
+	}
+	else if (right == mKeys.begin() || right->first == time)
+	{
+		// Before first key or exactly on a key
+		value = right->second.mPosition;
 	}
 	else
 	{
-		// before first key
-		if (pos_after)
-		{
-			value = pos_after->mPosition;
-		}
-		// no keys?
-		else
+		// Between two keys
+		key_map_t::iterator left = right; --left;
+		F32 index_before = left->first;
+		F32 index_after = right->first;
+		PositionKey& pos_before = left->second;
+		PositionKey& pos_after = right->second;
+		if (right == mKeys.end())
 		{
-			value.clearVec();
+			pos_after = mLoopInKey;
+			index_after = duration;
 		}
+
+		F32 u = (time - index_before) / (index_after - index_before);
+		value = interp(u, pos_before, pos_after);
 	}
 
 	llassert(value.isFinite());
-
+	
 	return value;
 }
 
@@ -1404,8 +1401,8 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				time = U16_to_F32(time_short, 0.f, mJointMotionList->mDuration);
 			}
 			
-			RotationKey *rot_key = new RotationKey;
-			rot_key->mTime = time;
+			RotationKey rot_key;
+			rot_key.mTime = time;
 			LLVector3 rot_angles;
 			U16 x, y, z;
 
@@ -1416,7 +1413,7 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				success = dp.unpackVector3(rot_angles, "rot_angles");
 
 				LLQuaternion::Order ro = StringToOrder("ZYX");
-				rot_key->mRotation = mayaQ(rot_angles.mV[VX], rot_angles.mV[VY], rot_angles.mV[VZ], ro);
+				rot_key.mRotation = mayaQ(rot_angles.mV[VX], rot_angles.mV[VY], rot_angles.mV[VZ], ro);
 			}
 			else
 			{
@@ -1428,13 +1425,12 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				rot_vec.mV[VX] = U16_to_F32(x, -1.f, 1.f);
 				rot_vec.mV[VY] = U16_to_F32(y, -1.f, 1.f);
 				rot_vec.mV[VZ] = U16_to_F32(z, -1.f, 1.f);
-				rot_key->mRotation.unpackFromVector3(rot_vec);
+				rot_key.mRotation.unpackFromVector3(rot_vec);
 			}
 
 			if (!success)
 			{
 				llwarns << "can't read rotation key (" << k << ")" << llendl;
-				delete rot_key;
 				return FALSE;
 			}
 
@@ -1464,14 +1460,13 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 		for (S32 k = 0; k < joint_motion->mPositionCurve.mNumKeys; k++)
 		{
 			U16 time_short;
-			PositionKey* pos_key = new PositionKey;
+			PositionKey pos_key;
 
 			if (old_version)
 			{
-				if (!dp.unpackF32(pos_key->mTime, "time"))
+				if (!dp.unpackF32(pos_key.mTime, "time"))
 				{
 					llwarns << "can't read position key (" << k << ")" << llendl;
-					delete pos_key;
 					return FALSE;
 				}
 			}
@@ -1480,18 +1475,17 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				if (!dp.unpackU16(time_short, "time"))
 				{
 					llwarns << "can't read position key (" << k << ")" << llendl;
-					delete pos_key;
 					return FALSE;
 				}
 
-				pos_key->mTime = U16_to_F32(time_short, 0.f, mJointMotionList->mDuration);
+				pos_key.mTime = U16_to_F32(time_short, 0.f, mJointMotionList->mDuration);
 			}
 
 			BOOL success = TRUE;
 
 			if (old_version)
 			{
-				success = dp.unpackVector3(pos_key->mPosition, "pos");
+				success = dp.unpackVector3(pos_key.mPosition, "pos");
 			}
 			else
 			{
@@ -1501,23 +1495,22 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)
 				success &= dp.unpackU16(y, "pos_y");
 				success &= dp.unpackU16(z, "pos_z");
 
-				pos_key->mPosition.mV[VX] = U16_to_F32(x, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
-				pos_key->mPosition.mV[VY] = U16_to_F32(y, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
-				pos_key->mPosition.mV[VZ] = U16_to_F32(z, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+				pos_key.mPosition.mV[VX] = U16_to_F32(x, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+				pos_key.mPosition.mV[VY] = U16_to_F32(y, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+				pos_key.mPosition.mV[VZ] = U16_to_F32(z, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
 			}
 
 			if (!success)
 			{
 				llwarns << "can't read position key (" << k << ")" << llendl;
-				delete pos_key;
 				return FALSE;
 			}
 			
-			pCurve->mKeys[pos_key->mTime] = pos_key;
+			pCurve->mKeys[pos_key.mTime] = pos_key;
 
 			if (is_pelvis)
 			{
-				mJointMotionList->mPelvisBBox.addPoint(pos_key->mPosition);
+				mJointMotionList->mPelvisBBox.addPoint(pos_key.mPosition);
 			}
 		}
 
@@ -1724,14 +1717,14 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
 		success &= dp.packS32(joint_motionp->mPriority, "joint_priority");
 		success &= dp.packS32(joint_motionp->mRotationCurve.mNumKeys, "num_rot_keys");
 
-		for (RotationKey* rot_keyp = joint_motionp->mRotationCurve.mKeys.getFirstData();
-			rot_keyp;
-			rot_keyp = joint_motionp->mRotationCurve.mKeys.getNextData())
+		for (RotationCurve::key_map_t::iterator iter = joint_motionp->mRotationCurve.mKeys.begin();
+			 iter != joint_motionp->mRotationCurve.mKeys.end(); ++iter)
 		{
-			U16 time_short = F32_to_U16(rot_keyp->mTime, 0.f, mJointMotionList->mDuration);
+			RotationKey& rot_key = iter->second;
+			U16 time_short = F32_to_U16(rot_key.mTime, 0.f, mJointMotionList->mDuration);
 			success &= dp.packU16(time_short, "time");
 
-			LLVector3 rot_angles = rot_keyp->mRotation.packToVector3();
+			LLVector3 rot_angles = rot_key.mRotation.packToVector3();
 			
 			U16 x, y, z;
 			rot_angles.quantize16(-1.f, 1.f, -1.f, 1.f);
@@ -1744,18 +1737,18 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const
 		}
 
 		success &= dp.packS32(joint_motionp->mPositionCurve.mNumKeys, "num_pos_keys");
-		for (PositionKey* pos_keyp = joint_motionp->mPositionCurve.mKeys.getFirstData();
-			pos_keyp;
-			pos_keyp = joint_motionp->mPositionCurve.mKeys.getNextData())
+		for (PositionCurve::key_map_t::iterator iter = joint_motionp->mPositionCurve.mKeys.begin();
+			 iter != joint_motionp->mPositionCurve.mKeys.end(); ++iter)
 		{
-			U16 time_short = F32_to_U16(pos_keyp->mTime, 0.f, mJointMotionList->mDuration);
+			PositionKey& pos_key = iter->second;
+			U16 time_short = F32_to_U16(pos_key.mTime, 0.f, mJointMotionList->mDuration);
 			success &= dp.packU16(time_short, "time");
 
 			U16 x, y, z;
-			pos_keyp->mPosition.quantize16(-LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
-			x = F32_to_U16(pos_keyp->mPosition.mV[VX], -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
-			y = F32_to_U16(pos_keyp->mPosition.mV[VY], -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
-			z = F32_to_U16(pos_keyp->mPosition.mV[VZ], -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+			pos_key.mPosition.quantize16(-LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET, -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+			x = F32_to_U16(pos_key.mPosition.mV[VX], -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+			y = F32_to_U16(pos_key.mPosition.mV[VY], -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
+			z = F32_to_U16(pos_key.mPosition.mV[VZ], -LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET);
 			success &= dp.packU16(x, "pos_x");
 			success &= dp.packU16(y, "pos_y");
 			success &= dp.packU16(z, "pos_z");
diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h
index 8d6ebbf4b7c7ee493af987f44f846b758ee1cf7d..c383e5e99e555c1d961c45653222bdf349451a13 100644
--- a/indra/llcharacter/llkeyframemotion.h
+++ b/indra/llcharacter/llkeyframemotion.h
@@ -43,7 +43,6 @@
 #include "llhandmotion.h"
 #include "lljointstate.h"
 #include "llmotion.h"
-#include "llptrskipmap.h"
 #include "llquaternion.h"
 #include "v3dmath.h"
 #include "v3math.h"
@@ -338,7 +337,8 @@ public:
 
 		InterpolationType	mInterpolationType;
 		S32					mNumKeys;
-		LLPtrSkipMap<F32, ScaleKey*>			mKeys;
+		typedef std::map<F32, ScaleKey> key_map_t;
+		key_map_t 			mKeys;
 		ScaleKey			mLoopInKey;
 		ScaleKey			mLoopOutKey;
 	};
@@ -356,7 +356,8 @@ public:
 
 		InterpolationType	mInterpolationType;
 		S32					mNumKeys;
-		LLPtrSkipMap<F32, RotationKey*>		mKeys;
+		typedef std::map<F32, RotationKey> key_map_t;
+		key_map_t		mKeys;
 		RotationKey		mLoopInKey;
 		RotationKey		mLoopOutKey;
 	};
@@ -374,7 +375,8 @@ public:
 
 		InterpolationType	mInterpolationType;
 		S32					mNumKeys;
-		LLPtrSkipMap<F32, PositionKey*>		mKeys;
+		typedef std::map<F32, PositionKey> key_map_t;
+		key_map_t		mKeys;
 		PositionKey		mLoopInKey;
 		PositionKey		mLoopOutKey;
 	};
diff --git a/indra/llcharacter/llkeyframemotionparam.cpp b/indra/llcharacter/llkeyframemotionparam.cpp
index f54d1f4a839d7b96031bc88447e6608df2113b9b..30edc29c6e455e22fa5115e17e1ecf9752317826 100644
--- a/indra/llcharacter/llkeyframemotionparam.cpp
+++ b/indra/llcharacter/llkeyframemotionparam.cpp
@@ -47,14 +47,6 @@
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
-//-----------------------------------------------------------------------------
-// sortFunc()
-//-----------------------------------------------------------------------------
-BOOL LLKeyframeMotionParam::sortFunc(ParameterizedMotion *new_motion, ParameterizedMotion *tested_motion)
-{
-	return (new_motion->second < tested_motion->second);
-}
-
 //-----------------------------------------------------------------------------
 // LLKeyframeMotionParam()
 // Class Constructor
@@ -77,17 +69,18 @@ LLKeyframeMotionParam::LLKeyframeMotionParam( const LLUUID &id) : LLMotion(id)
 //-----------------------------------------------------------------------------
 LLKeyframeMotionParam::~LLKeyframeMotionParam()
 {
-	for (U32 i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-			delete paramMotion->first;
+			const ParameterizedMotion& paramMotion = *iter2;
+			delete paramMotion.first; // note - deletes the structure; ParameterizedMotion pair remains intact
 		}
-		delete motionList;
+		motionList.clear();
 	}
-
-	mParameterizedMotions.removeAll();
+	mParameterizedMotions.clear();
 }
 
 //-----------------------------------------------------------------------------
@@ -102,36 +95,39 @@ LLMotion::LLMotionInitStatus LLKeyframeMotionParam::onInitialize(LLCharacter *ch
 		return STATUS_FAILURE;	
 	}
 	
-	for (U32 i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-			paramMotion->first->onInitialize(character);
+			const ParameterizedMotion& paramMotion = *iter2;
 
-			if (paramMotion->first->getDuration() > mEaseInDuration)
+			paramMotion.first->onInitialize(character);
+
+			if (paramMotion.first->getDuration() > mEaseInDuration)
 			{
-				mEaseInDuration = paramMotion->first->getEaseInDuration();
+				mEaseInDuration = paramMotion.first->getEaseInDuration();
 			}
 
-			if (paramMotion->first->getEaseOutDuration() > mEaseOutDuration)
+			if (paramMotion.first->getEaseOutDuration() > mEaseOutDuration)
 			{
-				mEaseOutDuration = paramMotion->first->getEaseOutDuration();
+				mEaseOutDuration = paramMotion.first->getEaseOutDuration();
 			}
 
-			if (paramMotion->first->getDuration() > mDuration)
+			if (paramMotion.first->getDuration() > mDuration)
 			{
-				mDuration = paramMotion->first->getDuration();
+				mDuration = paramMotion.first->getDuration();
 			}
 
-			if (paramMotion->first->getPriority() > mPriority)
+			if (paramMotion.first->getPriority() > mPriority)
 			{
-				mPriority = paramMotion->first->getPriority();
+				mPriority = paramMotion.first->getPriority();
 			}
 
-			LLPose *pose = paramMotion->first->getPose();
+			LLPose *pose = paramMotion.first->getPose();
 
-			mPoseBlender.addMotion(paramMotion->first);
+			mPoseBlender.addMotion(paramMotion.first);
 			for (LLJointState *jsp = pose->getFirstJointState(); jsp; jsp = pose->getNextJointState())
 			{
 				LLPose *blendedPose = mPoseBlender.getBlendedPose();
@@ -148,12 +144,14 @@ LLMotion::LLMotionInitStatus LLKeyframeMotionParam::onInitialize(LLCharacter *ch
 //-----------------------------------------------------------------------------
 BOOL LLKeyframeMotionParam::onActivate()
 {
-	for (U32 i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-			paramMotion->first->activate();
+			const ParameterizedMotion& paramMotion = *iter2;
+			paramMotion.first->activate();
 		}
 	}
 	return TRUE;
@@ -165,46 +163,48 @@ BOOL LLKeyframeMotionParam::onActivate()
 //-----------------------------------------------------------------------------
 BOOL LLKeyframeMotionParam::onUpdate(F32 time, U8* joint_mask)
 {
-	F32 weightFactor = 1.f / (F32)mParameterizedMotions.length();
-	U32 i;
+	F32 weightFactor = 1.f / (F32)mParameterizedMotions.size();
 
 	// zero out all pose weights
-	for (i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-//			llinfos << "Weight for pose " << paramMotion->first->getName() << " is " << paramMotion->first->getPose()->getWeight() << llendl;
-			paramMotion->first->getPose()->setWeight(0.f);
+			const ParameterizedMotion& paramMotion = *iter2;
+//			llinfos << "Weight for pose " << paramMotion.first->getName() << " is " << paramMotion.first->getPose()->getWeight() << llendl;
+			paramMotion.first->getPose()->setWeight(0.f);
 		}
 	}
 
 
-	for (i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-		std::string *paramName = mParameterizedMotions.getIndexAt(i);
-		F32* paramValue = (F32 *)mCharacter->getAnimationData(*paramName);
-		ParameterizedMotion* firstMotion = NULL;
-		ParameterizedMotion* secondMotion = NULL;
-
+		const std::string& paramName = iter->first;
+		F32* paramValue = (F32 *)mCharacter->getAnimationData(paramName);
 		if (NULL == paramValue) // unexpected, but...
 		{
 			llwarns << "paramValue == NULL" << llendl;
 			continue;
 		}
 
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		const ParameterizedMotion* firstMotion = NULL;
+		const ParameterizedMotion* secondMotion = NULL;
+
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-			paramMotion->first->onUpdate(time, joint_mask);
+			const ParameterizedMotion& paramMotion = *iter2;
+			paramMotion.first->onUpdate(time, joint_mask);
 			
-			F32 distToParam = paramMotion->second - *paramValue;
+			F32 distToParam = paramMotion.second - *paramValue;
 			
 			if ( distToParam <= 0.f)
 			{
 				// keep track of the motion closest to the parameter value
-				firstMotion = paramMotion;
+				firstMotion = &paramMotion;
 			}
 			else
 			{
@@ -212,13 +212,13 @@ BOOL LLKeyframeMotionParam::onUpdate(F32 time, U8* joint_mask)
 				// so store the first motion we find as the second one we want to blend...
 				if (firstMotion && !secondMotion )
 				{
-					secondMotion = paramMotion;
+					secondMotion = &paramMotion;
 				}
 				//...or, if we've seen no other motion so far, make sure we blend to this only
 				else if (!firstMotion)
 				{
-					firstMotion = paramMotion;
-					secondMotion = paramMotion;
+					firstMotion = &paramMotion;
+					secondMotion = &paramMotion;
 				}
 			}
 		}
@@ -283,12 +283,14 @@ BOOL LLKeyframeMotionParam::onUpdate(F32 time, U8* joint_mask)
 //-----------------------------------------------------------------------------
 void LLKeyframeMotionParam::onDeactivate()
 {
-	for (U32 i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-			paramMotion->first->onDeactivate();
+			const ParameterizedMotion& paramMotion = *iter2;
+			paramMotion.first->onDeactivate();
 		}
 	}
 }
@@ -307,23 +309,8 @@ BOOL LLKeyframeMotionParam::addKeyframeMotion(char *name, const LLUUID &id, char
 	
 	newMotion->setName(name);
 
-	// make sure a list of motions exists for this parameter
-	LLLinkedList< ParameterizedMotion > *motionList;
-	if (mParameterizedMotions.getValue(param))
-	{
-		motionList = *mParameterizedMotions.getValue(param);
-	}
-	else
-	{
-		motionList = new LLLinkedList< ParameterizedMotion >;
-		motionList->setInsertBefore(sortFunc);
-		mParameterizedMotions.addToHead(param, motionList);
-	}
-
 	// now add motion to this list
-	ParameterizedMotion *parameterizedMotion = new ParameterizedMotion(newMotion, value);
-
-	motionList->addDataSorted(parameterizedMotion);
+	mParameterizedMotions[param].insert(ParameterizedMotion(newMotion, value));
 
 	return TRUE;
 }
@@ -334,14 +321,16 @@ BOOL LLKeyframeMotionParam::addKeyframeMotion(char *name, const LLUUID &id, char
 //-----------------------------------------------------------------------------
 void LLKeyframeMotionParam::setDefaultKeyframeMotion(char *name)
 {
-	for (U32 i = 0; i < mParameterizedMotions.length(); i++)
+	for (motion_map_t::iterator iter = mParameterizedMotions.begin();
+		 iter != mParameterizedMotions.end(); ++iter)
 	{
-		LLLinkedList< ParameterizedMotion > *motionList = *mParameterizedMotions.getValueAt(i);
-		for (ParameterizedMotion* paramMotion = motionList->getFirstData(); paramMotion; paramMotion = motionList->getNextData())
+		motion_list_t& motionList = iter->second;
+		for (motion_list_t::iterator iter2 = motionList.begin(); iter2 != motionList.end(); ++iter2)
 		{
-			if (paramMotion->first->getName() == name)
+			const ParameterizedMotion& paramMotion = *iter2;
+			if (paramMotion.first->getName() == name)
 			{
-				mDefaultKeyframeMotion = paramMotion->first;
+				mDefaultKeyframeMotion = paramMotion.first;
 			}
 		}
 	}
diff --git a/indra/llcharacter/llkeyframemotionparam.h b/indra/llcharacter/llkeyframemotionparam.h
index 39a02aea251a2abce9a8472fe90063a88ee0b224..305207eb0918ac25e22d580542360cfb04341ffa 100644
--- a/indra/llcharacter/llkeyframemotionparam.h
+++ b/indra/llcharacter/llkeyframemotionparam.h
@@ -143,8 +143,20 @@ protected:
 	// Member Data
 	//-------------------------------------------------------------------------
 
-	typedef LLLinkedList < ParameterizedMotion >	motion_list_t;
-	LLAssocList <std::string, motion_list_t* > mParameterizedMotions;
+	struct compare_motions
+	{
+		bool operator() (const ParameterizedMotion& a, const ParameterizedMotion& b) const
+		{
+			if (a.second != b.second)
+				return (a.second < b.second);
+			else
+				return a.first < b.first;
+		}
+	};
+	
+	typedef std::set < ParameterizedMotion, compare_motions > motion_list_t;
+	typedef std::map <std::string, motion_list_t > motion_map_t;
+	motion_map_t 		mParameterizedMotions;
 	LLMotion*			mDefaultKeyframeMotion;
 	LLCharacter*		mCharacter;
 	LLPoseBlender		mPoseBlender;
diff --git a/indra/llcharacter/llpose.h b/indra/llcharacter/llpose.h
index 5ba579a167c2851418f6c14205cceca191e51d97..0c71fd77b39df78ed9fe26059156941f38b8a4af 100644
--- a/indra/llcharacter/llpose.h
+++ b/indra/llcharacter/llpose.h
@@ -37,10 +37,8 @@
 //-----------------------------------------------------------------------------
 #include <string>
 
-#include "linked_lists.h"
 #include "llmap.h"
 #include "lljointstate.h"
-#include "llassoclist.h"
 #include "lljoint.h"
 #include <map>
 
diff --git a/indra/llcharacter/llstatemachine.h b/indra/llcharacter/llstatemachine.h
index 69837291475857963522dcc8e293879f8b0eb356..c19a926dbb8afd35db80055f100ae5a8e2cc88bf 100644
--- a/indra/llcharacter/llstatemachine.h
+++ b/indra/llcharacter/llstatemachine.h
@@ -34,7 +34,6 @@
 
 #include <string>
 
-#include "llassoclist.h"
 #include "llerror.h"
 #include <map>
 
diff --git a/indra/llcommon/linden_common.h b/indra/llcommon/linden_common.h
index 504552a9d22a8f4f552a691f963b3bd2ef6cbafd..9ee4d1159e3f1f566676eee9b0be30f60a133236 100644
--- a/indra/llcommon/linden_common.h
+++ b/indra/llcommon/linden_common.h
@@ -62,6 +62,7 @@
 #pragma warning (disable : 4100) // unreferenced formal parameter
 #pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
 #pragma warning (disable : 4244) // possible loss of data on conversions
+#pragma warning (disable : 4396) // the inline specifier cannot be used when a friend declaration refers to a specialization of a function template
 #pragma warning (disable : 4512) // assignment operator could not be generated
 #pragma warning (disable : 4706) // assignment within conditional (even if((x = y)) )
 #endif	//	LL_WINDOWS
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 7346b29fb1752e8bb55fa47d0d2ea80ccad21ee3..98393dacd10ffd1f684b43961a569eb80ee1d041 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -679,7 +679,8 @@ BOOL gunzip_file(const char *srcfile, const char *dstfile)
 		size_t nwrit = fwrite(buffer, sizeof(U8), bytes, dst);
 		if (nwrit < (size_t) bytes)
 		{
-			llerrs << "Short write on " << tmpfile << llendl;
+			llwarns << "Short write on " << tmpfile << ": Wrote " << nwrit << " of " << bytes << " bytes." << llendl;
+			goto err;
 		}
 	} while(gzeof(src) == 0);
 	fclose(dst); 
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 65db226ff972988ebdbb905f6275e9588da346f6..02b956d86c718310e6a15c28feef21d09d134dc4 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -34,8 +34,8 @@
 
 const S32 LL_VERSION_MAJOR = 1;
 const S32 LL_VERSION_MINOR = 19;
-const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 5;
+const S32 LL_VERSION_PATCH = 1;
+const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Release";
 
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index 81001a2c9dbefff574b6ce2da313199bfbad9d76..15beeec8661a0b15b5fec64e1d86e53ad4b2adfd 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -332,6 +332,12 @@ void LLParcel::setMediaType(const char* type)
 	// abstraction layer.
 	set_std_string(type, mMediaType);
 	mMediaType = rawstr_to_utf8(mMediaType);
+
+	// This code attempts to preserve legacy movie functioning
+	if(mMediaType.empty() && ! mMediaURL.empty())
+	{
+		setMediaType("video/vnd.secondlife.qt.legacy");
+	}
 }
 void LLParcel::setMediaWidth(S32 width)
 {
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index ab2eef0ee92897cf1d0cb5fb1e0c6eb76625df31..44fef9daf60d18d9db83984e3f16a76e7aa6303f 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -1854,55 +1854,70 @@ inline LLVector3 sculpt_rgb_to_vector(U8 r, U8 g, U8 b)
 	return value;
 }
 
+inline U32 sculpt_xy_to_index(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components)
+{
+	U32 index = (x + y * sculpt_width) * sculpt_components;
 
-// sculpt replaces generate() for sculpted surfaces
-void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level)
+	// attempt to resolve DEV-11158 - remove assert later.
+	llassert(index < sculpt_width * sculpt_height * sculpt_components);
+	
+	return index;
+}
+
+
+inline U32 sculpt_st_to_index(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components)
 {
-    U8 sculpt_type = mParams.getSculptType();
+	U32 x = (U32) ((F32)s/(size_s) * (F32) sculpt_width);
+	U32 y = (U32) ((F32)t/(size_t) * (F32) sculpt_height);
 
-	BOOL data_is_empty = FALSE;
+	return sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components);
+}
 
-	if (sculpt_width == 0 || sculpt_height == 0 || sculpt_data == NULL)
-	{
-		sculpt_level = -1;
-		data_is_empty = TRUE;
-	}
 
-	mPathp->generate(mDetail, 0, TRUE);
-	mProfilep->generate(mPathp->isOpen(), mDetail, 0, TRUE);
-	
+inline LLVector3 sculpt_index_to_vector(U32 index, const U8* sculpt_data)
+{
+	LLVector3 v = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]);
+
+	return v;
+}
+
+inline LLVector3 sculpt_st_to_vector(S32 s, S32 t, S32 size_s, S32 size_t, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data)
+{
+	U32 index = sculpt_st_to_index(s, t, size_s, size_t, sculpt_width, sculpt_height, sculpt_components);
+
+	return sculpt_index_to_vector(index, sculpt_data);
+}
+
+inline LLVector3 sculpt_xy_to_vector(U32 x, U32 y, U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data)
+{
+	U32 index = sculpt_xy_to_index(x, y, sculpt_width, sculpt_height, sculpt_components);
+
+	return sculpt_index_to_vector(index, sculpt_data);
+}
+
+
+F32 LLVolume::sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data)
+{
+	// test to see if image has enough variation to create non-degenerate geometry
+
 	S32 sizeS = mPathp->mPath.size();
 	S32 sizeT = mProfilep->mProfile.size();
 
-	sNumMeshPoints -= mMesh.size();
-	mMesh.resize(sizeS * sizeT);
-	sNumMeshPoints += mMesh.size();
-
 	F32 area = 0;
-	// first test to see if image has enough variation to create non-degenerate geometry
-	if (!data_is_empty)
+	
+	if ((sculpt_width != 0) &&
+		(sculpt_height != 0) &&
+		(sculpt_components != 0) &&
+		(sculpt_data != NULL))
 	{
 		for (S32 s = 0; s < sizeS - 1; s++)
 		{
 			for (S32 t = 0; t < sizeT - 1; t++)
 			{
-				// first coordinate
-				U32 x = (U32) ((F32)s/(sizeS) * (F32) sculpt_width);
-				U32 y = (U32) ((F32)t/(sizeT) * (F32) sculpt_height);
-
-				// coordinate offset by 1
-				U32 x2 = (U32) ((F32)(s+1)/(sizeS) * (F32) sculpt_width);
-				U32 y2 = (U32) ((F32)(t+1)/(sizeT) * (F32) sculpt_height);
-					
-				// three points on a triagle - find the image indices first
-				U32 p1_index = (x + y * sculpt_width) * sculpt_components;
-				U32 p2_index = (x2 + y * sculpt_width) * sculpt_components;
-				U32 p3_index = (x + y2 * sculpt_width) * sculpt_components;
-
 				// convert image data to vectors
-				LLVector3 p1 = sculpt_rgb_to_vector(sculpt_data[p1_index], sculpt_data[p1_index+1], sculpt_data[p1_index+2]);
-				LLVector3 p2 = sculpt_rgb_to_vector(sculpt_data[p2_index], sculpt_data[p2_index+1], sculpt_data[p2_index+2]);
-				LLVector3 p3 = sculpt_rgb_to_vector(sculpt_data[p3_index], sculpt_data[p3_index+1], sculpt_data[p3_index+2]);
+				LLVector3 p1 = sculpt_st_to_vector(s, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data);
+				LLVector3 p2 = sculpt_st_to_vector(s+1, t, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data);
+				LLVector3 p3 = sculpt_st_to_vector(s, t+1, sizeS, sizeT, sculpt_width, sculpt_height, sculpt_components, sculpt_data);
 
 				// compute the area of the parallelogram by taking the length of the cross product:
 				// (parallegram is an approximation of two triangles)
@@ -1910,99 +1925,151 @@ void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components,
 				area += cross.magVec();
 			}
 		}
-		if (area < SCULPT_MIN_AREA)
-			data_is_empty = TRUE;
 	}
 
-	//generate vertex positions
-	if (data_is_empty) // if empty, make a sphere
-	{
-		S32 line = 0;
+	return area;
+}
+
+// create placeholder shape
+void LLVolume::sculptGeneratePlaceholder()
+{
+	S32 sizeS = mPathp->mPath.size();
+	S32 sizeT = mProfilep->mProfile.size();
+	
+	S32 line = 0;
 
-		for (S32 s = 0; s < sizeS; s++)
+	// for now, this is a sphere.
+	for (S32 s = 0; s < sizeS; s++)
+	{
+		for (S32 t = 0; t < sizeT; t++)
 		{
-			for (S32 t = 0; t < sizeT; t++)
-			{
-				S32 i = t + line;
-				Point& pt = mMesh[i];
+			S32 i = t + line;
+			Point& pt = mMesh[i];
 
 			
-				F32 u = (F32)s/(sizeS-1);
-				F32 v = (F32)t/(sizeT-1);
+			F32 u = (F32)s/(sizeS-1);
+			F32 v = (F32)t/(sizeT-1);
 
-				const F32 RADIUS = (F32) 0.3;
+			const F32 RADIUS = (F32) 0.3;
 					
-				pt.mPos.mV[0] = (F32)(sin(F_PI * v) * cos(2.0 * F_PI * u) * RADIUS);
-				pt.mPos.mV[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS);
-				pt.mPos.mV[2] = (F32)(cos(F_PI * v) * RADIUS);
+			pt.mPos.mV[0] = (F32)(sin(F_PI * v) * cos(2.0 * F_PI * u) * RADIUS);
+			pt.mPos.mV[1] = (F32)(sin(F_PI * v) * sin(2.0 * F_PI * u) * RADIUS);
+			pt.mPos.mV[2] = (F32)(cos(F_PI * v) * RADIUS);
 
-			}
-			line += sizeT;
 		}
-	}	
-	else
+		line += sizeT;
+	}
+}
+
+// create the vertices from the map
+void LLVolume::sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type)
+{
+	S32 sizeS = mPathp->mPath.size();
+	S32 sizeT = mProfilep->mProfile.size();
+	
+	S32 line = 0;
+	for (S32 s = 0; s < sizeS; s++)
 	{
-		S32 line = 0;
-		for (S32 s = 0; s < sizeS; s++)
+		// Run along the profile.
+		for (S32 t = 0; t < sizeT; t++)
 		{
-			// Run along the profile.
-			for (S32 t = 0; t < sizeT; t++)
-			{
-				S32 i = t + line;
-				Point& pt = mMesh[i];
+			S32 i = t + line;
+			Point& pt = mMesh[i];
 
-				U32 x = (U32) ((F32)t/(sizeT-1) * (F32) sculpt_width);
-				U32 y = (U32) ((F32)s/(sizeS-1) * (F32) sculpt_height);
+			U32 x = (U32) ((F32)t/(sizeT-1) * (F32) sculpt_width);
+			U32 y = (U32) ((F32)s/(sizeS-1) * (F32) sculpt_height);
 
-				if (y == 0)  // top row stitching
+			if (y == 0)  // top row stitching
+			{
+				// pinch?
+				if (sculpt_type == LL_SCULPT_TYPE_SPHERE)
 				{
-					// pinch?
-					if (sculpt_type == LL_SCULPT_TYPE_SPHERE)
-					{
-						x = sculpt_width / 2;
-					}
+					x = sculpt_width / 2;
 				}
+			}
 
-				if (y == sculpt_height)  // bottom row stitching
+			if (y == sculpt_height)  // bottom row stitching
+			{
+				// wrap?
+				if (sculpt_type == LL_SCULPT_TYPE_TORUS)
 				{
-					// wrap?
-					if (sculpt_type == LL_SCULPT_TYPE_TORUS)
-					{
-						y = 0;
-					}
-					else
-					{
-						y = sculpt_height - 1;
-					}
+					y = 0;
+				}
+				else
+				{
+					y = sculpt_height - 1;
+				}
 
-					// pinch?
-					if (sculpt_type == LL_SCULPT_TYPE_SPHERE)
-					{
-						x = sculpt_width / 2;
-					}
+				// pinch?
+				if (sculpt_type == LL_SCULPT_TYPE_SPHERE)
+				{
+					x = sculpt_width / 2;
 				}
+			}
 
-				if (x == sculpt_width)   // side stitching
+			if (x == sculpt_width)   // side stitching
+			{
+				// wrap?
+				if ((sculpt_type == LL_SCULPT_TYPE_SPHERE) ||
+					(sculpt_type == LL_SCULPT_TYPE_TORUS) ||
+					(sculpt_type == LL_SCULPT_TYPE_CYLINDER))
 				{
-					// wrap?
-					if ((sculpt_type == LL_SCULPT_TYPE_SPHERE) ||
-						(sculpt_type == LL_SCULPT_TYPE_TORUS) ||
-						(sculpt_type == LL_SCULPT_TYPE_CYLINDER))
-					{
-						x = 0;
-					}
+					x = 0;
+				}
 					
-					else
-					{
-						x = sculpt_width - 1;
-					}
+				else
+				{
+					x = sculpt_width - 1;
 				}
-
-				U32 index = (x + y * sculpt_width) * sculpt_components;
-				pt.mPos = sculpt_rgb_to_vector(sculpt_data[index], sculpt_data[index+1], sculpt_data[index+2]);
 			}
-			line += sizeT;
+
+			pt.mPos = sculpt_xy_to_vector(x, y, sculpt_width, sculpt_height, sculpt_components, sculpt_data);
 		}
+		line += sizeT;
+	}
+}
+
+
+// sculpt replaces generate() for sculpted surfaces
+void LLVolume::sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level)
+{
+    U8 sculpt_type = mParams.getSculptType();
+
+	BOOL data_is_empty = FALSE;
+
+	if (sculpt_width == 0 || sculpt_height == 0 || sculpt_components == 0 || sculpt_data == NULL)
+	{
+		sculpt_level = -1;
+		data_is_empty = TRUE;
+	}
+
+	mPathp->generate(mDetail, 0, TRUE);
+	mProfilep->generate(mPathp->isOpen(), mDetail, 0, TRUE);
+
+	S32 sizeS = mPathp->mPath.size();
+	S32 sizeT = mProfilep->mProfile.size();
+
+	// weird crash bug - DEV-11158 - trying to collect more data:
+	if ((sizeS == 0) || (sizeT == 0))
+	{
+		llwarns << "sculpt bad mesh size " << sizeS << " " << sizeT << llendl;
+	}
+	
+	sNumMeshPoints -= mMesh.size();
+	mMesh.resize(sizeS * sizeT);
+	sNumMeshPoints += mMesh.size();
+	
+	if (sculptGetSurfaceArea(sculpt_width, sculpt_height, sculpt_components, sculpt_data) < SCULPT_MIN_AREA)
+		data_is_empty = TRUE;
+
+	//generate vertex positions
+	if (data_is_empty) // if empty, make a placeholder mesh
+	{
+		sculptGeneratePlaceholder();
+	}	
+	else
+	{
+		sculptGenerateMapVertices(sculpt_width, sculpt_height, sculpt_components, sculpt_data, sculpt_type);
 	}
 
 	for (S32 i = 0; i < (S32)mProfilep->mFaces.size(); i++)
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 3e6194794788a32b86ef2938d93cfd10fd08d7e8..9af02d26292e950b6c74877ad732c88662a6c681 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -903,6 +903,10 @@ public:
 	LLVector3			mLODScaleBias;		// vector for biasing LOD based on scale
 	
 	void sculpt(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, S32 sculpt_level);
+private:
+	F32 sculptGetSurfaceArea(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data);
+	void sculptGenerateMapVertices(U16 sculpt_width, U16 sculpt_height, S8 sculpt_components, const U8* sculpt_data, U8 sculpt_type);
+	void sculptGeneratePlaceholder();
 	
 protected:
 	BOOL generate();
diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h
index 1a6611f5d4a42a04232182e766ce12ac4abb2e14..8824e6825acb62eefb6aad0b1a2194cbeb2fb5de 100644
--- a/indra/llmessage/llcircuit.h
+++ b/indra/llmessage/llcircuit.h
@@ -37,7 +37,6 @@
 #include <vector>
 
 #include "llerror.h"
-#include "linked_lists.h"
 
 #include "lltimer.h"
 #include "timing.h"
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 8afcb6ba4f461bf77004fc2b487f71040fdaddc2..8b9a45ff3f406543e95159c3c1c68d72a8683d94 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -121,6 +121,7 @@ void LLCurl::Responder::error(U32 status, const std::string& reason)
 // virtual
 void LLCurl::Responder::result(const LLSD& content)
 {
+	llwarns << "Virtual Function not implemented" << llendl;
 }
 
 // virtual
diff --git a/indra/llmessage/llnamevalue.h b/indra/llmessage/llnamevalue.h
index 1bdfeb23651e0f35340faa939b9df9dafa06855b..7a4c80f3f380a7547dfa3fc792a5891f5b5d85ef 100644
--- a/indra/llmessage/llnamevalue.h
+++ b/indra/llmessage/llnamevalue.h
@@ -33,7 +33,6 @@
 #define LL_LLNAMEVALUE_H
 
 #include "string_table.h"
-#include "llskipmap.h"
 #include "llmath.h"
 #include "v3math.h"
 #include "lldbstrings.h"
diff --git a/indra/llmessage/llpacketring.h b/indra/llmessage/llpacketring.h
index 109d5e60ddd759c5d5ad88ff1500425cf30ba8f0..0e1450ac1b5162a9621fb139013c4d497dcefec9 100644
--- a/indra/llmessage/llpacketring.h
+++ b/indra/llmessage/llpacketring.h
@@ -36,7 +36,6 @@
 #include <queue>
 
 #include "llpacketbuffer.h"
-#include "linked_lists.h"
 #include "llhost.h"
 #include "net.h"
 #include "llthrottle.h"
diff --git a/indra/llmessage/llxfermanager.cpp b/indra/llmessage/llxfermanager.cpp
index c4dd3406b4b8eca61eb5b7a79c8db6946d70fede..a612e181cd355d878bd04c44438f8bd24c216ea9 100644
--- a/indra/llmessage/llxfermanager.cpp
+++ b/indra/llmessage/llxfermanager.cpp
@@ -90,8 +90,9 @@ void LLXferManager::free ()
 {
 	LLXfer *xferp;
 	LLXfer *delp;
-	
-	mOutgoingHosts.deleteAllData();
+
+	for_each(mOutgoingHosts.begin(), mOutgoingHosts.end(), DeletePointer());
+	mOutgoingHosts.clear();
 
 	delp = mSendList;
 	while (delp)
@@ -155,12 +156,15 @@ void LLXferManager::updateHostStatus()
     LLXfer *xferp;
 	LLHostStatus *host_statusp = NULL;
 
-	mOutgoingHosts.deleteAllData();
+	for_each(mOutgoingHosts.begin(), mOutgoingHosts.end(), DeletePointer());
+	mOutgoingHosts.clear();
 
 	for (xferp = mSendList; xferp; xferp = xferp->mNext)
 	{
-		for (host_statusp = mOutgoingHosts.getFirstData(); host_statusp; host_statusp = mOutgoingHosts.getNextData())
+		for (status_list_t::iterator iter = mOutgoingHosts.begin();
+			 iter != mOutgoingHosts.end(); ++iter)
 		{
+			host_statusp = *iter;
 			if (host_statusp->mHost == xferp->mRemoteHost)
 			{
 				break;
@@ -172,7 +176,7 @@ void LLXferManager::updateHostStatus()
 			if (host_statusp)
 			{
 				host_statusp->mHost = xferp->mRemoteHost;
-				mOutgoingHosts.addData(host_statusp);
+				mOutgoingHosts.push_front(host_statusp);
 			}
 		}
 		if (host_statusp)
@@ -195,12 +199,14 @@ void LLXferManager::updateHostStatus()
 void LLXferManager::printHostStatus()
 {
 	LLHostStatus *host_statusp = NULL;
-	if (mOutgoingHosts.getFirstData())
+	if (!mOutgoingHosts.empty())
 	{
 		llinfos << "Outgoing Xfers:" << llendl;
 
-		for (host_statusp = mOutgoingHosts.getFirstData(); host_statusp; host_statusp = mOutgoingHosts.getNextData())
+		for (status_list_t::iterator iter = mOutgoingHosts.begin();
+			 iter != mOutgoingHosts.end(); ++iter)
 		{
+			host_statusp = *iter;
 			llinfos << "    " << host_statusp->mHost << "  active: " << host_statusp->mNumActive << "  pending: " << host_statusp->mNumPending << llendl;
 		}
 	}	
@@ -275,8 +281,10 @@ S32 LLXferManager::numPendingXfers(const LLHost &host)
 {
 	LLHostStatus *host_statusp = NULL;
 
-	for (host_statusp = mOutgoingHosts.getFirstData(); host_statusp; host_statusp = mOutgoingHosts.getNextData())
+	for (status_list_t::iterator iter = mOutgoingHosts.begin();
+		 iter != mOutgoingHosts.end(); ++iter)
 	{
+		host_statusp = *iter;
 		if (host_statusp->mHost == host)
 		{
 			return (host_statusp->mNumPending);
@@ -291,8 +299,10 @@ S32 LLXferManager::numActiveXfers(const LLHost &host)
 {
 	LLHostStatus *host_statusp = NULL;
 
-	for (host_statusp = mOutgoingHosts.getFirstData(); host_statusp; host_statusp = mOutgoingHosts.getNextData())
+	for (status_list_t::iterator iter = mOutgoingHosts.begin();
+		 iter != mOutgoingHosts.end(); ++iter)
 	{
+		host_statusp = *iter;
 		if (host_statusp->mHost == host)
 		{
 			return (host_statusp->mNumActive);
@@ -307,8 +317,10 @@ void LLXferManager::changeNumActiveXfers(const LLHost &host, S32 delta)
 {
 	LLHostStatus *host_statusp = NULL;
 
-	for (host_statusp = mOutgoingHosts.getFirstData(); host_statusp; host_statusp = mOutgoingHosts.getNextData())
+	for (status_list_t::iterator iter = mOutgoingHosts.begin();
+		 iter != mOutgoingHosts.end(); ++iter)
 	{
+		host_statusp = *iter;
 		if (host_statusp->mHost == host)
 		{
 			host_statusp->mNumActive += delta;
@@ -1010,15 +1022,15 @@ void LLXferManager::startPendingDownloads()
 	// stateful iteration, it would be possible for old requests to
 	// never start.
 	LLXfer* xferp = mReceiveList;
-	LLLinkedList<LLXfer> pending_downloads;
+	std::list<LLXfer*> pending_downloads;
 	S32 download_count = 0;
 	S32 pending_count = 0;
 	while(xferp)
 	{
 		if(xferp->mStatus == e_LL_XFER_PENDING)
 		{
-			++pending_count; // getLength() is O(N), so track it here.
-			pending_downloads.addData(xferp);
+			++pending_count;
+			pending_downloads.push_front(xferp);
 		}
 		else if(xferp->mStatus == e_LL_XFER_IN_PROGRESS)
 		{
@@ -1036,16 +1048,18 @@ void LLXferManager::startPendingDownloads()
 	if((start_count > 0) && (pending_count > 0))
 	{
 		S32 result;
-		xferp = pending_downloads.getFirstData();
-		while(start_count-- && xferp)
+		for (std::list<LLXfer*>::iterator iter = pending_downloads.begin();
+			 iter != pending_downloads.end(); ++iter)
 		{
+			xferp = *iter;
+			if (start_count-- <= 0)
+				break;
 			result = xferp->startDownload();
 			if(result)
 			{
 				xferp->abort(result);
 				++start_count;
 			}
-			xferp = pending_downloads.getNextData();
 		}
 	}
 }
diff --git a/indra/llmessage/llxfermanager.h b/indra/llmessage/llxfermanager.h
index 5d213bbc71a03b47b0fe88a72d572d8187127469..c4af8fe93705bb3b5b74757bbbfa1191850e3ca5 100644
--- a/indra/llmessage/llxfermanager.h
+++ b/indra/llmessage/llxfermanager.h
@@ -45,7 +45,6 @@ class LLVFS;
 #include "llxfer.h"
 #include "message.h"
 #include "llassetstorage.h"
-#include "linked_lists.h"
 #include "lldir.h"
 #include "lllinkedqueue.h"
 #include "llthrottle.h"
@@ -101,7 +100,8 @@ class LLXferManager
 	LLXfer *mSendList;
 	LLXfer *mReceiveList;
 
-	LLLinkedList <LLHostStatus> mOutgoingHosts;
+	typedef std::list<LLHostStatus*> status_list_t;
+	status_list_t mOutgoingHosts;
 
  private:
  protected:
diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h
index 4debcddf990e5176d46559578e7e6e64079ff7c6..61d34b7fc1db7111fd3442a585e57550a8dd621a 100644
--- a/indra/llmessage/message.h
+++ b/indra/llmessage/message.h
@@ -216,8 +216,6 @@ class LLMessageSystem
 	LLPacketRing				mPacketRing;
 	LLReliablePacketParams			mReliablePacketParams;
 
-	//LLLinkedList<LLPacketAck>		mAckList;
-
 	// Set this flag to TRUE when you want *very* verbose logs.
 	BOOL mVerboseLog;
 
diff --git a/indra/llprimitive/llmaterialtable.cpp b/indra/llprimitive/llmaterialtable.cpp
index 9970a035d7e2db237ec9b0e00295b3902718f589..40cf97099c843d85bc855f311ccfa0d6c2e7ed36 100644
--- a/indra/llprimitive/llmaterialtable.cpp
+++ b/indra/llprimitive/llmaterialtable.cpp
@@ -32,6 +32,7 @@
 #include "linden_common.h"
 
 #include "llmaterialtable.h"
+#include "llstl.h"
 #include "material_codes.h"
 #include "sound_ids.h"
 #include "imageids.h"
@@ -70,7 +71,8 @@ LLMaterialTable::~LLMaterialTable()
 		mRollingSoundMatrix = NULL;
 	}
 
-	mMaterialInfoList.deleteAllData();
+	for_each(mMaterialInfoList.begin(), mMaterialInfoList.end(), DeletePointer());
+	mMaterialInfoList.clear();
 }
 
 void LLMaterialTable::initBasicTable()
@@ -290,7 +292,7 @@ BOOL LLMaterialTable::add(U8 mcode, char* name, const LLUUID &uuid)
 
 	// Add at the end so the order in menus matches the order in this
 	// file.  JNC 11.30.01
-	mMaterialInfoList.addDataAtEnd(infop);
+	mMaterialInfoList.push_back(infop);
 
 	return TRUE;
 }
@@ -336,10 +338,10 @@ BOOL LLMaterialTable::addRollingSound(U8 mcode, U8 mcode2, const LLUUID &uuid)
 
 BOOL LLMaterialTable::addShatterSound(U8 mcode, const LLUUID &uuid)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			infop->mShatterSoundID = uuid;
@@ -352,10 +354,10 @@ BOOL LLMaterialTable::addShatterSound(U8 mcode, const LLUUID &uuid)
 
 BOOL LLMaterialTable::addDensity(U8 mcode, const F32 &density)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			infop->mDensity = density;
@@ -368,10 +370,10 @@ BOOL LLMaterialTable::addDensity(U8 mcode, const F32 &density)
 
 BOOL LLMaterialTable::addRestitution(U8 mcode, const F32 &restitution)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			infop->mRestitution = restitution;
@@ -384,10 +386,10 @@ BOOL LLMaterialTable::addRestitution(U8 mcode, const F32 &restitution)
 
 BOOL LLMaterialTable::addFriction(U8 mcode, const F32 &friction)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			infop->mFriction = friction;
@@ -400,10 +402,10 @@ BOOL LLMaterialTable::addFriction(U8 mcode, const F32 &friction)
 
 BOOL LLMaterialTable::addDamageAndEnergy(U8 mcode, const F32 &hp_mod, const F32 &damage_mod, const F32 &ep_mod)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			infop->mHPModifier = hp_mod;
@@ -418,10 +420,10 @@ BOOL LLMaterialTable::addDamageAndEnergy(U8 mcode, const F32 &hp_mod, const F32
 
 LLUUID LLMaterialTable::getDefaultTextureID(char* name)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (!strcmp(name, infop->mName))
 		{
 			return infop->mDefaultTextureID;
@@ -434,12 +436,11 @@ LLUUID LLMaterialTable::getDefaultTextureID(char* name)
 
 LLUUID LLMaterialTable::getDefaultTextureID(U8 mcode)
 {
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mDefaultTextureID;
@@ -452,10 +453,10 @@ LLUUID LLMaterialTable::getDefaultTextureID(U8 mcode)
 
 U8 LLMaterialTable::getMCode(const char* name)
 {
-	LLMaterialInfo *infop;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (!strcmp(name, infop->mName))
 		{
 			return infop->mMCode;
@@ -468,12 +469,11 @@ U8 LLMaterialTable::getMCode(const char* name)
 
 char* LLMaterialTable::getName(U8 mcode)
 {
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mName;
@@ -569,11 +569,11 @@ LLUUID LLMaterialTable::getGroundCollisionParticleUUID(U8 mcode)
 
 F32 LLMaterialTable::getDensity(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mDensity;
@@ -585,11 +585,11 @@ F32 LLMaterialTable::getDensity(U8 mcode)
 
 F32 LLMaterialTable::getRestitution(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mRestitution;
@@ -601,11 +601,11 @@ F32 LLMaterialTable::getRestitution(U8 mcode)
 
 F32 LLMaterialTable::getFriction(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mFriction;
@@ -617,11 +617,11 @@ F32 LLMaterialTable::getFriction(U8 mcode)
 
 F32 LLMaterialTable::getHPMod(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mHPModifier;
@@ -633,11 +633,11 @@ F32 LLMaterialTable::getHPMod(U8 mcode)
 
 F32 LLMaterialTable::getDamageMod(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mDamageModifier;
@@ -649,11 +649,11 @@ F32 LLMaterialTable::getDamageMod(U8 mcode)
 
 F32 LLMaterialTable::getEPMod(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mEPModifier;
@@ -665,11 +665,11 @@ F32 LLMaterialTable::getEPMod(U8 mcode)
 
 LLUUID LLMaterialTable::getShatterSoundUUID(U8 mcode)
 {	
-	LLMaterialInfo *infop;
-
 	mcode &= LL_MCODE_MASK;
-	for (infop = mMaterialInfoList.getFirstData(); infop != NULL; infop = mMaterialInfoList.getNextData() )
+	for (info_list_t::iterator iter = mMaterialInfoList.begin();
+		 iter != mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo *infop = *iter;
 		if (mcode == infop->mMCode)
 		{
 			return infop->mShatterSoundID;
diff --git a/indra/llprimitive/llmaterialtable.h b/indra/llprimitive/llmaterialtable.h
index e786a868e90a44f51badb22a31731b529fdbb5c9..46b6f070d90a04015da5bfc276f41115fd9b4c98 100644
--- a/indra/llprimitive/llmaterialtable.h
+++ b/indra/llprimitive/llmaterialtable.h
@@ -84,7 +84,9 @@ public:
 class LLMaterialTable
 {
 public:
-	LLLinkedList<LLMaterialInfo>	mMaterialInfoList;
+	typedef std::list<LLMaterialInfo*> info_list_t;
+	info_list_t mMaterialInfoList;
+	
 	LLUUID *mCollisionSoundMatrix;
 	LLUUID *mSlidingSoundMatrix;
 	LLUUID *mRollingSoundMatrix;
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 5eb55e0420e7f4db4df23fae383128009fe0a199..32ee0227d0e2199419d54c1f5e8f8d2969009f5a 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -185,7 +185,7 @@ public:
 	// Defaults to destroy().
 	virtual void	onClose(bool app_quitting) { destroy(); }
 
-	virtual BOOL	canClose() const { return TRUE; }
+	virtual BOOL	canClose() { return TRUE; }
 
 	virtual void	setVisible(BOOL visible);
 	void			setFrontmost(BOOL take_focus = TRUE);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 0e64c6df5c41e99e804b4b4ef8ee38be2117adcf..8d1bab6bd7be5c07d28d9345011ed2e6d38c97c7 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -344,7 +344,8 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
 		handled = LLPanel::handleMouseDown( x, y, mask );
 	}
 
-	if (getTabCount() > 0)
+	S32 tab_count = getTabCount();
+	if (tab_count > 0)
 	{
 		LLTabTuple* firsttuple = getTab(0);
 		LLRect tab_rect;
@@ -364,7 +365,9 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask )
 		}
 		if( tab_rect.pointInRect( x, y ) )
 		{
-			LLButton* tab_button = getTab(getCurrentPanelIndex())->mButton;
+			S32 index = getCurrentPanelIndex();
+			index = llclamp(index, 0, tab_count-1);
+			LLButton* tab_button = getTab(index)->mButton;
 			gFocusMgr.setMouseCapture(this);
 			gFocusMgr.setKeyboardFocus(tab_button);
 		}
diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index fce0d055e603d94cb38deac86f8f7ec30485668a..43f3081321a0fc2270d959d342f47f0042d66185 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -415,7 +415,7 @@ void LLSplashScreen::hide()
 //
 
 // TODO: replace with std::set
-static LLLinkedList<LLWindow> sWindowList;
+static std::set<LLWindow*> sWindowList;
 
 LLWindow* LLWindowManager::createWindow(
 	char *title,
@@ -481,13 +481,13 @@ LLWindow* LLWindowManager::createWindow(
 		llwarns << "LLWindowManager::create() : Error creating window." << llendl;
 		return NULL;
 	}
-	sWindowList.addDataAtEnd(new_window);
+	sWindowList.insert(new_window);
 	return new_window;
 }
 
 BOOL LLWindowManager::destroyWindow(LLWindow* window)
 {
-	if (!sWindowList.checkData(window))
+	if (sWindowList.find(window) == sWindowList.end())
 	{
 		llerrs << "LLWindowManager::destroyWindow() : Window pointer not valid, this window doesn't exist!" 
 			<< llendl;
@@ -496,7 +496,7 @@ BOOL LLWindowManager::destroyWindow(LLWindow* window)
 
 	window->close();
 
-	sWindowList.removeData(window);
+	sWindowList.erase(window);
 
 	delete window;
 
@@ -505,5 +505,5 @@ BOOL LLWindowManager::destroyWindow(LLWindow* window)
 
 BOOL LLWindowManager::isWindowValid(LLWindow *window)
 {
-	return sWindowList.checkData(window);
+	return sWindowList.find(window) != sWindowList.end();
 }
diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp
index d3778853dd51357adfb949dbf187dfd4832abac1..4ad44f455ff5c4e311f7b1d3911a75af989bee4a 100644
--- a/indra/llxml/llcontrol.cpp
+++ b/indra/llxml/llcontrol.cpp
@@ -69,8 +69,6 @@ std::set<LLControlBase*>	LLControlBase::mChangedControls;
 
 const S32 CURRENT_VERSION = 101;
 
-BOOL control_insert_before( LLControlBase* first, LLControlBase* second );
-
 BOOL LLControl::llsd_compare(const LLSD& a, const LLSD & b)
 {
 	switch (mType)
@@ -1033,6 +1031,13 @@ U32 LLControlGroup::loadFromFile(const LLString& filename, BOOL require_declarat
 	return validitems;
 }
 
+struct compare_controls
+{
+	bool operator() (const LLControlBase* const a, const LLControlBase* const b) const
+	{
+		return a->getName() < b->getName();
+	}
+};
 
 U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
 {
@@ -1042,13 +1047,14 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
 
 	// place the objects in a temporary container that enforces a sort
 	// order to ease manual editing of the file
-	LLLinkedList< LLControlBase > controls;
-	controls.setInsertBefore( &control_insert_before );
-	LLString name;
+
+	typedef std::set< LLControlBase*, compare_controls > control_list_t;
+	control_list_t controls;
+
 	for (ctrl_name_table_t::iterator iter = mNameTable.begin();
 		 iter != mNameTable.end(); iter++)
 	{
-		name = iter->first;
+		LLString name = iter->first;
 		if (name.empty())
 		{
 			CONTROL_ERRS << "Control with no name found!!!" << llendl;
@@ -1065,7 +1071,7 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
 		{
 			if (!(nondefault_only && (control->mIsDefault)))
 			{
-				controls.addDataSorted( control );
+				controls.insert( control );
 			}
 			else
 			{
@@ -1088,12 +1094,12 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
 	// Write file version
 	file << "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>\n";
 	file << "<settings version = \"" << CURRENT_VERSION << "\">\n";
-    for( LLControlBase* control = controls.getFirstData();
-		 control != NULL;
-		 control = controls.getNextData() )
+	for (control_list_t::iterator iter = controls.begin();
+		 iter != controls.end(); ++iter)
 	{
+		LLControlBase* control = *iter;
 		file << "\t<!--" << control->comment() << "-->" << ENDL;
-		name = control->name();
+		LLString name = control->getName();
 		switch (control->type())
 		{
 			case TYPE_U32:
@@ -1165,7 +1171,7 @@ U32 LLControlGroup::saveToFile(const LLString& filename, BOOL nondefault_only)
 	file << "</settings>\n";
 	file.close();
 
-	return controls.getLength();
+	return controls.size();
 }
 
 void LLControlGroup::applyOverrides(const std::map<std::string, std::string>& overrides)
@@ -1435,8 +1441,3 @@ void main()
 }
 #endif
 
-BOOL control_insert_before( LLControlBase* first, LLControlBase* second )
-{
-	return ( first->getName().compare(second->getName()) < 0 );
-}
-
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 608a6ad73396f2af6e00680b54b02fe03e0a18bd..5bca4eab5ea4f8eb5b0a7527537825835a6f2d99 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -1,5 +1,5 @@
 /* Localized versions of Info.plist keys */
 
 CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 1.19.0.5";
-CFBundleGetInfoString = "Second Life version 1.19.0.5, Copyright 2004-2007 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 1.19.1.0";
+CFBundleGetInfoString = "Second Life version 1.19.1.0, Copyright 2004-2008 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index e257d6f3aab8f0e2c92e9b6e850a606b409a11ff..6f8c464466eed1b630bd0c3ae1307188bf97c7fd 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -32,7 +32,7 @@
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
-	<string>1.19.0.5</string>
+	<string>1.19.1.0</string>
 	<key>CSResourcesFileMapped</key>
 	<true/>
 </dict>
diff --git a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
index 8f3d11badc33f96e0836497156c216d0840c4653..6ec3dc47882b4601bbe14983f87fa3e394eb1548 100644
--- a/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
+++ b/indra/newview/app_settings/shaders/class2/environment/waterF.glsl
@@ -48,7 +48,7 @@ void main()
 	
 	vec3 df = vec3(
 					dot(viewVec, wave1),
-					dot(viewVec, wave2),
+					dot(viewVec, (wave2 + wave3) * 0.5),
 					dot(viewVec, wave3)
 				 ) * fresnelScale + fresnelOffset;
 	df *= df;
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 8a023de5f65889975515fd97517359933274711b..898751d3f1c8f5a88aeb526125594355437a40ac 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -49,6 +49,8 @@ UseOcclusion				1	1
 VertexShaderEnable			1	1
 WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	128
+Disregard128DefaultDrawDistance	1	1
+Disregard96DefaultDrawDistance	1	1
 
 //
 // Low Graphics Settings
@@ -238,8 +240,6 @@ RenderVBOEnable				1	0
 list Intel
 RenderAnisotropic			1	0
 RenderLightingDetail		1	0
-RenderTerrainDetail			1	0
-RenderVBOEnable				1	0
 
 list GeForce2
 RenderAnisotropic			1	0
@@ -248,9 +248,78 @@ RenderMaxPartCount			1	2048
 RenderTerrainDetail			1	0
 RenderVBOEnable				1	1
 
+
+list Intel_830M
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_845G					
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_855GM				
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_865G			
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_900		
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_915GM	
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_915G					
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_945GM			
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_945G
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_950
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
 list Intel_965
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
 UseOcclusion				0	0
 
+list Intel_G33
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Bear_Lake	
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Broadwater 
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Brookdale	
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Montara
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Springdale
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+
+
 list ATI_Mobility_Radeon_9800
 RenderAvatarCloth			0	0
 VertexShaderEnable			0	0
@@ -265,29 +334,60 @@ list ATI_Mobility_Radeon_9600
 RenderAvatarCloth			0	0
 VertexShaderEnable			0	0
 WindLightUseAtmosShaders	0	0
+Disregard96DefaultDrawDistance	1	0
+
+
+/// tweaked ATI to 96 Draw distance
+
+list ATI_Radeon_9000
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9200
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9500
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9600
+Disregard96DefaultDrawDistance	1	0
+
+/// tweaked ATI to 128 draw distance
+
+list ATI_Radeon_X300 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X400 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X500 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X600 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X700 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1300 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1400 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1500 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1600 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1700 
+Disregard128DefaultDrawDistance	1	0
+
+list ATI_Mobility_Radeon_X1xxx
+Disregard128DefaultDrawDistance	1	0
+
+
 
 // Avatar hardware skinning causes
 // invisible avatars on x2600... so I masked
-// out other possible bad ones till it's fixed
-list ATI_Radeon_X2400
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
-list ATI_Radeon_X2600
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
-list ATI_Radeon_X2900
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
-list ATI_Radeon_X3800
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
+// out other possible bad ones till it's fixed in 8.2
 
 list ATI_Radeon_HD_2300
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
+Disregard128DefaultDrawDistance	1	0
 list ATI_Radeon_HD_2400
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
+Disregard128DefaultDrawDistance	1	0
 list ATI_Radeon_HD_2600
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
@@ -301,6 +401,7 @@ RenderAvatarCloth			0	0
 list ATI_ASUS_AH24xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
+Disregard128DefaultDrawDistance	1	0
 list ATI_ASUS_AH26xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
@@ -314,17 +415,74 @@ list ATI_ASUS_EAH38xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
 
+
+/// Tweaked NVIDIA
+
+list NVIDIA_GeForce_FX_5100
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5200
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5500
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5600
+Disregard96DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_FX_Go5100
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5200
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5300
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5500
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5600
+Disregard96DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_6100
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6500
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6600
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_G73
+Disregard128DefaultDrawDistance	1	0
+
 list NVIDIA_GeForce_Go_6100
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6200
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6500
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6600
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6700
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6800
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_7200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_7300
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_7400
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_Go_7200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_Go_7300
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_Go_7400
+Disregard128DefaultDrawDistance	1	0
+
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index ccffc8d4245618326b83fc278cd088ba682dbf7d..d7921ffb59fec71ca0ec437071c93865d1b77cd9 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -49,6 +49,8 @@ UseOcclusion				1	1
 VertexShaderEnable			1	1
 WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	128
+Disregard128DefaultDrawDistance	1	1
+Disregard96DefaultDrawDistance	1	1
 
 //
 // Low Graphics Settings
@@ -271,50 +273,153 @@ list ATI_Mobility_Radeon_9600
 RenderAvatarCloth			0	0
 VertexShaderEnable			0	0
 WindLightUseAtmosShaders	0	0
+Disregard96DefaultDrawDistance	1	0
+
+
+/// tweaked ATI to 96 Draw distance
+
+list ATI_Radeon_9000
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9200
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9500
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9600
+Disregard96DefaultDrawDistance	1	0
+
+/// tweaked ATI to 128 draw distance
+
+list ATI_Radeon_X300 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X400 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X500 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X600 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X700 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1300 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1400 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1500 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1600 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1700 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Mobility_Radeon_X1xxx
+Disregard128DefaultDrawDistance	1	0
+
+
+
 
 // Avatar hardware skinning causes
-// invisible avatars on x2600... so I masked
+// invisible avatars on HD 2400... so I masked
 // out other possible bad ones till it's fixed
-list ATI_Radeon_X2400
+
+list ATI_Radeon_HD_2300
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_X2600
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_HD_2400
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_X2900
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_HD_2600
+RenderAvatarVP				0	0
+RenderAvatarCloth			0	0
+list ATI_Radeon_HD_2900
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_X3800
+list ATI_Radeon_HD_3800
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
 
-list ATI_Radeon_HD_2300
+list ATI_ASUS_AH24xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_HD_2400
+Disregard128DefaultDrawDistance	1	0
+list ATI_ASUS_AH26xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_HD_2600
+list ATI_ASUS_EAH24xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_HD_2900
+list ATI_ASUS_EAH26xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
-list ATI_Radeon_HD_3800
+list ATI_ASUS_EAH38xx
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
 
+
+/// Tweaked NVIDIA
+
+list NVIDIA_GeForce_FX_5100
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5200
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5500
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5600
+Disregard96DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_FX_Go5100
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5200
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5300
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5500
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5600
+Disregard96DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_6100
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6500
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6600
+Disregard128DefaultDrawDistance	1	0
+
+
 list NVIDIA_GeForce_Go_6100
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6200
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6500
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6600
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6700
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6800
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_7200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_7300
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_7400
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_Go_7200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_Go_7300
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_Go_7400
+Disregard128DefaultDrawDistance	1	0
+
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index bebb51fc1252f5455eadd29413edcae172d2ec67..9645ff8abfbb22ede72afc13e43cf57e0d936c1b 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -50,6 +50,8 @@ VertexShaderEnable			1	1
 WindLightUseAtmosShaders	1	1
 WLSkyDetail					1	128
 RenderUseCleverUI			1	1
+Disregard128DefaultDrawDistance	1	1
+Disregard96DefaultDrawDistance	1	1
 
 //
 // Low Graphics Settings
@@ -239,8 +241,6 @@ RenderVBOEnable				1	0
 list Intel
 RenderAnisotropic			1	0
 RenderLightingDetail		1	0
-RenderTerrainDetail			1	0
-RenderVBOEnable				1	0
 
 list GeForce2
 RenderAnisotropic			1	0
@@ -249,9 +249,78 @@ RenderMaxPartCount			1	2048
 RenderTerrainDetail			1	0
 RenderVBOEnable				1	1
 
+list Intel_830M
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_845G					
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_855GM				
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_865G			
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_900		
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_915GM	
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_915G					
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_945GM			
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_945G
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_950
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
 list Intel_965
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
 UseOcclusion				0	0
 
+list Intel_G33
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Bear_Lake	
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Broadwater 
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Brookdale	
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_X3100
+WindLightUseAtmosShaders	0	0
+
+list Intel_Montara
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
+list Intel_Springdale
+RenderTerrainDetail			1	0
+RenderVBOEnable				1	0
+
 list ATI_Mobility_Radeon_9800
 RenderAvatarCloth			0	0
 VertexShaderEnable			0	0
@@ -266,29 +335,60 @@ list ATI_Mobility_Radeon_9600
 RenderAvatarCloth			0	0
 VertexShaderEnable			0	0
 WindLightUseAtmosShaders	0	0
+Disregard96DefaultDrawDistance	1	0
+
+
+/// tweaked ATI to 96 Draw distance
+
+list ATI_Radeon_9000
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9200
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9500
+Disregard96DefaultDrawDistance	1	0
+list ATI_Radeon_9600
+Disregard96DefaultDrawDistance	1	0
+
+/// tweaked ATI to 128 draw distance
+
+list ATI_Radeon_X300 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X400 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X500 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X600 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X700 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1300 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1400 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1500 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1600 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Radeon_X1700 
+Disregard128DefaultDrawDistance	1	0
+list ATI_Mobility_Radeon_X1xxx
+Disregard128DefaultDrawDistance	1	0
+
+
+
 
 // Avatar hardware skinning causes
-// invisible avatars on x2600... so I masked
+// invisible avatars on HD 2600... so I masked
 // out other possible bad ones till it's fixed
-list ATI_Radeon_X2400
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
-list ATI_Radeon_X2600
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
-list ATI_Radeon_X2900
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
-list ATI_Radeon_X3800
-RenderAvatarVP				0	0
-RenderAvatarCloth			0	0
 
 list ATI_Radeon_HD_2300
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
+Disregard128DefaultDrawDistance	1	0
 list ATI_Radeon_HD_2400
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
+Disregard128DefaultDrawDistance	1	0
 list ATI_Radeon_HD_2600
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
@@ -299,17 +399,69 @@ list ATI_Radeon_HD_3800
 RenderAvatarVP				0	0
 RenderAvatarCloth			0	0
 
+/// Tweaked NVIDIA
+
+list NVIDIA_GeForce_FX_5100
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5200
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_5500
+Disregard96DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_FX_Go5100
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5200
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5300
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5500
+Disregard96DefaultDrawDistance	1	0
+list NVIDIA_GeForce_FX_Go5600
+Disregard96DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_6100
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6500
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_6600
+Disregard128DefaultDrawDistance	1	0
+
+
 list NVIDIA_GeForce_Go_6100
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6200
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6500
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6600
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6700
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6800
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
 list NVIDIA_GeForce_Go_6
 RenderVBOEnable				1	0
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_7200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_7300
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_7400
+Disregard128DefaultDrawDistance	1	0
+
+list NVIDIA_GeForce_Go_7200
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_Go_7300
+Disregard128DefaultDrawDistance	1	0
+list NVIDIA_GeForce_Go_7400
+Disregard128DefaultDrawDistance	1	0
+
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 5d73a704978684bcd63908068226c4a1021f2d3c..066cd980b6a21be9a25a2aef3a1149418a4df648 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -28,7 +28,7 @@ ATI All-in-Wonder X800			.*ATI.*All-in-Wonder X8.*			2		1
 ATI All-in-Wonder X1800			.*ATI.*All-in-Wonder X18.*			3		1
 ATI All-in-Wonder X1900			.*ATI.*All-in-Wonder X19.*			3		1
 ATI ASUS A9xxx					.*ATI.*ASUS.*A9.*					1		1
-ATI ASUS AH24xx					.*ATI.*ASUS.*AH24.*					3		1
+ATI ASUS AH24xx					.*ATI.*ASUS.*AH24.*					1		1
 ATI ASUS AH26xx					.*ATI.*ASUS.*AH26.*					3		1
 ATI ASUS AX3xx					.*ATI.*ASUS.*AX3.*					1		1
 ATI ASUS AX5xx					.*ATI.*ASUS.*AX5.*					1		1
@@ -56,8 +56,8 @@ ATI Mobility Radeon X6xx		.*ATI.*Mobility.*X6.*				1		1
 ATI Mobility Radeon X7xx		.*ATI.*Mobility.*X7.*				1		1
 ATI Mobility Radeon Xxxx		.*ATI.*Mobility.*X.*				1		1
 ATI Mobility Radeon				.*ATI.*Mobility.*					0		1
-ATI Radeon HD 2300				.*ATI.*Radeon HD 23.*				2		1
-ATI Radeon HD 2400				.*ATI.*Radeon HD 24.*				2		1
+ATI Radeon HD 2300				.*ATI.*Radeon HD 23.*				1		1
+ATI Radeon HD 2400				.*ATI.*Radeon HD 24.*				1		1
 ATI Radeon HD 2600				.*ATI.*Radeon HD 26.*				2		1
 ATI Radeon HD 2900				.*ATI.*Radeon HD 29.*				3		1
 ATI Radeon HD 3800				.*ATI.*Radeon HD 38.*				3		1
@@ -76,7 +76,7 @@ ATI Radeon RX700				.*ATI.*RX70.*						1		1
 ATI Radeon RX800				.*ATI.*Radeon *RX80.*				2		1
 ATI Radeon VE					.*ATI.*Radeon.*VE.*					0		0
 ATI Radeon X1000				.*ATI.*Radeon *X10.*				0		1
-ATI Radeon X1200				.*ATI.*Radeon *X12.*				1		1
+ATI Radeon X1200				.*ATI.*Radeon *X12.*				0		1
 ATI Radeon X1300				.*ATI.*Radeon *X13.*				1		1
 ATI Radeon X1400				.*ATI.*Radeon X14.*					1		1
 ATI Radeon X1500				.*ATI.*Radeon X15.*					1		1
@@ -84,9 +84,6 @@ ATI Radeon X1600				.*ATI.*Radeon X16.*					1		1
 ATI Radeon X1700				.*ATI.*Radeon X17.*					1		1
 ATI Radeon X1800				.*ATI.*Radeon X18.*					3		1
 ATI Radeon X1900				.*ATI.*Radeon X19.*					3		1
-ATI Radeon X2400				.*ATI.*Radeon X24.*					3		1
-ATI Radeon X2600				.*ATI.*Radeon X26.*					3		1
-ATI Radeon X2900				.*ATI.*Radeon X29.*					3		1
 ATI Radeon X300					.*ATI.*Radeon *X3.*					1		1
 ATI Radeon X400					.*ATI.*Radeon X4.*					1		1
 ATI Radeon X500					.*ATI.*Radeon X5.*					1		1
@@ -99,7 +96,7 @@ ATI Rage 128					.*ATI.*Rage 128.*					0		1
 ATI RV250						.*ATI.*RV250.*						0		1
 ATI RV530						.*ATI.*RV530.*						1		1
 ATI RX700						.*ATI.*RX700.*						1		1
-Intel x3100						.*Intel.*x3100						0		1
+Intel X3100						.*Intel.*X3100.*					1		1
 Intel 830M						.*Intel.*830M						0		0
 Intel 845G						.*Intel.*845G						0		0
 Intel 855GM						.*Intel.*855GM						0		0
@@ -120,7 +117,7 @@ Intel Springdale				.*Intel.*Springdale.*				0		0
 Matrox							.*Matrox.*							0		0
 Mesa							.*Mesa.*							0		0
 NVIDIA G72						.*NVIDIA.*G72.*						1		1
-NVIDIA G73						.*NVIDIA.*G73.*						2		1
+NVIDIA G73						.*NVIDIA.*G73.*						1		1
 NVIDIA GeForce					.*GeForce 256.*						0		0
 NVIDIA GeForce 2				.*GeForce2.*						0		1
 NVIDIA GeForce 3				.*GeForce3.*						0		1
@@ -134,7 +131,7 @@ NVIDIA GeForce 6600				.*NVIDIA.*GeForce 66.*				1		1
 NVIDIA GeForce 6700				.*NVIDIA.*GeForce 67.*				2		1
 NVIDIA GeForce 6800				.*NVIDIA.*GeForce 68.*				2		1
 NVIDIA GeForce 7000				.*NVIDIA.*GeForce 70.*				0		1
-NVIDIA GeForce 7100				.*NVIDIA.*GeForce 71.*				1		1
+NVIDIA GeForce 7100				.*NVIDIA.*GeForce 71.*				0		1
 NVIDIA GeForce 7200				.*NVIDIA.*GeForce 72.*				1		1
 NVIDIA GeForce 7300				.*NVIDIA.*GeForce 73.*				1		1
 NVIDIA GeForce 7500				.*NVIDIA.*GeForce 75.*				1		1
@@ -178,6 +175,7 @@ NVIDIA GeForce Go 7900			.*NVIDIA.*GeForce Go 79.*			2		1
 NVIDIA GeForce Go 6				.*GeForce Go 6.*					1		1
 NVIDIA GeForce PCX				.*GeForce PCX.*						0		1
 NVIDIA Generic					.*NVIDIA.*Unknown.*					0		0
+NVIDIA NV43						.*NVIDIA.*NV43.*					1		1
 NVIDIA Quadro2					.*Quadro2.*							0		0
 NVIDIA Quadro4					.*Quadro4.*							0		0
 NVIDIA Quadro DCC				.*Quadro DCC.*						0		0
diff --git a/indra/newview/llappearance.h b/indra/newview/llappearance.h
index 2a4c1759ca482824f6b3166fc3a3ca1151c07758..07c0c0cb68116cbeeb94da83587b8f564880685e 100644
--- a/indra/newview/llappearance.h
+++ b/indra/newview/llappearance.h
@@ -32,24 +32,24 @@
 #ifndef LL_LLAPPEARANCE_H
 #define LL_LLAPPEARANCE_H
 
-#include "llskiplist.h"
 #include "lluuid.h"
 
 class LLAppearance
 {
 public:
 	LLAppearance()										{}
-	~LLAppearance()										{ mParamMap.deleteAllData(); } 
+	~LLAppearance()										{ mParamMap.clear(); } 
 
-	void	addParam( S32 id, F32 value )				{ mParamMap.addData( id, new F32(value) ); }
-	F32*	getParam( S32 id )							{ F32* temp = mParamMap.getIfThere( id ); return temp; } // temp works around an invalid warning.
+	void	addParam( S32 id, F32 value )				{ mParamMap[id] = value; }
+	F32		getParam( S32 id, F32 defval )				{ return get_if_there(mParamMap, id, defval ); }
 
 	void	addTexture( S32 te, const LLUUID& uuid )	{ if( te < LLVOAvatar::TEX_NUM_ENTRIES ) mTextures[te] = uuid; }
 	const LLUUID& getTexture( S32 te )					{ return ( te < LLVOAvatar::TEX_NUM_ENTRIES ) ? mTextures[te] : LLUUID::null; }
 	
-	void	clear()										{ mParamMap.deleteAllData(); for( S32 i=0; i<LLVOAvatar::TEX_NUM_ENTRIES; i++ ) mTextures[i].setNull(); }
+	void	clear()										{ mParamMap.clear(); for( S32 i=0; i<LLVOAvatar::TEX_NUM_ENTRIES; i++ ) mTextures[i].setNull(); }
 
-	LLPtrSkipMap<S32, F32*> mParamMap;
+	typedef std::map<S32, F32> param_map_t;
+	param_map_t mParamMap;
 	LLUUID	mTextures[LLVOAvatar::TEX_NUM_ENTRIES];
 };
 
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 814c209e67a48c234a6064e5fffdc9415d19cd1b..09bcf6f7cc6b7420ec105a04e35d3e8bf14526a0 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -127,7 +127,14 @@ LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *excepti
 	return retval;
 }
 
-int APIENTRY WinMain(HINSTANCE hInstance,
+
+#if DEBUGGING_SEH_FILTER
+#	define WINMAIN DebuggingWinMain
+#else
+#	define WINMAIN WinMain
+#endif
+
+int APIENTRY WINMAIN(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR     lpCmdLine,
                      int       nCmdShow)
@@ -207,6 +214,27 @@ int APIENTRY WinMain(HINSTANCE hInstance,
 	return 0;
 }
 
+#if DEBUGGING_SEH_FILTER
+// The compiler doesn't like it when you use __try/__except blocks
+// in a method that uses object destructors. Go figure.
+// This winmain just calls the real winmain inside __try.
+// The __except calls our exception filter function. For debugging purposes.
+int APIENTRY WinMain(HINSTANCE hInstance,
+                     HINSTANCE hPrevInstance,
+                     LPSTR     lpCmdLine,
+                     int       nCmdShow)
+{
+    __try
+    {
+        WINMAIN(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
+    }
+    __except( viewer_windows_exception_handler( GetExceptionInformation() ) )
+    {
+        _tprintf( _T("Exception handled.\n") );
+    }
+}
+#endif
+
 void LLAppViewerWin32::disableWinErrorReporting()
 {
 	const char win_xp_string[] = "Microsoft Windows XP";
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 1a4d3c16fd81e4afef60567ef211621397beed17..087f8ac6731430a26e684ddf6e63a5218730ec2c 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -44,7 +44,6 @@
 #include "llagent.h"
 #include "llchat.h"
 #include "llviewerwindow.h"
-#include "llcallbacklist.h"
 #include "llviewerobject.h"
 #include "llviewerobjectlist.h"
 #include "llviewerregion.h"
diff --git a/indra/newview/lldebugmessagebox.cpp b/indra/newview/lldebugmessagebox.cpp
index de185e280d8b55995b4f63ac5ed8b5f0b924a092..371426d56e411398aab8dd95356c24427be450f7 100644
--- a/indra/newview/lldebugmessagebox.cpp
+++ b/indra/newview/lldebugmessagebox.cpp
@@ -39,7 +39,6 @@
 #include "llsliderctrl.h"
 #include "llcheckboxctrl.h"
 #include "lltextbox.h"
-#include "llcallbacklist.h"
 #include "lllineeditor.h"
 #include "llfocusmgr.h"
 
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index a4b3d259bb59bfab0b6b42fd91c56fd9fc643ac1..c925cc058c4e44a917bed63bc2bd52e25a6ae54b 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -32,7 +32,6 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "lldynamictexture.h"
-#include "linked_lists.h"
 #include "llimagegl.h"
 #include "llglheaders.h"
 #include "llviewerwindow.h"
@@ -46,7 +45,7 @@
 void render_ui_and_swap_if_needed();
 
 // static
-LLLinkedList<LLDynamicTexture> LLDynamicTexture::sInstances[ LLDynamicTexture::ORDER_COUNT ];
+LLDynamicTexture::instance_list_t LLDynamicTexture::sInstances[ LLDynamicTexture::ORDER_COUNT ];
 S32 LLDynamicTexture::sNumRenders = 0;
 
 //-----------------------------------------------------------------------------
@@ -65,7 +64,7 @@ LLDynamicTexture::LLDynamicTexture(S32 width, S32 height, S32 components, EOrder
 	generateGLTexture();
 
 	llassert( 0 <= order && order < ORDER_COUNT );
-	LLDynamicTexture::sInstances[ order ].addData(this);
+	LLDynamicTexture::sInstances[ order ].insert(this);
 }
 
 //-----------------------------------------------------------------------------
@@ -76,7 +75,7 @@ LLDynamicTexture::~LLDynamicTexture()
 	releaseGLTexture();
 	for( S32 order = 0; order < ORDER_COUNT; order++ )
 	{
-		LLDynamicTexture::sInstances[order].removeData(this);  // will fail in all but one case.
+		LLDynamicTexture::sInstances[order].erase(this);  // will fail in all but one case.
 	}
 }
 
@@ -214,10 +213,10 @@ BOOL LLDynamicTexture::updateAllInstances()
 	BOOL result = FALSE;
 	for( S32 order = 0; order < ORDER_COUNT; order++ )
 	{
-		for (LLDynamicTexture *dynamicTexture = LLDynamicTexture::sInstances[order].getFirstData();
-			dynamicTexture;
-			dynamicTexture = LLDynamicTexture::sInstances[order].getNextData())
+		for (instance_list_t::iterator iter = LLDynamicTexture::sInstances[order].begin();
+			 iter != LLDynamicTexture::sInstances[order].end(); ++iter)
 		{
+			LLDynamicTexture *dynamicTexture = *iter;
 			if (dynamicTexture->needsRender())
 			{
 				render_ui_and_swap_if_needed();
diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h
index 49c8b0cdfb727419d0204c7afd076aeede37a0a1..9f647232c58cd58ef59fbbd776aefde31c60aa9e 100644
--- a/indra/newview/lldynamictexture.h
+++ b/indra/newview/lldynamictexture.h
@@ -33,7 +33,6 @@
 #define LL_LLDYNAMICTEXTURE_H
 
 #include "llgl.h"
-#include "linked_lists.h"
 #include "llcamera.h"
 #include "llcoord.h"
 #include "llimagegl.h"
@@ -84,7 +83,8 @@ protected:
 	LLCoordGL mOrigin;
 
 	LLCamera mCamera;
-	static LLLinkedList<LLDynamicTexture> sInstances[ LLDynamicTexture::ORDER_COUNT ];
+	typedef std::set<LLDynamicTexture*> instance_list_t;
+	static instance_list_t sInstances[ LLDynamicTexture::ORDER_COUNT ];
 	static S32 sNumRenders;
 };
 
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index e29d8fb40df0e3cf7e86f6e84aaf69ab3e5e3e6c..c1194fa99ee38559f14eb674d50f82cd62a76c09 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -95,7 +95,7 @@ static struct ft_display_info ft_display_table[] =
 	{ LLFastTimer::FTM_UPDATE_MOVE,			"   Move Objects",		&LLColor4::pink2, 0 },
 	{ LLFastTimer::FTM_OCTREE_BALANCE,		"    Octree Balance", &LLColor4::red3, 0 },
 	{ LLFastTimer::FTM_SIMULATE_PARTICLES,	"   Particle Sim",	&LLColor4::blue4, 0 },
-	{ LLFastTimer::FTM_OBJECTLIST_UPDATE,	"  Object Update",	&LLColor4::purple1, 0 },
+	{ LLFastTimer::FTM_OBJECTLIST_UPDATE,	"  Object Update",	&LLColor4::purple1, 1 },
 	{ LLFastTimer::FTM_AVATAR_UPDATE,		"   Avatars",		&LLColor4::purple2, 0 },
 	{ LLFastTimer::FTM_JOINT_UPDATE,		"    Joints",		&LLColor4::purple3, 0 },
 	{ LLFastTimer::FTM_ATTACHMENT_UPDATE,	"    Attachments",	&LLColor4::purple4, 0 },
@@ -124,7 +124,7 @@ static struct ft_display_info ft_display_table[] =
 	{ LLFastTimer::FTM_HUD_UPDATE,			"  HUD Update",	&LLColor4::orange2, 0 },
 	{ LLFastTimer::FTM_UPDATE_SKY,			"  Sky Update",		&LLColor4::cyan1, 0 },
 	{ LLFastTimer::FTM_UPDATE_TEXTURES,		"  Textures",		&LLColor4::pink2, 0 },
-	{ LLFastTimer::FTM_GEO_UPDATE,			"  Geo Update",	&LLColor4::blue3, 0 },
+	{ LLFastTimer::FTM_GEO_UPDATE,			"  Geo Update",	&LLColor4::blue3, 1 },
 	{ LLFastTimer::FTM_UPDATE_PRIMITIVES,	"   Volumes",		&LLColor4::blue4, 0 },
 	{ LLFastTimer::FTM_GEN_VOLUME,			"    Gen Volume",	&LLColor4::yellow3, 0 },
 	{ LLFastTimer::FTM_GEN_FLEX,			"    Flexible",	&LLColor4::yellow4, 0 },
@@ -189,6 +189,7 @@ static struct ft_display_info ft_display_table[] =
 	{ LLFastTimer::FTM_SWAP,				"  Swap",			&LLColor4::pink1, 0 },
 	{ LLFastTimer::FTM_CLIENT_COPY,			"  Client Copy",	&LLColor4::red1, 1},
 
+#if 0 || !LL_RELEASE_FOR_DOWNLOAD
 	{ LLFastTimer::FTM_TEMP1,				" Temp1",			&LLColor4::red1, 0 },
 	{ LLFastTimer::FTM_TEMP2,				" Temp2",			&LLColor4::magenta1, 0 },
 	{ LLFastTimer::FTM_TEMP3,				" Temp3",			&LLColor4::red2, 0 },
@@ -197,7 +198,8 @@ static struct ft_display_info ft_display_table[] =
 	{ LLFastTimer::FTM_TEMP6,				" Temp6",			&LLColor4::magenta3, 0 },
 	{ LLFastTimer::FTM_TEMP7,				" Temp7",			&LLColor4::red4, 0 },
 	{ LLFastTimer::FTM_TEMP8,				" Temp8",			&LLColor4::magenta4, 0 },
-
+#endif
+	
 	{ LLFastTimer::FTM_OTHER,				" Other",			&red0 }
 };
 static int ft_display_didcalc = 0;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 561d96d281907c5ecee3941e09ca170abdaa1766..bf7d48f911ba4146054eb5be26289ab4e12ca34a 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -443,6 +443,20 @@ void LLFeatureManager::applyRecommendedSettings()
 	gSavedSettings.setU32("RenderQualityPerformance", level);
 	gSavedSettings.setBOOL("RenderCustomSettings", FALSE);
 
+	// now apply the tweaks to draw distance
+	// these are double negatives, because feature masks only work by
+	// downgrading values, so i needed to make a true value go to false
+	// for certain cards, thus the awkward name, "Disregard..."
+	if(!gSavedSettings.getBOOL("Disregard96DefaultDrawDistance"))
+	{
+		gSavedSettings.setF32("RenderFarClip", 96.0f);
+	}
+	else if(!gSavedSettings.getBOOL("Disregard128DefaultDrawDistance"))
+	{
+		gSavedSettings.setF32("RenderFarClip", 128.0f);
+	}
+
+
 }
 
 void LLFeatureManager::applyFeatures(bool skipFeatures)
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 26d491b96f86efad60d95cefb7f196f46029c44d..3d05bbe2e009022c4854a3ea34df519742c53fde 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -35,7 +35,6 @@
 #include "stdtypes.h"
 
 #include "llstring.h"
-#include "llskipmap.h"
 #include <map>
 
 typedef enum EGPUClass
diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp
index 3f6ed92868050493574ca4780f0cb50e2c5b8290..2cf1f555eabf96fa44d9c38bb17b0c5a4a8e85e6 100644
--- a/indra/newview/llfloaterbump.cpp
+++ b/indra/newview/llfloaterbump.cpp
@@ -37,13 +37,12 @@
 #include "llscrolllistctrl.h"
 
 #include "llvieweruictrlfactory.h"
+#include "llviewermessage.h"
 #include "llappviewer.h"		// gPacificDaylightTime
 
 ///----------------------------------------------------------------------------
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
-extern LLLinkedList<LLMeanCollisionData>	gMeanCollisionList;
-
 LLFloaterBump* LLFloaterBump::sInstance = NULL;
 
 ///----------------------------------------------------------------------------
@@ -83,7 +82,7 @@ void LLFloaterBump::show(void *contents)
 	if (!list) return;
 	list->deleteAllItems();
 
-	if (gMeanCollisionList.isEmpty())
+	if (gMeanCollisionList.empty())
 	{
 		LLString none_detected = sInstance->getString("none_detected");
 		LLSD row;
@@ -93,10 +92,10 @@ void LLFloaterBump::show(void *contents)
 	}
 	else
 	{
-		for (LLMeanCollisionData* mcd = gMeanCollisionList.getFirstData();
-			 mcd;
-			 mcd = gMeanCollisionList.getNextData())
+		for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin();
+			 iter != gMeanCollisionList.end(); ++iter)
 		{
+			LLMeanCollisionData *mcd = *iter;
 			LLFloaterBump::add(list, mcd);
 		}
 	}
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 4097abc22d77564294d4529f795b5709924274fb..7de980a075897e9e4d3a9b3305ef146c64baf2e4 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -118,7 +118,7 @@ LLFloaterMap *gFloaterMap = NULL;
 LLFloaterMap::LLFloaterMap(const std::string& name)
 	:
 	LLFloater(name, 
-				"FloaterMapRect", 
+				"FloaterMiniMapRect", 
 				MAP_TITLE, 
 				TRUE, 
 				FLOATERMAP_MIN_WIDTH, 
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index 044c8c9d905843a1b7f1dd80e7ef5d4343d31d78..4d97688b2a48510184f5adb24bdb080e9f3352c3 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -67,7 +67,8 @@
 /// Local function declarations, constants, enums, and typedefs
 ///----------------------------------------------------------------------------
 
-LLLinkedList<LLFloaterPostcard> LLFloaterPostcard::sInstances;
+//static
+LLFloaterPostcard::instance_list_t LLFloaterPostcard::sInstances;
 
 ///----------------------------------------------------------------------------
 /// Class LLFloaterPostcard
@@ -97,13 +98,13 @@ void LLFloaterPostcard::init()
 		gAgent.sendReliableMessage();
 	}
 
-	sInstances.addData(this);
+	sInstances.insert(this);
 }
 
 // Destroys the object
 LLFloaterPostcard::~LLFloaterPostcard()
 {
-	sInstances.removeData(this);
+	sInstances.erase(this);
 	mJPEGImage = NULL; // deletes image
 }
 
@@ -313,11 +314,10 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data,
 // static
 void LLFloaterPostcard::updateUserInfo(const char *email)
 {
-	LLFloaterPostcard *instance;
-
-	sInstances.resetList();
-	while ((instance = sInstances.getNextData()))
+	for (instance_list_t::iterator iter = sInstances.begin();
+		 iter != sInstances.end(); ++iter)
 	{
+		LLFloaterPostcard *instance = *iter;
 		const LLString& text = instance->childGetValue("from_form").asString();
 		if (text.empty())
 		{
diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h
index 5e0efa0ccb1b642e410ae21e605d2affe8bffc59..2e2fffb18a9dc62f5ca268e69179c5cbb9ea422f 100644
--- a/indra/newview/llfloaterpostcard.h
+++ b/indra/newview/llfloaterpostcard.h
@@ -78,8 +78,9 @@ protected:
 	LLVector2 mImageScale;
 	LLVector3d mPosTakenGlobal;
 	boolean mHasFirstMsgFocus;
-	
-	static LLLinkedList<LLFloaterPostcard> sInstances;
+
+	typedef std::set<LLFloaterPostcard*> instance_list_t;
+	static instance_list_t sInstances;
 };
 
 
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 16d869ea6fc654ee2102809c13373264d0ceda50..e9e2584b17687c346b370d1f513496e24c97b8c9 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -72,9 +72,12 @@ public:
 
 	  void completeAny(U32 status, const std::string& mime_type)
 	  {
+		  // Set empty type to none/none.  Empty string is reserved for legacy parcels
+		  // which have no mime type set.
+		  std::string resolved_mime_type = ! mime_type.empty() ? mime_type : "none/none";
 		  LLFloaterURLEntry* floater_url_entry = (LLFloaterURLEntry*)mParent.get();
 		  if ( floater_url_entry )
-			  floater_url_entry->headerFetchComplete( status, mime_type );
+			  floater_url_entry->headerFetchComplete( status, resolved_mime_type );
 	  }
 };
 
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index ebc6dc232222ce83325cbece2483354cf4ffe032..8a40cdd062e8863a01a977a8013d53dc66e44432 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -150,13 +150,7 @@ const LLUUID LLFloaterWorldMap::sHomeID( "10000000-0000-0000-0000-000000000001"
 
 
 LLFloaterWorldMap::LLFloaterWorldMap()
-:	LLFloater("worldmap", "FloaterWorldMapRect", "World Map",
-			  TRUE,		// resize
-			  410,		// min-width
-			  520,		// min-height
-			  FALSE,	// drag on left
-			  TRUE,		// minimize
-			  TRUE),	// close
+:	LLFloater("worldmap"),
 	mInventory(NULL),
 	mInventoryObserver(NULL),
 	mFriendObserver(NULL),
diff --git a/indra/newview/llhudeffectlookat.h b/indra/newview/llhudeffectlookat.h
index 4295078681be3221b92619593407611422f2de08..ef3691d8d73d6238db1753f308fa2fb951241f02 100644
--- a/indra/newview/llhudeffectlookat.h
+++ b/indra/newview/llhudeffectlookat.h
@@ -33,7 +33,6 @@
 #define LL_LLHUDEFFECTLOOKAT_H
 
 #include "llhudeffect.h"
-#include "llskiplist.h"
 
 class LLViewerObject;
 class LLVOAvatar;
diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h
index 5e2c300d2c5aa490887ff2ba574a7b30c4d7dcbc..11d9f43fcc9a8b06e6a5c86518ad7ab2b4b3cb2a 100644
--- a/indra/newview/llhudobject.h
+++ b/indra/newview/llhudobject.h
@@ -41,7 +41,6 @@
 #include "v4color.h"
 #include "v3math.h"
 #include "v3dmath.h"
-#include "linked_lists.h"
 #include "lldrawpool.h"
 #include <list>
 
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 58139e41aa43f83b4cd9d01aa062e960f308badf..4dc5bfddec2d20ad9cff6662f70796abf8560f6a 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -40,7 +40,6 @@
 #include "llhttpclient.h"
 #include "llsdutil.h"
 #include "llstring.h"
-#include "linked_lists.h"
 #include "llvieweruictrlfactory.h"
 
 #include "llagent.h"
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 0e17d8503d249723580cd2e3993daa5bd5a0b846..a0fa0e083cc42aee4e6ff68ca3f5803d6fa812c3 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -3522,8 +3522,13 @@ struct LLFoundData
 struct LLWearableHoldingPattern
 {
 	LLWearableHoldingPattern() : mResolved(0) {}
-	~LLWearableHoldingPattern() { mFoundList.deleteAllData(); }
-	LLDoubleLinkedList<LLFoundData> mFoundList;
+	~LLWearableHoldingPattern()
+	{
+		for_each(mFoundList.begin(), mFoundList.end(), DeletePointer());
+		mFoundList.clear();
+	}
+	typedef std::list<LLFoundData*> found_list_t;
+	found_list_t mFoundList;
 	S32 mResolved;
 };
 
@@ -3913,7 +3918,7 @@ void wear_inventory_category_on_avatar_step2( BOOL proceed, void* userdata )
 										item_array.get(i)->getAssetUUID(),
 										item_array.get(i)->getName(),
 										item_array.get(i)->getType());
-				holder->mFoundList.addData(found);
+				holder->mFoundList.push_front(found);
 				found_container.put(found);
 			}
 			for(i = 0; i < wearable_count; ++i)
@@ -4004,10 +4009,10 @@ void wear_inventory_category_on_avatar_loop(LLWearable* wearable, void* data)
 	
 	if(wearable)
 	{
-		for(LLFoundData* data = holder->mFoundList.getFirstData();
-			data;
-			data = holder->mFoundList.getNextData() )
+		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
+			 iter != holder->mFoundList.end(); ++iter)
 		{
+			LLFoundData* data = *iter;
 			if(wearable->getID() == data->mAssetID)
 			{
 				data->mWearable = wearable;
@@ -4016,7 +4021,7 @@ void wear_inventory_category_on_avatar_loop(LLWearable* wearable, void* data)
 		}
 	}
 	holder->mResolved += 1;
-	if(holder->mResolved >= holder->mFoundList.getLength())
+	if(holder->mResolved >= (S32)holder->mFoundList.size())
 	{
 		wear_inventory_category_on_avatar_step3(holder, append);
 	}
@@ -4032,10 +4037,10 @@ void wear_inventory_category_on_avatar_step3(LLWearableHoldingPattern* holder, B
 	// that we recursed through.
 	for( S32 i = 0; i < WT_COUNT; i++ )
 	{
-		for(LLFoundData* data = holder->mFoundList.getFirstData();
-			data;
-			data = holder->mFoundList.getNextData())
+		for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
+			 iter != holder->mFoundList.end(); ++iter)
 		{
+			LLFoundData* data = *iter;
 			LLWearable* wearable = data->mWearable;
 			if( wearable && ((S32)wearable->getType() == i) )
 			{
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 79a35f78ea520f9f7cc38c4a35b0d4c25a54efb9..c2ec01a1a0a9a122a5021f149bd3735da5b9098f 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -439,8 +439,6 @@ protected:
 	mutable LLPointer<LLViewerInventoryItem> mLastItem;
 
 	// This last set of indices is used to map parents to children.
-	//LLPtrSkipMap<const LLUUID,  cat_array_t*> mParentChildCategoryTree;
-	//LLPtrSkipMap<const LLUUID,  item_array_t*> mParentChildItemTree;
 	typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t;
 	typedef std::map<LLUUID, item_array_t*> parent_item_map_t;
 	parent_cat_map_t mParentChildCategoryTree;
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index 457682a1547062a1627dba49b6406c64178b2c22..5252e3e3c68bdb58cb20723737ce1747a565e565 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -173,11 +173,6 @@ void LLManipScale::handleDeselect()
 	LLManip::handleDeselect();
 }
 
-BOOL sort_manip_by_z(LLManipScale::ManipulatorHandle *new_manip, LLManipScale::ManipulatorHandle *test_manip)
-{
-	return ((new_manip->mType < test_manip->mType) || (new_manip->mPosition.mV[VZ] < test_manip->mPosition.mV[VZ]));
-}
-
 LLManipScale::LLManipScale( LLToolComposite* composite )
 	: 
 	LLManip( "Scale", composite ),
@@ -194,7 +189,6 @@ LLManipScale::LLManipScale( LLToolComposite* composite )
 	mSnapGuideLength(0.f),
 	mScaleSnapValue(0.f)
 { 
-	mProjectedManipulators.setInsertBefore(sort_manip_by_z);
 	mManipulatorScales = new F32[NUM_MANIPULATORS];
 	for (S32 i = 0; i < NUM_MANIPULATORS; i++)
 	{
@@ -204,7 +198,8 @@ LLManipScale::LLManipScale( LLToolComposite* composite )
 
 LLManipScale::~LLManipScale()
 {
-	delete []mManipulatorScales;
+	for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
+	delete[] mManipulatorScales;
 }
 
 void LLManipScale::render()
@@ -471,8 +466,6 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 		LLVector3 max = bbox.getMaxLocal();
 		LLVector3 ctr = bbox.getCenterLocal();
 
-		mProjectedManipulators.deleteAllData();
-
 		S32 numManips = 0;
 		// corners
 		mManipulatorVertices[numManips++] = LLVector4(min.mV[VX], min.mV[VY], min.mV[VZ], 1.f);
@@ -496,6 +489,9 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 			mManipulatorVertices[numManips++] = LLVector4(ctr.mV[VX], ctr.mV[VY], min.mV[VZ], 1.f);
 		}
 
+		for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
+		mProjectedManipulators.clear();
+		
 		for (S32 i = 0; i < numManips; i++)
 		{
 			LLVector4 projectedVertex = mManipulatorVertices[i] * transform;
@@ -503,7 +499,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 
 			ManipulatorHandle* projManipulator = new ManipulatorHandle(LLVector3(projectedVertex.mV[VX], projectedVertex.mV[VY], 
 				projectedVertex.mV[VZ]), MANIPULATOR_IDS[i], (i < 7) ? SCALE_MANIP_CORNER : SCALE_MANIP_FACE);
-			mProjectedManipulators.addDataSorted(projManipulator);
+			mProjectedManipulators.insert(projManipulator);
 		}
 
 		F32 half_width = (F32)gViewerWindow->getWindowWidth() / 2.f;
@@ -514,9 +510,10 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 
 		mHighlightedPart = LL_NO_PART;
 
-		for (ManipulatorHandle* manipulator = mProjectedManipulators.getFirstData();
-			manipulator;
-			manipulator = mProjectedManipulators.getNextData())
+		for (minpulator_list_t::iterator iter = mProjectedManipulators.begin();
+			 iter != mProjectedManipulators.end(); ++iter)
+		{
+			ManipulatorHandle* manipulator = *iter;
 			{
 				manip2d.setVec(manipulator->mPosition.mV[VX] * half_width, manipulator->mPosition.mV[VY] * half_height);
 				
@@ -529,6 +526,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
 					break;
 				}
 			}
+		}
 	}
 
 	for (S32 i = 0; i < NUM_MANIPULATORS; i++)
diff --git a/indra/newview/llmanipscale.h b/indra/newview/llmanipscale.h
index 3ea5ee7d7aba5925c1e15e7f6d3f0ebfb991d04b..c02845e3586a87e1a181702445d32bbb28759ef6 100644
--- a/indra/newview/llmanipscale.h
+++ b/indra/newview/llmanipscale.h
@@ -124,6 +124,20 @@ private:
 	void			updateSnapGuides(const LLBBox& bbox);
 private:
 
+	struct compare_manipulators
+	{
+		bool operator() (const ManipulatorHandle* const a, const ManipulatorHandle* const b) const
+		{
+			if (a->mType != b->mType)
+				return a->mType < b->mType;
+			else if (a->mPosition.mV[VZ] != b->mPosition.mV[VZ])
+				return a->mPosition.mV[VZ] < b->mPosition.mV[VZ];
+			else
+				return a->mManipID < b->mManipID;
+		}
+	};
+
+
 	F32				mBoxHandleSize;		// The size of the handles at the corners of the bounding box
 	F32				mScaledBoxHandleSize; // handle size after scaling for selection feedback
 	EManipPart		mManipPart;
@@ -135,7 +149,8 @@ private:
 	S32				mLastMouseY;
 	BOOL			mSendUpdateOnMouseUp;
 	U32 			mLastUpdateFlags;
-	LLLinkedList<ManipulatorHandle>		mProjectedManipulators;
+	typedef std::set<ManipulatorHandle*, compare_manipulators> minpulator_list_t;
+	minpulator_list_t mProjectedManipulators;
 	LLVector4		mManipulatorVertices[14];
 	F32				mScaleSnapUnit1;  // size of snap multiples for axis 1
 	F32				mScaleSnapUnit2;  // size of snap multiples for axis 2
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 3182f149517398f196e16aee9b4bff401db06bf9..98d67f380454d3f03ec49524ca8ab46d7e2474f9 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -100,11 +100,6 @@ const U32 ARROW_TO_AXIS[4] =
 	VZ
 };
 
-BOOL sort_manip_by_end_z(LLManipTranslate::ManipulatorHandle *new_manip, LLManipTranslate::ManipulatorHandle *test_manip)
-{
-	return (new_manip->mEndPosition.mV[VZ] < test_manip->mEndPosition.mV[VZ]);
-}
-
 LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
 :	LLManip( "Move", composite ),
 	mLastHoverMouseX(-1),
@@ -125,8 +120,6 @@ LLManipTranslate::LLManipTranslate( LLToolComposite* composite )
 	mPlaneScales(1.f, 1.f, 1.f),
 	mPlaneManipPositions(1.f, 1.f, 1.f, 1.f)
 { 
-	mProjectedManipulators.setInsertBefore(sort_manip_by_end_z);
-
 	if (sGridTex == 0)
 	{ 
 		restoreGL();
@@ -253,7 +246,7 @@ void LLManipTranslate::restoreGL()
 
 LLManipTranslate::~LLManipTranslate()
 {
-	mProjectedManipulators.deleteAllData();
+	for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
 }
 
 
@@ -841,8 +834,6 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		transform *= projMatrix;
 	}
 		
-	mProjectedManipulators.deleteAllData();
-
 	S32 numManips = 0;
 
 	// edges
@@ -898,6 +889,9 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 		planar_manip_xy_visible = TRUE;
 	}
 
+	for_each(mProjectedManipulators.begin(), mProjectedManipulators.end(), DeletePointer());
+	mProjectedManipulators.clear();
+	
 	for (S32 i = 0; i < num_arrow_manips; i+= 2)
 	{
 		LLVector4 projected_start = mManipulatorVertices[i] * transform;
@@ -911,7 +905,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				10.f); // 10 pixel hotspot for arrows
-		mProjectedManipulators.addDataSorted(projManipulator);
+		mProjectedManipulators.insert(projManipulator);
 	}
 
 	if (planar_manip_yz_visible)
@@ -928,7 +922,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				20.f); // 20 pixels for planar manipulators
-		mProjectedManipulators.addDataSorted(projManipulator);
+		mProjectedManipulators.insert(projManipulator);
 	}
 
 	if (planar_manip_xz_visible)
@@ -945,7 +939,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				20.f); // 20 pixels for planar manipulators
-		mProjectedManipulators.addDataSorted(projManipulator);
+		mProjectedManipulators.insert(projManipulator);
 	}
 
 	if (planar_manip_xy_visible)
@@ -962,7 +956,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 				LLVector3(projected_end.mV[VX], projected_end.mV[VY], projected_end.mV[VZ]), 
 				MANIPULATOR_IDS[i / 2],
 				20.f); // 20 pixels for planar manipulators
-		mProjectedManipulators.addDataSorted(projManipulator);
+		mProjectedManipulators.insert(projManipulator);
 	}
 
 	LLVector2 manip_start_2d;
@@ -973,9 +967,10 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 	LLVector2 mousePos((F32)x - half_width, (F32)y - half_height);
 	LLVector2 mouse_delta;
 
-	for (ManipulatorHandle* manipulator = mProjectedManipulators.getFirstData();
-		manipulator;
-		manipulator = mProjectedManipulators.getNextData())
+	for (minpulator_list_t::iterator iter = mProjectedManipulators.begin();
+		 iter != mProjectedManipulators.end(); ++iter)
+	{
+		ManipulatorHandle* manipulator = *iter;
 		{
 			manip_start_2d.setVec(manipulator->mStartPosition.mV[VX] * half_width, manipulator->mStartPosition.mV[VY] * half_height);
 			manip_end_2d.setVec(manipulator->mEndPosition.mV[VX] * half_width, manipulator->mEndPosition.mV[VY] * half_height);
@@ -996,6 +991,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
 				break;
 			}
 		}
+	}
 }
 
 F32 LLManipTranslate::getMinGridScale()
diff --git a/indra/newview/llmaniptranslate.h b/indra/newview/llmaniptranslate.h
index 8821b64c90e75652c20295979bf92068ec92378c..c9f98e9c7d500fe517ee476aba224c663765666a 100644
--- a/indra/newview/llmaniptranslate.h
+++ b/indra/newview/llmaniptranslate.h
@@ -35,7 +35,6 @@
 #include "llmanip.h"
 #include "lltimer.h"
 #include "v4math.h"
-#include "linked_lists.h"
 #include "llquaternion.h"
 
 class LLManipTranslate : public LLManip
@@ -88,6 +87,17 @@ protected:
 	F32			getMinGridScale();
 
 private:
+	struct compare_manipulators
+	{
+		bool operator() (const ManipulatorHandle* const a, const ManipulatorHandle* const b) const
+		{
+			if (a->mEndPosition.mV[VZ] != b->mEndPosition.mV[VZ])
+				return (a->mEndPosition.mV[VZ] < b->mEndPosition.mV[VZ]);
+			else
+				return a->mManipID < b->mManipID;			
+		}
+	};
+	
 	S32			mLastHoverMouseX;
 	S32			mLastHoverMouseY;
 	BOOL		mSendUpdateOnMouseUp;
@@ -105,7 +115,8 @@ private:
 	LLVector3d	mDragCursorStartGlobal;
 	LLVector3d	mDragSelectionStartGlobal;
 	LLTimer		mUpdateTimer;
-	LLLinkedList<ManipulatorHandle>		mProjectedManipulators;
+	typedef std::set<ManipulatorHandle*, compare_manipulators> minpulator_list_t;
+	minpulator_list_t mProjectedManipulators;
 	LLVector4	mManipulatorVertices[18];
 	F32			mSnapOffsetMeters;
 	LLVector3	mSnapOffsetAxis;
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
index 68bbe5309097d3d68a38092783c36484b76d4ef9..080413bb5631d234b5dfcc11792757617031e419 100644
--- a/indra/newview/llmenucommands.cpp
+++ b/indra/newview/llmenucommands.cpp
@@ -41,7 +41,6 @@
 #include "message.h"
 
 #include "llagent.h"
-#include "llcallbacklist.h"
 #include "llcallingcard.h"
 #include "llchatbar.h"
 #include "llviewercontrol.h"
diff --git a/indra/newview/llmimetypes.cpp b/indra/newview/llmimetypes.cpp
index 67f7532ff65eab4fe807644aa4b1687d30a5dce1..e1bc3dbf117936725c0d83c8a1cc4225519863e8 100644
--- a/indra/newview/llmimetypes.cpp
+++ b/indra/newview/llmimetypes.cpp
@@ -53,7 +53,7 @@ bool LLMIMETypes::parseMIMETypes(const LLString& xml_filename)
 {
 	LLXMLNodePtr root;
 	bool success = LLViewerUICtrlFactory::getLayeredXMLNode(xml_filename, root);
-	if ( ! success || ! root.isNull() || ! root->hasName( "mimetypes" ) )
+	if ( ! success || root.isNull() || ! root->hasName( "mimetypes" ) )
 	{
 		llwarns << "Unable to read MIME type file: "
 			<< xml_filename << llendl;
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 4f1d7bb514182e58fa77d5512f49faa10f9a444e..4963b42a628b601d8c76968cabd3d75f1f670047 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -38,7 +38,6 @@
 
 // Viewer includes
 #include "llagent.h"
-#include "llcallbacklist.h"
 #include "llviewercontrol.h"
 #include "llfontgl.h"
 #include "llbutton.h"
diff --git a/indra/newview/llnamebox.h b/indra/newview/llnamebox.h
index 5fd92f5daac8ce3b0ab540d2dc7ccd9919f1417c..da8df5c225051fcd78b63c8858db62490dd62acc 100644
--- a/indra/newview/llnamebox.h
+++ b/indra/newview/llnamebox.h
@@ -37,7 +37,6 @@
 #include "llview.h"
 #include "llstring.h"
 #include "llfontgl.h"
-#include "linked_lists.h"
 #include "lltextbox.h"
 
 class LLNameBox
diff --git a/indra/newview/llnameeditor.h b/indra/newview/llnameeditor.h
index 9c89454c3330bae44fb00b3a481dc56787a078c6..a5a0c5d9c8391899409c9ca758577383ee89b4bd 100644
--- a/indra/newview/llnameeditor.h
+++ b/indra/newview/llnameeditor.h
@@ -38,7 +38,6 @@
 #include "v4color.h"
 #include "llstring.h"
 #include "llfontgl.h"
-#include "linked_lists.h"
 #include "lllineeditor.h"
 
 
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 0a078e10585f740fc79769007a24fdca31630d56..7ceb40499f09092da5224ba906169eb0397f5edc 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -36,7 +36,6 @@
 
 #include "indra_constants.h"
 #include "llui.h"
-#include "linked_lists.h"
 #include "llmath.h"		// clampf()
 #include "llfocusmgr.h"
 #include "llglimmediate.h"
diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp
index cda921ab8f2cdd095d3b688b68511ca841eab8bb..237826cb7a8f04b67c38b9fc7fbcfac0a638efdb 100644
--- a/indra/newview/lloverlaybar.cpp
+++ b/indra/newview/lloverlaybar.cpp
@@ -331,7 +331,15 @@ void LLOverlayBar::onClickStandUp(void*)
 ////////////////////////////////////////////////////////////////////////////////
 // static media helpers
 // *TODO: Move this into an audio manager abstraction
-
+//static
+void LLOverlayBar::mediaStop(void*)
+{
+	if (!gOverlayBar)
+	{
+		return;
+	}
+	LLViewerParcelMedia::stop();
+}
 //static
 void LLOverlayBar::toggleMediaPlay(void*)
 {
diff --git a/indra/newview/lloverlaybar.h b/indra/newview/lloverlaybar.h
index 741095e408cf81aa83f559a55edc2bdc47bbf01a..4fb438a71277d7a93ebe1dab01b7916fbb1f07d3 100644
--- a/indra/newview/lloverlaybar.h
+++ b/indra/newview/lloverlaybar.h
@@ -81,6 +81,7 @@ public:
 	static void toggleMusicPlay(void*);
 	static void musicPause(void*);
 	static void musicStop(void*);
+	static void mediaStop(void*);
 
 	static void toggleAudioVolumeFloater(void*);
 
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 6e5b7bfb41da53f638d873350356005bdbf7f632..a598dfebf5634fd90e06464960a2fb45a3944219 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -35,7 +35,6 @@
 #include "llpanel.h"
 #include "v3dmath.h"
 #include "lluuid.h"
-#include "linked_lists.h"
 #include "llwebbrowserctrl.h"
 
 class LLButton;
diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp
index f0acbf4b22784de4814c94220b5427cbdd1b33a0..1ad71075ae768ae4090b80edb5ed54617d23d62a 100644
--- a/indra/newview/llpanelobject.cpp
+++ b/indra/newview/llpanelobject.cpp
@@ -164,11 +164,10 @@ BOOL	LLPanelObject::postBuild()
 	childSetCommitCallback("material",onCommitMaterial,this);
 	mComboMaterial->removeall();
 	// *TODO:translate
-	LLMaterialInfo *minfop;
-	for (minfop = LLMaterialTable::basic.mMaterialInfoList.getFirstData(); 
-		 minfop != NULL; 
-		 minfop = LLMaterialTable::basic.mMaterialInfoList.getNextData())
+	for (LLMaterialTable::info_list_t::iterator iter = LLMaterialTable::basic.mMaterialInfoList.begin();
+		 iter != LLMaterialTable::basic.mMaterialInfoList.end(); ++iter)
 	{
+		LLMaterialInfo* minfop = *iter;
 		if (minfop->mMCode != LL_MCODE_LIGHT)
 		{
 			mComboMaterial->add(minfop->mName);
diff --git a/indra/newview/llpolymesh.cpp b/indra/newview/llpolymesh.cpp
index dc67ff48eac07b2e514a1f16253d6a1001739213..85d5def673dbe21d83a3ec9478995e3edddf463c 100644
--- a/indra/newview/llpolymesh.cpp
+++ b/indra/newview/llpolymesh.cpp
@@ -90,7 +90,8 @@ LLPolyMeshSharedData::LLPolyMeshSharedData()
 LLPolyMeshSharedData::~LLPolyMeshSharedData()
 {
 	freeMeshData();
-	mMorphData.deleteAllData();
+	for_each(mMorphData.begin(), mMorphData.end(), DeletePointer());
+	mMorphData.clear();
 }
 
 //-----------------------------------------------------------------------------
@@ -604,7 +605,7 @@ BOOL LLPolyMeshSharedData::loadMesh( const char *fileName )
 					continue;
 				}
 
-				mMorphData.addData(morph_data);
+				mMorphData.insert(morph_data);
 			}
 
 			S32 numRemaps;
@@ -759,11 +760,11 @@ LLPolyMesh *LLPolyMesh::getMesh(const LLString &name, LLPolyMesh* reference_mesh
 	//-------------------------------------------------------------------------
 	// search for an existing mesh by this name
 	//-------------------------------------------------------------------------
-	LLPolyMeshSharedData **meshSharedData = sGlobalSharedMeshList.getValue(name);
+	LLPolyMeshSharedData* meshSharedData = get_if_there(sGlobalSharedMeshList, name, (LLPolyMeshSharedData*)NULL);
 	if (meshSharedData)
 	{
 //		llinfos << "Polymesh " << name << " found in global mesh table." << llendl;
-		LLPolyMesh *poly_mesh = new LLPolyMesh(*meshSharedData, reference_mesh);
+		LLPolyMesh *poly_mesh = new LLPolyMesh(meshSharedData, reference_mesh);
 		return poly_mesh;
 	}
 
@@ -787,7 +788,7 @@ LLPolyMesh *LLPolyMesh::getMesh(const LLString &name, LLPolyMesh* reference_mesh
 	LLPolyMesh *poly_mesh = new LLPolyMesh(mesh_data, reference_mesh);
 
 //	llinfos << "Polymesh " << name << " added to global mesh table." << llendl;
-	sGlobalSharedMeshList.addToTail(name, poly_mesh->mSharedData);
+	sGlobalSharedMeshList[name] = poly_mesh->mSharedData;
 
 	return poly_mesh;
 }
@@ -797,21 +798,9 @@ LLPolyMesh *LLPolyMesh::getMesh(const LLString &name, LLPolyMesh* reference_mesh
 //-----------------------------------------------------------------------------
 void LLPolyMesh::freeAllMeshes()
 {
-	U32 i;
-
 	// delete each item in the global lists
-	for (i=0; i<sGlobalSharedMeshList.length(); i++)
-	{
-		// returns a pointer to the value, which is the pointer
-		// to the mesh
-		LLPolyMeshSharedData **shared_mesh_pp = sGlobalSharedMeshList.getValueAt(i);
-
-		// delete the mesh
-		delete *shared_mesh_pp;
-	}
-
-	// empty the lists
-	sGlobalSharedMeshList.removeAll();
+	for_each(sGlobalSharedMeshList.begin(), sGlobalSharedMeshList.end(), DeletePairedPointer());
+	sGlobalSharedMeshList.clear();
 }
 
 LLPolyMeshSharedData *LLPolyMesh::getSharedData() const
@@ -830,7 +819,7 @@ void LLPolyMesh::dumpDiagInfo()
 	U32 total_faces = 0;
 	U32 total_kb = 0;
 
-	char buf[1024];		/*Flawfinder: ignore*/
+	std::string buf;
 
 	llinfos << "-----------------------------------------------------" << llendl;
 	llinfos << "       Global PolyMesh Table (DEBUG only)" << llendl;
@@ -838,18 +827,17 @@ void LLPolyMesh::dumpDiagInfo()
 	llinfos << "-----------------------------------------------------" << llendl;
 
 	// print each loaded mesh, and it's memory usage
-	for (U32 i=0; i<sGlobalSharedMeshList.length(); i++)
+	for(LLPolyMeshSharedDataTable::iterator iter = sGlobalSharedMeshList.begin();
+		iter != sGlobalSharedMeshList.end(); ++iter)
 	{
-		std::string *mesh_name_p = sGlobalSharedMeshList.getIndexAt(i);
-
-		LLPolyMeshSharedData **mesh_pp = sGlobalSharedMeshList.getValueAt(i);
-		LLPolyMeshSharedData &mesh = **mesh_pp;
+		const std::string& mesh_name = iter->first;
+		LLPolyMeshSharedData* mesh = iter->second;
 
-		S32 num_verts = mesh.mNumVertices;
-		S32 num_faces = mesh.mNumFaces;
-		U32 num_kb = mesh.getNumKB();
+		S32 num_verts = mesh->mNumVertices;
+		S32 num_faces = mesh->mNumFaces;
+		U32 num_kb = mesh->getNumKB();
 
-		snprintf(buf, sizeof(buf), "%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name_p->c_str());			/* Flawfinder: ignore */
+		buf = llformat("%8d %8d %8d %s", num_verts, num_faces, num_kb, mesh_name.c_str());
 		llinfos << buf << llendl;
 
 		total_verts += num_verts;
@@ -858,7 +846,7 @@ void LLPolyMesh::dumpDiagInfo()
 	}
 
 	llinfos << "-----------------------------------------------------" << llendl;
-	snprintf(buf, sizeof(buf), "%8d %8d %8d TOTAL", total_verts, total_faces, total_kb );			/* Flawfinder: ignore */
+	buf = llformat("%8d %8d %8d TOTAL", total_verts, total_faces, total_kb );
 	llinfos << buf << llendl;
 	llinfos << "-----------------------------------------------------" << llendl;
 }
@@ -943,11 +931,12 @@ void LLPolyMesh::initializeForMorph()
 //-----------------------------------------------------------------------------
 LLPolyMorphData*	LLPolyMesh::getMorphData(const char *morph_name)
 {
-	if (!mSharedData) return NULL;
-	for (LLPolyMorphData *morph_data = mSharedData->mMorphData.getFirstData();
-		morph_data;
-		morph_data = mSharedData->mMorphData.getNextData())
+	if (!mSharedData)
+		return NULL;
+	for (LLPolyMeshSharedData::morphdata_list_t::iterator iter = mSharedData->mMorphData.begin();
+		 iter != mSharedData->mMorphData.end(); ++iter)
 	{
+		LLPolyMorphData *morph_data = *iter;
 		if (!strcmp(morph_data->getName(), morph_name))
 		{
 			return morph_data;
@@ -959,22 +948,25 @@ LLPolyMorphData*	LLPolyMesh::getMorphData(const char *morph_name)
 //-----------------------------------------------------------------------------
 // removeMorphData()
 //-----------------------------------------------------------------------------
-void	LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target)
-{
-	if (!mSharedData) return;
-
-	mSharedData->mMorphData.removeData(morph_target);
-}
+// // erasing but not deleting seems bad, but fortunately we don't actually use this...
+// void	LLPolyMesh::removeMorphData(LLPolyMorphData *morph_target)
+// {
+// 	if (!mSharedData)
+// 		return;
+// 	mSharedData->mMorphData.erase(morph_target);
+// }
 
 //-----------------------------------------------------------------------------
 // deleteAllMorphData()
 //-----------------------------------------------------------------------------
-void	LLPolyMesh::deleteAllMorphData()
-{
-	if (!mSharedData) return;
+// void	LLPolyMesh::deleteAllMorphData()
+// {
+// 	if (!mSharedData)
+// 		return;
 
-	mSharedData->mMorphData.deleteAllData();
-}
+// 	for_each(mSharedData->mMorphData.begin(), mSharedData->mMorphData.end(), DeletePointer());
+// 	mSharedData->mMorphData.clear();
+// }
 
 //-----------------------------------------------------------------------------
 // getWritableWeights()
diff --git a/indra/newview/llpolymesh.h b/indra/newview/llpolymesh.h
index 8003c4a89d3ee6c79223e94c3d4444fe2798e414..32e500e19d2acc89efeb2cb4f95fa906eac3e430 100644
--- a/indra/newview/llpolymesh.h
+++ b/indra/newview/llpolymesh.h
@@ -39,10 +39,7 @@
 #include "v3math.h"
 #include "v2math.h"
 #include "llquaternion.h"
-#include "llskipmap.h"
-#include "llassoclist.h"
 #include "llpolymorph.h"
-#include "llptrskipmap.h"
 #include "lljoint.h"
 //#include "lldarray.h"
 
@@ -99,8 +96,8 @@ private:
 	std::string*			mJointNames;
 
 	// morph targets
-	typedef LLLinkedList<LLPolyMorphData> LLPolyMorphDataList;
-	LLPolyMorphDataList			mMorphData;
+	typedef std::set<LLPolyMorphData*> morphdata_list_t;
+	morphdata_list_t			mMorphData;
 
 	std::map<S32, S32> 			mSharedVerts;
 	
@@ -113,11 +110,11 @@ public:
 	U32				mNumTriangleIndices;
 	U32				*mTriangleIndices;
 
-private:
+public:
 	LLPolyMeshSharedData();
-
 	~LLPolyMeshSharedData();
 
+private:
 	void setupLOD(LLPolyMeshSharedData* reference_data);
 
 	// Frees all mesh memory resources 
@@ -315,8 +312,8 @@ public:
 	}
 
 	LLPolyMorphData*	getMorphData(const char *morph_name);
-	void	removeMorphData(LLPolyMorphData *morph_target);
-	void	deleteAllMorphData();
+// 	void	removeMorphData(LLPolyMorphData *morph_target);
+// 	void	deleteAllMorphData();
 
 	LLPolyMeshSharedData *getSharedData() const;
 	LLPolyMesh *getReferenceMesh() { return mReferenceMesh ? mReferenceMesh : this; }
@@ -365,7 +362,7 @@ protected:
 	LLPolyMesh				*mReferenceMesh;
 
 	// global mesh list
-	typedef LLAssocList<std::string, LLPolyMeshSharedData*> LLPolyMeshSharedDataTable; 
+	typedef std::map<LLString, LLPolyMeshSharedData*> LLPolyMeshSharedDataTable; 
 	static LLPolyMeshSharedDataTable sGlobalSharedMeshList;
 
 	// Backlink only; don't make this an LLPointer.
diff --git a/indra/newview/llpolymorph.cpp b/indra/newview/llpolymorph.cpp
index 107b51d032819fc6b6e3480a3610183ab10a7973..5574ec67c78006bd8a55290f647185d27f2ca5e4 100644
--- a/indra/newview/llpolymorph.cpp
+++ b/indra/newview/llpolymorph.cpp
@@ -35,7 +35,6 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "llpolymorph.h"
-#include "linked_lists.h"
 #include "llvoavatar.h"
 #include "llxmltree.h"
 #include "llendianswizzle.h"
@@ -44,8 +43,6 @@
 
 const F32 NORMAL_SOFTEN_FACTOR = 0.65f;
 
-LLLinkedList<LLPolyMorphData> gLoadedMorphs;
-
 //-----------------------------------------------------------------------------
 // LLPolyMorphData()
 //-----------------------------------------------------------------------------
@@ -184,8 +181,6 @@ BOOL LLPolyMorphData::loadBinary(FILE *fp, LLPolyMeshSharedData *mesh)
 	mAvgDistortion = mAvgDistortion * (1.f/(F32)mNumIndices);
 	mAvgDistortion.normVec();
 
-	gLoadedMorphs.addData(this);
-
 	return TRUE;
 }
 
diff --git a/indra/newview/llpolymorph.h b/indra/newview/llpolymorph.h
index 0d6ebc304ba9844817ecc01016115fdbba48cc29..088963584ee7870adffd8826c521d38b74e82580 100644
--- a/indra/newview/llpolymorph.h
+++ b/indra/newview/llpolymorph.h
@@ -36,8 +36,6 @@
 #include <vector>
 
 #include "llviewervisualparam.h"
-#include "llskiplist.h"
-#include "linked_lists.h"
 
 class LLPolyMeshSharedData;
 class LLVOAvatar;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index d2e3dc1ed9383859b73781a5f6fbab86292ce123..f6556ffbd5ec625c4be30b23e313de005251d315 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -42,7 +42,6 @@
 #include "llglimmediate.h"
 #include "llpermissions.h"
 #include "llpermissionsflags.h"
-#include "llptrskiplist.h"
 #include "llundo.h"
 #include "lluuid.h"
 #include "llvolume.h"
diff --git a/indra/newview/lltextureview.h b/indra/newview/lltextureview.h
index 60bf63479b6920e5642e5dcfe7e4a8aa633c9eff..4c5fb1ce68dededebbbc1d33cf6239317d5ed4b2 100644
--- a/indra/newview/lltextureview.h
+++ b/indra/newview/lltextureview.h
@@ -33,7 +33,6 @@
 #define LL_LLTEXTUREVIEW_H
 
 #include "llcontainerview.h"
-#include "linked_lists.h"
 
 class LLViewerImage;
 class LLTextureBar;
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 5a637a6346a71eafc611af95a071d425dbf0a6da..d39ce57e566f11c7eac8345df191ec47eaa314da 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -108,10 +108,10 @@ void LLToolBrushLand::modifyLandAtPointGlobal(const LLVector3d &pos_global,
 	S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
 
 	determineAffectedRegions(mLastAffectedRegions, pos_global);
-	for(LLViewerRegion* regionp = mLastAffectedRegions.getFirstData();
-				regionp != NULL;
-				regionp = mLastAffectedRegions.getNextData())
+	for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+		iter != mLastAffectedRegions.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		//BOOL is_changed = FALSE;
 		LLVector3 pos_region = regionp->getPosRegionFromGlobal(pos_global);
 		LLSurface &land = regionp->getLand();
@@ -200,7 +200,7 @@ void LLToolBrushLand::modifyLandInSelectionGlobal()
 
 	S32 radioAction = gSavedSettings.getS32("RadioLandBrushAction");
 
-	mLastAffectedRegions.removeAllNodes();
+	mLastAffectedRegions.clear();
 
 	determineAffectedRegions(mLastAffectedRegions, LLVector3d(min.mdV[VX], min.mdV[VY], 0));
 	determineAffectedRegions(mLastAffectedRegions, LLVector3d(min.mdV[VX], max.mdV[VY], 0));
@@ -223,10 +223,10 @@ void LLToolBrushLand::modifyLandInSelectionGlobal()
 	}
 
 	// Stop if our selection include a no-terraform region
-	for(LLViewerRegion* regionp = mLastAffectedRegions.getFirstData();
-				regionp != NULL;
-				regionp = mLastAffectedRegions.getNextData())
+	for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+		iter != mLastAffectedRegions.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		if (!canTerraform(regionp))
 		{
 			alertNoTerraform(regionp);
@@ -234,10 +234,10 @@ void LLToolBrushLand::modifyLandInSelectionGlobal()
 		}
 	}
 
-	for(LLViewerRegion* regionp = mLastAffectedRegions.getFirstData();
-				regionp != NULL;
-				regionp = mLastAffectedRegions.getNextData())
+	for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+		iter != mLastAffectedRegions.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		//BOOL is_changed = FALSE;
 		LLVector3 min_region = regionp->getPosRegionFromGlobal(min);
 		LLVector3 max_region = regionp->getPosRegionFromGlobal(max);
@@ -398,7 +398,7 @@ BOOL LLToolBrushLand::handleHover( S32 x, S32 y, MASK mask )
 BOOL LLToolBrushLand::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	BOOL handled = FALSE;
-	mLastAffectedRegions.removeAllNodes();
+	mLastAffectedRegions.clear();
 	if( hasMouseCapture() )
 	{
 		// Release the mouse
@@ -452,15 +452,15 @@ void LLToolBrushLand::render()
 			spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 );
 
 			mBrushIndex = gSavedSettings.getS32("RadioLandBrushSize");
-			LLLinkedList<LLViewerRegion> regions;
+			region_list_t regions;
 			determineAffectedRegions(regions, spot);
 
 			// Now, for each region, render the overlay
 			LLVector3 pos_world = gAgent.getRegion()->getPosRegionFromGlobal(spot);
-			for(LLViewerRegion* region = regions.getFirstData();
-				region != NULL;
-				region = regions.getNextData())
+			for(region_list_t::iterator iter = regions.begin();
+				iter != regions.end(); ++iter)
 			{
+				LLViewerRegion* region = *iter;
 				renderOverlay(region->getLand(), 
 							  region->getPosRegionFromGlobal(spot),
 							  pos_world);
@@ -499,7 +499,7 @@ void LLToolBrushLand::renderOverlay(LLSurface& land, const LLVector3& pos_region
 	glPopMatrix();
 }
 
-void LLToolBrushLand::determineAffectedRegions(LLLinkedList<LLViewerRegion>& regions,
+void LLToolBrushLand::determineAffectedRegions(region_list_t& regions,
 											   const LLVector3d& spot ) const
 {
 	LLVector3d corner(spot);
@@ -507,27 +507,27 @@ void LLToolBrushLand::determineAffectedRegions(LLLinkedList<LLViewerRegion>& reg
 	corner.mdV[VY] -= (LAND_BRUSH_SIZE[mBrushIndex] / 2);
 	LLViewerRegion* region = NULL;
 	region = gWorldPointer->getRegionFromPosGlobal(corner);
-	if(region && !regions.checkData(region))
+	if(region && regions.find(region) == regions.end())
 	{
-		regions.addData(region);
+		regions.insert(region);
 	}
 	corner.mdV[VY] += LAND_BRUSH_SIZE[mBrushIndex];
 	region = gWorldPointer->getRegionFromPosGlobal(corner);
-	if(region && !regions.checkData(region))
+	if(region && regions.find(region) == regions.end())
 	{
-		regions.addData(region);
+		regions.insert(region);
 	}
 	corner.mdV[VX] += LAND_BRUSH_SIZE[mBrushIndex];
 	region = gWorldPointer->getRegionFromPosGlobal(corner);
-	if(region && !regions.checkData(region))
+	if(region && regions.find(region) == regions.end())
 	{
-		regions.addData(region);
+		regions.insert(region);
 	}
 	corner.mdV[VY] -= LAND_BRUSH_SIZE[mBrushIndex];
 	region = gWorldPointer->getRegionFromPosGlobal(corner);
-	if(region && !regions.checkData(region))
+	if(region && regions.find(region) == regions.end())
 	{
-		regions.addData(region);
+		regions.insert(region);
 	}
 }
 
@@ -554,10 +554,10 @@ void LLToolBrushLand::onMouseCaptureLost()
 // static
 void LLToolBrushLand::undo()
 {
-	for(LLViewerRegion* regionp = mLastAffectedRegions.getFirstData();
-			regionp != NULL;
-			regionp = mLastAffectedRegions.getNextData())
+	for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+		iter != mLastAffectedRegions.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		gMessageSystem->newMessageFast(_PREHASH_UndoLand);
 		gMessageSystem->nextBlockFast(_PREHASH_AgentData);
 		gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
@@ -570,10 +570,10 @@ void LLToolBrushLand::undo()
 /*
 void LLToolBrushLand::redo()
 {
-	for(LLViewerRegion* regionp = mLastAffectedRegions.getFirstData();
-			regionp != NULL;
-			regionp = mLastAffectedRegions.getNextData())
+	for(region_list_t::iterator iter = mLastAffectedRegions.begin();
+		iter != mLastAffectedRegions.end(); ++iter)
 	{
+		LLViewerRegion* regionp = *iter;
 		gMessageSystem->newMessageFast(_PREHASH_RedoLand);
 		gMessageSystem->nextBlockFast(_PREHASH_AgentData);
 		gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h
index 738934ebb19071f8eb1bdf6bc731a558fbab19af..c46037a8f76eaba64c61590dac384e8c1bf23c88 100644
--- a/indra/newview/lltoolbrush.h
+++ b/indra/newview/lltoolbrush.h
@@ -40,8 +40,6 @@ class LLSurface;
 class LLVector3d;
 class LLViewerRegion;
 
-template<class DATA_TYPE> class LLLinkedList;
-
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLToolBrushLand
 //
@@ -50,6 +48,8 @@ template<class DATA_TYPE> class LLLinkedList;
 
 class LLToolBrushLand : public LLTool, public LLEditMenuHandler
 {
+	typedef std::set<LLViewerRegion*> region_list_t;
+
 public:
 	LLToolBrushLand();
 	
@@ -80,7 +80,7 @@ protected:
 	void brush( void );
 	void modifyLandAtPointGlobal( const LLVector3d &spot, MASK mask );
 
-	void determineAffectedRegions(LLLinkedList<LLViewerRegion>& regions,
+	void determineAffectedRegions(region_list_t& regions,
 								  const LLVector3d& spot) const;
 	void renderOverlay(LLSurface& land, const LLVector3& pos_region,
 					   const LLVector3& pos_world);
@@ -99,7 +99,8 @@ protected:
 	BOOL mGotHover;
 	BOOL mLastShowParcelOwners;
 	BOOL mBrushSelected;
-	LLLinkedList<LLViewerRegion> mLastAffectedRegions;
+	// Order doesn't matter and we do check for existance of regions, so use a set
+	region_list_t mLastAffectedRegions;
 };
 
 extern LLToolBrushLand *gToolLand;
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 0e46ece7946c814939bcef86a867acf7cce81227..c365f14674a77cb46847f7a88279367eebad3d7b 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -438,9 +438,7 @@ void LLToolMgr::clearSavedTool()
 
 void LLToolset::addTool(LLTool* tool)
 {
-	llassert( !mToolList.checkData( tool ) ); // check for duplicates
-
-	mToolList.addDataAtEnd( tool );
+	mToolList.push_back( tool );
 	if( !mSelectedTool )
 	{
 		mSelectedTool = tool;
@@ -457,7 +455,7 @@ void LLToolset::selectTool(LLTool* tool)
 
 void LLToolset::selectToolByIndex( S32 index )
 {
-	LLTool *tool = mToolList.getNthData( index );
+	LLTool *tool = (index >= 0 && index < (S32)mToolList.size()) ? mToolList[index] : NULL;
 	if (tool)
 	{
 		mSelectedTool = tool;
@@ -467,13 +465,14 @@ void LLToolset::selectToolByIndex( S32 index )
 
 BOOL LLToolset::isToolSelected( S32 index )
 {
-	return (mToolList.getNthData( index ) == mSelectedTool);
+	LLTool *tool = (index >= 0 && index < (S32)mToolList.size()) ? mToolList[index] : NULL;
+	return (tool == mSelectedTool);
 }
 
 
 void LLToolset::selectFirstTool()
 {
-	mSelectedTool = mToolList.getFirstData();
+	mSelectedTool = (0 < mToolList.size()) ? mToolList[0] : NULL;
 	if (gToolMgr) 
 	{
 		gToolMgr->setCurrentTool( mSelectedTool );
@@ -484,43 +483,52 @@ void LLToolset::selectFirstTool()
 void LLToolset::selectNextTool()
 {
 	LLTool* next = NULL;
-	for( LLTool* cur = mToolList.getFirstData(); cur; cur = mToolList.getNextData() )
+	for( tool_list_t::iterator iter = mToolList.begin();
+		 iter != mToolList.end(); )
 	{
-		if( cur == mSelectedTool )
+		LLTool* cur = *iter++;
+		if( cur == mSelectedTool && iter != mToolList.end() )
 		{
-			next = mToolList.getNextData();
+			next = *iter;
 			break;
 		}
 	}
 
-	if( !next )
+	if( next )
 	{
-		next = mToolList.getFirstData();
+		mSelectedTool = next;
+		gToolMgr->setCurrentTool( mSelectedTool );
+	}
+	else
+	{
+		selectFirstTool();
 	}
-
-	mSelectedTool = next;
-	gToolMgr->setCurrentTool( mSelectedTool );
 }
 
 void LLToolset::selectPrevTool()
 {
 	LLTool* prev = NULL;
-	for( LLTool* cur = mToolList.getLastData(); cur; cur = mToolList.getPreviousData() )
+	for( tool_list_t::reverse_iterator iter = mToolList.rbegin();
+		 iter != mToolList.rend(); )
 	{
-		if( cur == mSelectedTool )
+		LLTool* cur = *iter++;
+		if( cur == mSelectedTool && iter != mToolList.rend() )
 		{
-			prev = mToolList.getPreviousData();
+			prev = *iter;
 			break;
 		}
 	}
 
-	if( !prev )
+	if( prev )
 	{
-		prev = mToolList.getLastData();
+		mSelectedTool = prev;
+		gToolMgr->setCurrentTool( mSelectedTool );
+	}
+	else if (mToolList.size() > 0)
+	{
+		selectToolByIndex((S32)mToolList.size()-1);
 	}
 	
-	mSelectedTool = prev;
-	gToolMgr->setCurrentTool( mSelectedTool );
 }
 
 void select_tool( void *tool_pointer )
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index 557208be7ba48fa89b3229959f12a888b819ca7b..c1e144b2523435e780bdcf1207628bb18fc3e128 100644
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -32,7 +32,6 @@
 #ifndef LL_TOOLMGR_H
 #define LL_TOOLMGR_H
 
-#include "doublelinkedlist.h"
 #include "llkeyboard.h"
 
 class LLTool;
@@ -108,7 +107,8 @@ public:
 
 protected:
 	LLTool*			mSelectedTool;
-	LLDoubleLinkedList<LLTool> mToolList;
+	typedef std::vector<LLTool*> tool_list_t;
+	tool_list_t 	mToolList;
 };
 
 // Handy callbacks for switching tools
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index e32f9bfcc172fbdd54e1ede225168b8bffe0029b..25d20f96aac7a8c72dbabff03dd93afad7aa6c8f 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -67,7 +67,7 @@
 //LLToolMorph *gToolMorph = NULL;
 
 //static
-LLLinkedList<LLVisualParamHint> LLVisualParamHint::sInstances;
+LLVisualParamHint::instance_list_t LLVisualParamHint::sInstances;
 BOOL LLVisualParamReset::sDirty = FALSE;
 
 //-----------------------------------------------------------------------------
@@ -93,7 +93,7 @@ LLVisualParamHint::LLVisualParamHint(
 	mRect( pos_x, pos_y + height, pos_x + width, pos_y ),
 	mLastParamWeight(0.f)
 {
-	LLVisualParamHint::sInstances.addData( this );
+	LLVisualParamHint::sInstances.insert( this );
 	LLUUID id;
 	id.set( gViewerArt.getString("avatar_thumb_bkgrnd.tga") );
 	mBackgroundp = gImageList.getImage(id, FALSE, TRUE);
@@ -108,7 +108,7 @@ LLVisualParamHint::LLVisualParamHint(
 //-----------------------------------------------------------------------------
 LLVisualParamHint::~LLVisualParamHint()
 {
-	LLVisualParamHint::sInstances.removeData( this );
+	LLVisualParamHint::sInstances.erase( this );
 }
 
 //-----------------------------------------------------------------------------
@@ -119,10 +119,10 @@ LLVisualParamHint::~LLVisualParamHint()
 void LLVisualParamHint::requestHintUpdates( LLVisualParamHint* exception1, LLVisualParamHint* exception2 )
 {
 	S32 delay_frames = 0;
-	for(LLVisualParamHint* instance = sInstances.getFirstData();
-		instance;
-		instance = sInstances.getNextData())
+	for (instance_list_t::iterator iter = sInstances.begin();
+		 iter != sInstances.end(); ++iter)
 	{
+		LLVisualParamHint* instance = *iter;
 		if( (instance != exception1) && (instance != exception2) )
 		{
 			if( instance->mAllowsUpdates )
diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h
index 72e73b0934b3a744b68f98c449ceee5e269bfce9..4c3489b35f563813872141831f7cb9246c3e3366 100644
--- a/indra/newview/lltoolmorph.h
+++ b/indra/newview/lltoolmorph.h
@@ -35,7 +35,6 @@
 #include "lltool.h"
 #include "m4math.h"
 #include "v2math.h"
-#include "linked_lists.h"
 #include "lldynamictexture.h"
 #include "llundo.h"
 #include "lltextbox.h"
@@ -93,8 +92,9 @@ protected:
 	F32						mLastParamWeight;
 
 	LLPointer<LLViewerImage> mBackgroundp;
-	
-	static LLLinkedList<LLVisualParamHint> sInstances;
+
+	typedef std::set<LLVisualParamHint*> instance_list_t;
+	static instance_list_t sInstances;
 };
 
 // this class resets avatar data at the end of an update cycle
diff --git a/indra/newview/lltoolview.cpp b/indra/newview/lltoolview.cpp
index 93729a5b91f44565f26dd22cd44b06e536091e11..ad7a9800916770975fa5ad65fc12ac21b603863f 100644
--- a/indra/newview/lltoolview.cpp
+++ b/indra/newview/lltoolview.cpp
@@ -72,7 +72,8 @@ LLToolView::LLToolView(const std::string& name, const LLRect& rect)
 
 LLToolView::~LLToolView()
 {
-	mContainList.deleteAllData();
+	for_each(mContainList.begin(), mContainList.end(), DeletePointer());
+	mContainList.clear();
 }
 
 //*TODO:translate?
@@ -118,7 +119,7 @@ void LLToolView::addTool(const LLString& icon_off, const LLString& icon_on, LLPa
 		addChild(contain->mPanel);
 	}
 
-	mContainList.addData(contain);
+	mContainList.push_back(contain);
 }
 
 
@@ -153,11 +154,10 @@ void LLToolView::draw()
 	// turn off highlighting for all containers 
 	// and hide all option panels except for the selected one.
 	LLTool* selected = gToolMgr->getCurrentToolset()->getSelectedTool();
-	for( LLToolContainer* contain = mContainList.getFirstData();
-		 contain != NULL;
-		 contain = mContainList.getNextData()
-		)
+	for (contain_list_t::iterator iter = mContainList.begin();
+		 iter != mContainList.end(); ++iter)
 	{
+		LLToolContainer* contain = *iter;
 		BOOL state = (contain->mTool == selected);
 		contain->mButton->setToggleState( state );
 		if (contain->mPanel)
@@ -175,8 +175,10 @@ LLToolContainer* LLToolView::findToolContainer( LLTool *tool )
 {
 	// Find the container for this tool
 	llassert( tool );
-	for( LLToolContainer* contain = mContainList.getFirstData(); contain; contain = mContainList.getNextData() )
+	for (contain_list_t::iterator iter = mContainList.begin();
+		 iter != mContainList.end(); ++iter)
 	{
+		LLToolContainer* contain = *iter;
 		if( contain->mTool == tool )
 		{
 			return contain;
diff --git a/indra/newview/lltoolview.h b/indra/newview/lltoolview.h
index bde0010466f0a7a8c0a0ca57651a1e7c0aede472..23f4263602d988c1df8874f85983c27464324495 100644
--- a/indra/newview/lltoolview.h
+++ b/indra/newview/lltoolview.h
@@ -33,7 +33,6 @@
 #define LL_LLTOOLVIEW_H
 
 // requires stdtypes.h
-#include "linked_lists.h"
 #include "llpanel.h"
 
 // forward declares
@@ -84,8 +83,8 @@ private:
 
 
 private:
-	LLLinkedList
-		<LLToolContainer>	mContainList;
+	typedef std::vector<LLToolContainer*> contain_list_t;
+	contain_list_t 			mContainList;
 	S32						mButtonCount;			// used to compute rectangles
 };
 
diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp
index b9f2ef2ddfc5cd9fb69f6a5567e9aefcb0b619f0..ac41e027446db27253354e932df7d318421b1573 100644
--- a/indra/newview/lluploaddialog.cpp
+++ b/indra/newview/lluploaddialog.cpp
@@ -100,7 +100,7 @@ void LLUploadDialog::setMessage( const std::string& msg)
 
 	// Split message into lines, separated by '\n'
 	S32 max_msg_width = 0;
-	LLDoubleLinkedList<LLString> msg_lines;
+	std::list<std::string> msg_lines;
 
 	S32 size = msg.size() + 1;// + strlen("Uploading...\n\n");
 	char* temp_msg = new char[size];
@@ -118,7 +118,7 @@ void LLUploadDialog::setMessage( const std::string& msg)
 	{
 		S32 cur_width = S32(font->getWidth(token) + 0.99f) + TEXT_PAD;
 		max_msg_width = llmax( max_msg_width, cur_width );
-		msg_lines.addDataAtEnd( new LLString( token ) );
+		msg_lines.push_back( std::string( token ) );
 		token = strtok( NULL, "\n" );
 	}
 	delete[] temp_msg;
@@ -126,7 +126,7 @@ void LLUploadDialog::setMessage( const std::string& msg)
 
 	S32 line_height = S32( font->getLineHeight() + 0.99f );
 	S32 dialog_width = max_msg_width + 2 * HPAD;
-	S32 dialog_height = line_height * msg_lines.getLength() + 2 * VPAD;
+	S32 dialog_height = line_height * msg_lines.size() + 2 * VPAD;
 
 	reshape( dialog_width, dialog_height, FALSE );
 
@@ -139,18 +139,19 @@ void LLUploadDialog::setMessage( const std::string& msg)
 		mLabelBox[line_num]->setVisible(FALSE);
 	}
 	line_num = 0;
-	for( LLString* cur_line = msg_lines.getFirstData(); cur_line; cur_line = msg_lines.getNextData() )
+	for (std::list<std::string>::iterator iter = msg_lines.begin();
+		 iter != msg_lines.end(); ++iter)
 	{
+		std::string& cur_line = *iter;
 		LLRect msg_rect;
 		msg_rect.setOriginAndSize( msg_x, msg_y, max_msg_width, line_height );
 		mLabelBox[line_num]->setRect(msg_rect);
-		mLabelBox[line_num]->setText(*cur_line);
+		mLabelBox[line_num]->setText(cur_line);
 		mLabelBox[line_num]->setColor( gColors.getColor( "LabelTextColor" ) );
 		mLabelBox[line_num]->setVisible(TRUE);
 		msg_y -= line_height;
 		++line_num;
 	}
-	msg_lines.deleteAllData();
 
 	centerWithin(gViewerWindow->getRootView()->getRect());
 }
diff --git a/indra/newview/llurlhistory.cpp b/indra/newview/llurlhistory.cpp
index 8f9c9266160b309dbbb6b86ded8bf7c9358f57dd..d5241a4e985885120675d4663b7bb1ec6c05e908 100644
--- a/indra/newview/llurlhistory.cpp
+++ b/indra/newview/llurlhistory.cpp
@@ -62,6 +62,7 @@ bool LLURLHistory::loadFile(const LLString& filename)
 			llinfos << "file missing, ill-formed, "
 				"or simply undefined; not changing the"
 				" file" << llendl;
+			sHistorySD = LLSD();
 			return false;
 		}
 	}
@@ -100,8 +101,11 @@ LLSD LLURLHistory::getURLHistory(const std::string& collection)
 // static
 void LLURLHistory::addURL(const std::string& collection, const std::string& url)
 {
-	sHistorySD[collection].insert(0, url);
-	LLURLHistory::limitSize(collection);
+	if(! url.empty())
+	{
+		sHistorySD[collection].insert(0, url);
+		LLURLHistory::limitSize(collection);
+	}
 }
 // static
 void LLURLHistory::removeURL(const std::string& collection, const std::string& url)
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 16cbb3272f24eb0ac7913040c14cbcd8949ac390..5200c321dbbc124ad3050bbcd9eaa3dd967b3290 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -4121,7 +4121,7 @@ void process_alert_core(const std::string& message, BOOL modal)
 	}
 }
 
-LLLinkedList<LLMeanCollisionData>	gMeanCollisionList;
+mean_collision_list_t				gMeanCollisionList;
 time_t								gLastDisplayedTime = 0;
 
 void handle_show_mean_events(void *)
@@ -4141,15 +4141,19 @@ void mean_name_callback(const LLUUID &id, const char *first, const char *last, B
 		return;
 	}
 
-	while(gMeanCollisionList.getLength() > 20)
+	static const int max_collision_list_size = 20;
+	if (gMeanCollisionList.size() > max_collision_list_size)
 	{
-		gMeanCollisionList.getLastData();
-		gMeanCollisionList.deleteCurrentData();
+		mean_collision_list_t::iterator iter = gMeanCollisionList.begin();
+		for (S32 i=0; i<max_collision_list_size; i++) iter++;
+		for_each(iter, gMeanCollisionList.end(), DeletePointer());
+		gMeanCollisionList.erase(iter, gMeanCollisionList.end());
 	}
 
-	LLMeanCollisionData *mcd;
-	for (mcd = gMeanCollisionList.getFirstData(); mcd; mcd = gMeanCollisionList.getNextData())
+	for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin();
+		 iter != gMeanCollisionList.end(); ++iter)
 	{
+		LLMeanCollisionData *mcd = *iter;
 		if (mcd->mPerp == id)
 		{
 			strncpy(mcd->mFirstName, first, DB_FIRST_NAME_BUF_SIZE -1);		/* Flawfinder: ignore */
@@ -4190,12 +4194,12 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use
 
 		type = (EMeanCollisionType)u8type;
 
-		LLMeanCollisionData *mcd;
-
 		BOOL b_found = FALSE;
 
-		for (mcd = gMeanCollisionList.getFirstData(); mcd; mcd = gMeanCollisionList.getNextData())
+		for (mean_collision_list_t::iterator iter = gMeanCollisionList.begin();
+			 iter != gMeanCollisionList.end(); ++iter)
 		{
+			LLMeanCollisionData *mcd = *iter;
 			if ((mcd->mPerp == perp) && (mcd->mType == type))
 			{
 				mcd->mTime = time;
@@ -4208,7 +4212,7 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use
 		if (!b_found)
 		{
 			LLMeanCollisionData *mcd = new LLMeanCollisionData(gAgentID, perp, time, type, mag);
-			gMeanCollisionList.addData(mcd);
+			gMeanCollisionList.push_front(mcd);
 			const BOOL is_group = FALSE;
 			gCacheName->get(perp, is_group, mean_name_callback);
 		}
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index f7739f0871984ae029552282ad933ba6a162554e..23783058a0a5332ca04feaa635de558f666c9552 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -111,6 +111,9 @@ void process_agent_alert_message(LLMessageSystem* msgsystem, void** user_data);
 void process_alert_core(const std::string& message, BOOL modal);
 
 // "Mean" or player-vs-player abuse
+typedef std::list<LLMeanCollisionData*> mean_collision_list_t;
+extern mean_collision_list_t gMeanCollisionList;
+
 void handle_show_mean_events(void *);
 void process_mean_collision_alert_message(LLMessageSystem* msg, void**);
 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 602b60bc9d4cd1b8fe67b02ee27aa67c62739f28..e89722fde8e19fd8d3b3d9c5def7cb16c33fb12b 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2292,7 +2292,7 @@ void LLViewerObject::dirtyInventory()
 	// If there aren't any LLVOInventoryListeners, we won't be
 	// able to update our mInventory when it comes back from the
 	// simulator, so we should not clear the inventory either.
-	if(mInventory && !mInventoryCallbacks.isEmpty())
+	if(mInventory && !mInventoryCallbacks.empty())
 	{
 		mInventory->clear(); // will deref and delete entries
 		delete mInventory;
@@ -2308,20 +2308,22 @@ void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener,
 	LLInventoryCallbackInfo* info = new LLInventoryCallbackInfo;
 	info->mListener = listener;
 	info->mInventoryData = user_data;
-	mInventoryCallbacks.addData(info);
+	mInventoryCallbacks.push_front(info);
 }
 
 void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener)
 {
-	if (listener == NULL) return;
-	LLInventoryCallbackInfo* info;
-	for (info = mInventoryCallbacks.getFirstData();
-		info;
-		info = mInventoryCallbacks.getNextData() )
+	if (listener == NULL)
+		return;
+	for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
+		 iter != mInventoryCallbacks.end(); )
 	{
+		callback_list_t::iterator curiter = iter++;
+		LLInventoryCallbackInfo* info = *curiter;
 		if (info->mListener == listener)
 		{
-			mInventoryCallbacks.deleteCurrentData();
+			delete info;
+			mInventoryCallbacks.erase(curiter);
 			break;
 		}
 	}
@@ -2329,7 +2331,8 @@ void LLViewerObject::removeInventoryListener(LLVOInventoryListener* listener)
 
 void LLViewerObject::clearInventoryListeners()
 {
-	mInventoryCallbacks.deleteAllData();
+	for_each(mInventoryCallbacks.begin(), mInventoryCallbacks.end(), DeletePointer());
+	mInventoryCallbacks.clear();
 }
 
 void LLViewerObject::requestInventory()
@@ -2518,10 +2521,11 @@ void LLViewerObject::loadTaskInvFile(const char* filename)
 
 void LLViewerObject::doInventoryCallback()
 {
-	for(LLInventoryCallbackInfo* info = mInventoryCallbacks.getFirstData();
-		info != NULL;
-		info = mInventoryCallbacks.getNextData())
+	for (callback_list_t::iterator iter = mInventoryCallbacks.begin();
+		 iter != mInventoryCallbacks.end(); )
 	{
+		callback_list_t::iterator curiter = iter++;
+		LLInventoryCallbackInfo* info = *curiter;
 		if (info->mListener != NULL)
 		{
 			info->mListener->inventoryChanged(this,
@@ -2532,7 +2536,8 @@ void LLViewerObject::doInventoryCallback()
 		else
 		{
 			llinfos << "LLViewerObject::doInventoryCallback() deleting bad listener entry." << llendl;
-			mInventoryCallbacks.deleteCurrentData();
+			delete info;
+			mInventoryCallbacks.erase(curiter);
 		}
 	}
 	mInventoryPending = FALSE;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index c11c3c891e8a5f1c97cc4b822a3d9105558de126..38744c35cf7a282dc8fc0fb830ed8b777b097025 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -34,7 +34,6 @@
 
 #include <map>
 
-#include "linked_lists.h"
 #include "llassetstorage.h"
 #include "lldarrayptr.h"
 #include "llhudtext.h"
@@ -591,7 +590,8 @@ protected:
 		LLVOInventoryListener* mListener;
 		void* mInventoryData;
 	};
-	LLLinkedList<LLInventoryCallbackInfo> mInventoryCallbacks;
+	typedef std::list<LLInventoryCallbackInfo*> callback_list_t;
+	callback_list_t mInventoryCallbacks;
 	S16 mInventorySerialNum;
 
 	LLViewerRegion	*mRegionp;					// Region that this object belongs to.
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index 95c65d15ce88b9c52d7d3a7d0272a59d1a110879..39603cfd3bd3d171553c89af9f5a7b6b4d7e8228 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -36,10 +36,8 @@
 #include <set>
 
 // common includes
-#include "doublelinkedlist.h"
 #include "llstat.h"
 #include "lldarrayptr.h"
-#include "llskipmap.h"
 #include "llstring.h"
 
 // project includes
diff --git a/indra/newview/llviewerpartsim.h b/indra/newview/llviewerpartsim.h
index 51b8e5a42a1ec3d3cf69c4b19102ef765bc9522f..343425f3d45d8ce9801f96a6d345eda030e0f400 100644
--- a/indra/newview/llviewerpartsim.h
+++ b/indra/newview/llviewerpartsim.h
@@ -33,7 +33,6 @@
 #define LL_LLVIEWERPARTSIM_H
 
 #include "lldarrayptr.h"
-#include "llskiplist.h"
 #include "llframetimer.h"
 #include "llmemory.h"
 
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index 0e0265d30b3ce84e8d7c205e6466403f616b3053..ce0fe2c8368431c3de36099cd0b19f4375389e24 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -68,21 +68,17 @@
 
 // Library headers from llcommon project:
 #include "bitpack.h"
-#include "doublelinkedlist.h"
 #include "imageids.h"
 #include "indra_constants.h"
 //#include "linden_common.h"
 //#include "llpreprocessor.h"
-#include "linked_lists.h"
 #include "llapp.h"
 #include "llapr.h"
-#include "llassoclist.h"
 #include "llcriticaldamp.h"
 #include "lldarray.h"
 #include "lldarrayptr.h"
 #include "lldefs.h"
 #include "lldepthstack.h"
-#include "lldlinked.h"
 #include "lldqueueptr.h"
 #include "llendianswizzle.h"
 #include "llerror.h"
@@ -90,18 +86,13 @@
 #include "llfixedbuffer.h"
 #include "llframetimer.h"
 #include "llhash.h"
-#include "lllinkedqueue.h"
 #include "lllocalidhashmap.h"
 #include "llmap.h"
 #include "llmemory.h"
 #include "llnametable.h"
 #include "llpriqueuemap.h"
 #include "llprocessor.h"
-#include "llptrskiplist.h"
-#include "llptrskipmap.h"
 //#include "llsecondlifeurls.h"
-#include "llskiplist.h"
-#include "llskipmap.h"
 #include "llstack.h"
 #include "llstat.h"
 #include "llstl.h"
@@ -170,7 +161,6 @@
 // Library includes from llmessage project
 //#include "llassetstorage.h"
 #include "llcachename.h"
-#include "llcallbacklisth.h"
 #include "llcircuit.h"
 #include "lldatapacker.h"
 #include "lldbstrings.h"
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 42654e250ba87bdb7c80602be65614868b79829f..88271aa7f68c77924a524d0628c52e5a53b1e209 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -98,7 +98,6 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
 	mBillableFactor(1.0),
 	mMaxTasks(MAX_TASKS_PER_REGION),
 	mCacheLoaded(FALSE),
-	mCacheMap(),
 	mCacheEntriesCount(0),
 	mCacheID(),
 	mEventPoll(NULL)
@@ -343,7 +342,7 @@ void LLViewerRegion::saveCache()
 		entry->writeToFile(fp);
 	}
 
-	mCacheMap.removeAllData();
+	mCacheMap.clear();
 	mCacheEnd.unlink();
 	mCacheEnd.init();
 	mCacheStart.deleteAll();
@@ -1013,7 +1012,7 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary
 	U32 local_id = objectp->getLocalID();
 	U32 crc = objectp->getCRC();
 
-	LLVOCacheEntry *entry = mCacheMap.getIfThere(local_id);
+	LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
 
 	if (entry)
 	{
@@ -1026,7 +1025,7 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary
 		else
 		{
 			// Update the cache entry
-			mCacheMap.removeData(local_id);
+			mCacheMap.erase(local_id);
 			delete entry;
 			entry = new LLVOCacheEntry(local_id, crc, dp);
 			mCacheEnd.insert(*entry);
@@ -1041,7 +1040,7 @@ void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinary
 		if (mCacheEntriesCount > MAX_OBJECT_CACHE_ENTRIES)
 		{
 			entry = mCacheStart.getNext();
-			mCacheMap.removeData(entry->getLocalID());
+			mCacheMap.erase(entry->getLocalID());
 			delete entry;
 			mCacheEntriesCount--;
 		}
@@ -1060,7 +1059,7 @@ LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc)
 {
 	llassert(mCacheLoaded);
 
-	LLVOCacheEntry *entry = mCacheMap.getIfThere(local_id);
+	LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
 
 	if (entry)
 	{
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 3d5334cd188e7daa5f1c63c3d0070ad58fa494b1..6625e3bdf67d35982f76c47c682a4ec1370b3d85 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -44,7 +44,6 @@
 #include "llhost.h"
 #include "llstring.h"
 #include "llregionflags.h"
-#include "llptrskipmap.h"
 #include "lluuid.h"
 #include "lldatapacker.h"
 #include "llvocache.h"
@@ -352,7 +351,8 @@ protected:
 	// Regions can have order 10,000 objects, so assume
 	// a structure of size 2^14 = 16,000
 	BOOL									mCacheLoaded;
-	LLPtrSkipMap<U32, LLVOCacheEntry *, 14>	mCacheMap;
+	typedef std::map<U32, LLVOCacheEntry *>	cache_map_t;
+	cache_map_t			  				 	mCacheMap;
 	LLVOCacheEntry							mCacheStart;
 	LLVOCacheEntry							mCacheEnd;
 	U32										mCacheEntriesCount;
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index d1e67bfbbdb476005b1940d273d144eabacc956f..dcceb397d3b3ece6a6167179007b68261a3586ad 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -57,7 +57,6 @@
 // linden library includes
 #include "audioengine.h"		// mute on minimize
 #include "indra_constants.h"
-#include "linked_lists.h"
 #include "llassetstorage.h"
 #include "llfontgl.h"
 #include "llrect.h"
@@ -1812,18 +1811,23 @@ void adjust_rect_bottom_center(const LLString& control, const LLRect& window)
 	}
 }
 
-
-void update_saved_window_size(const LLString& control,S32 delta_width, S32 delta_height)
+void adjust_rect_centered_partial_zoom(const LLString& control,
+									   const LLRect& window)
 {
-	if (delta_width || delta_height )
-	{
-		LLRect mXMLRect = gSavedSettings.getRect(control);
-		//hard code it all follows the right and top
-		mXMLRect.mRight += delta_width;
-		mXMLRect.mTop += delta_height;
-		mXMLRect.mLeft = llmax (0, mXMLRect.mLeft+delta_width);
-		mXMLRect.mBottom = llmax(0,mXMLRect.mBottom+delta_height);
-		gSavedSettings.setRect(control,mXMLRect);
+	LLRect rect = gSavedSettings.getRect(control);
+	// Only adjust on first use
+	if (rect.mLeft == 0 && rect.mBottom == 0)
+	{
+		S32 width = window.getWidth();
+		S32 height = window.getHeight();
+		rect.set(0, height-STATUS_BAR_HEIGHT, width, TOOL_BAR_HEIGHT);
+		// Make floater fill 80% of window, leaving 20% padding on
+		// the sides.
+		const F32 ZOOM_FRACTION = 0.8f;
+		S32 dx = (S32)(width * (1.f - ZOOM_FRACTION));
+		S32 dy = (S32)(height * (1.f - ZOOM_FRACTION));
+		rect.stretch(-dx/2, -dy/2);
+		gSavedSettings.setRect(control, rect);
 	}
 }
 
@@ -1848,7 +1852,7 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)
 
 	adjust_rect_top_left("FloaterGestureRect2", window);
 
-	adjust_rect_top_right("FloaterMapRect", window);
+	adjust_rect_top_right("FloaterMiniMapRect", window);
 	
 	adjust_rect_top_right("FloaterLagMeter", window);
 
@@ -1917,17 +1921,8 @@ void LLViewerWindow::initWorldUI()
 
 		LLWorldMapView::initClass();
 
-		LLRect world_map_rect = gSavedSettings.getRect("FloaterWorldMapRect");
-		// if 0,0,0,0 then use fullscreen
-		if (world_map_rect.mTop == 0 
-			&& world_map_rect.mLeft == 0
-			&& world_map_rect.mRight == 0
-			&& world_map_rect.mBottom == 0)
-		{
-			world_map_rect.set(0, height-TOOL_BAR_HEIGHT, width, STATUS_BAR_HEIGHT);
-			world_map_rect.stretch(-4);
-			gSavedSettings.setRect("FloaterWorldMapRect", world_map_rect);
-		}
+		adjust_rect_centered_partial_zoom("FloaterWorldMapRect2", full_window);
+
 		gFloaterWorldMap = new LLFloaterWorldMap();
 		gFloaterWorldMap->setVisible(FALSE);
 
@@ -2121,9 +2116,6 @@ void LLViewerWindow::reshape(S32 width, S32 height)
 			}
 		}
 
-		// changes in window's width and hight
-		S32 delta_width  = width - mWindowRect.getWidth();
-		S32 delta_height = height - mWindowRect.getHeight();
 		// update our window rectangle
 		mWindowRect.mRight = mWindowRect.mLeft + width;
 		mWindowRect.mTop = mWindowRect.mBottom + height;
@@ -2174,12 +2166,6 @@ void LLViewerWindow::reshape(S32 width, S32 height)
 			{
 				gSavedSettings.setS32("WindowWidth", window_size.mX);
 				gSavedSettings.setS32("WindowHeight", window_size.mY);
-				if (!gFloaterMap)
-				{					
-					update_saved_window_size("FloaterWorldMapRect",delta_width, delta_height);	
-					update_saved_window_size("FloaterMapRect",delta_width, delta_height);		
-				}
-				
 			}
 		}
 
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index f62c25df91ffb6b025a623cadb9cb5296617dabb..09ad3fc270f7247dc22eb918e45ba2d6f1ab209e 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -41,7 +41,6 @@
 #ifndef LL_LLVIEWERWINDOW_H
 #define LL_LLVIEWERWINDOW_H
 
-#include "linked_lists.h"
 #include "v3dmath.h"
 #include "v2math.h"
 #include "llwindow.h"
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 5521b7f5f7113c1ba020c367d2854bd63b597b7c..58f94120d098fed349c2111c80af8085b43c5b9f 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -746,13 +746,16 @@ void LLVOVolume::sculpt()
 			return;
 		
 		LLPointer<LLImageRaw> raw_image = new LLImageRaw();
-		mSculptTexture->readBackRaw(discard_level, raw_image, TRUE);
+		mSculptTexture->readBackRaw(discard_level, raw_image, FALSE);
 
 		sculpt_height = raw_image->getHeight();
 		sculpt_width = raw_image->getWidth();
 
 		sculpt_components = raw_image->getComponents();
 		sculpt_data = raw_image->getData();
+
+		llassert_always(raw_image->getDataSize() >= sculpt_height * sculpt_width * sculpt_components);
+
 		getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level);
 	}
 }
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index b4e79109ace47b7a58d688c439d3248b0f6c8ea5..b63543a32756089e6ec43e03e1ac39ea1256a52c 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -132,8 +132,6 @@ LLWearable::LLWearable(const LLAssetID& asset_id) :
 
 LLWearable::~LLWearable()
 {
-	mVisualParamMap.deleteAllData();
-	mTEMap.deleteAllData();
 }
 
 
@@ -227,35 +225,37 @@ BOOL LLWearable::exportFile( FILE* file )
 	}
 
 	// parameters
-	S32 num_parameters = mVisualParamMap.getLength();
+	S32 num_parameters = mVisualParamMap.size();
 	if( fprintf( file, "parameters %d\n", num_parameters ) < 0 )
 	{
 		return FALSE;
 	}
 
 	char s[ MAX_STRING ];		/* Flawfinder: ignore */
-	for( F32* param_weightp = mVisualParamMap.getFirstData(); param_weightp; param_weightp = mVisualParamMap.getNextData() )
+	for (param_map_t::iterator iter = mVisualParamMap.begin();
+		 iter != mVisualParamMap.end(); ++iter)
 	{
-		S32 param_id = mVisualParamMap.getCurrentKeyWithoutIncrement();
-		if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( *param_weightp, s ) ) < 0 )
+		S32 param_id = iter->first;
+		F32 param_weight = iter->second;
+		if( fprintf( file, "%d %s\n", param_id, terse_F32_to_string( param_weight, s ) ) < 0 )
 		{
 			return FALSE;
 		}
 	}
 
 	// texture entries
-	S32 num_textures = mTEMap.getLength();
+	S32 num_textures = mTEMap.size();
 	if( fprintf( file, "textures %d\n", num_textures ) < 0 )
 	{
 		return FALSE;
 	}
 	
-	for( LLUUID* image_id = mTEMap.getFirstData(); image_id; image_id = mTEMap.getNextData() )
+	for (te_map_t::iterator iter = mTEMap.begin();
+		 iter != mTEMap.end(); ++iter)
 	{
-		S32 te = mTEMap.getCurrentKeyWithoutIncrement();
-		char image_id_string[UUID_STR_LENGTH];		/* Flawfinder: ignore */
-		image_id->toString( image_id_string );
-		if( fprintf( file, "%d %s\n", te, image_id_string) < 0 )
+		S32 te = iter->first;
+		LLUUID& image_id = iter->second;
+		if( fprintf( file, "%d %s\n", te, image_id.asString().c_str()) < 0 )
 		{
 			return FALSE;
 		}
@@ -418,7 +418,7 @@ BOOL LLWearable::importFile( FILE* file )
 			llwarns << "Bad Wearable asset: bad parameter, #" << i << llendl;
 			return FALSE;
 		}
-		mVisualParamMap.addData( param_id, new F32(param_weight) );
+		mVisualParamMap[param_id] = param_weight;
 	}
 
 	// textures header
@@ -450,7 +450,7 @@ BOOL LLWearable::importFile( FILE* file )
 			return FALSE;
 		}
 
-		mTEMap.addData( te, new LLUUID( text_buffer ) );
+		mTEMap[te] = LLUUID(text_buffer );
 	}
 
 	return TRUE;
@@ -488,13 +488,13 @@ BOOL LLWearable::isOldVersion()
 		if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
 			param_count++;
-			if( !mVisualParamMap.checkKey( param->getID() ) )
+			if( !is_in_map(mVisualParamMap, param->getID() ) )
 			{
 				return TRUE;
 			}
 		}
 	}
-	if( param_count != mVisualParamMap.getLength() )
+	if( param_count != mVisualParamMap.size() )
 	{
 		return TRUE;
 	}
@@ -506,13 +506,13 @@ BOOL LLWearable::isOldVersion()
 		if( LLVOAvatar::getTEWearableType( te ) == mType )
 		{
 			te_count++;
-			if( !mTEMap.checkKey( te ) )
+			if( !is_in_map(mTEMap, te ) )
 			{
 				return TRUE;
 			}
 		}
 	}
-	if( te_count != mTEMap.getLength() )
+	if( te_count != mTEMap.size() )
 	{
 		return TRUE;
 	}
@@ -543,16 +543,8 @@ BOOL LLWearable::isDirty()
 	{
 		if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
-			F32* weightp = mVisualParamMap.getIfThere( param->getID() );
-			F32 weight;
-			if( weightp )
-			{
-				weight = llclamp( *weightp, param->getMinWeight(), param->getMaxWeight() );
-			}
-			else
-			{
-				weight = param->getDefaultWeight();
-			}
+			F32 weight = get_if_there(mVisualParamMap, param->getID(), param->getDefaultWeight());
+			weight = llclamp( weight, param->getMinWeight(), param->getMaxWeight() );
 			
 			U8 a = F32_to_U8( param->getWeight(), param->getMinWeight(), param->getMaxWeight() );
 			U8 b = F32_to_U8( weight,             param->getMinWeight(), param->getMaxWeight() );
@@ -573,8 +565,7 @@ BOOL LLWearable::isDirty()
 				llassert( 0 );
 				continue;
 			}
-			LLUUID* mapped_image_id = mTEMap.getIfThere( te );
-			const LLUUID& image_id = mapped_image_id ? *mapped_image_id : LLVOAvatar::getDefaultTEImageID( te );
+			const LLUUID& image_id = get_if_there(mTEMap,  te, LLVOAvatar::getDefaultTEImageID( te ) );
 			if( avatar_image->getID() != image_id )
 			{
 				return TRUE;
@@ -603,24 +594,24 @@ void LLWearable::setParamsToDefaults()
 		return;
 	}
 
-	mVisualParamMap.deleteAllData();
+	mVisualParamMap.clear();
 	for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
 	{
 		if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
-			mVisualParamMap.addData( param->getID(), new F32( param->getDefaultWeight() ) );
+			mVisualParamMap[param->getID()] = param->getDefaultWeight();
 		}
 	}
 }
 
 void LLWearable::setTexturesToDefaults()
 {
-	mTEMap.deleteAllData();
+	mTEMap.clear();
 	for( S32 te = 0; te < LLVOAvatar::TEX_NUM_ENTRIES; te++ )
 	{
 		if( LLVOAvatar::getTEWearableType( te ) == mType )
 		{
-			mTEMap.addData( te, new LLUUID( LLVOAvatar::getDefaultTEImageID( te ) ) );
+			mTEMap[te] = LLVOAvatar::getDefaultTEImageID( te );
 		}
 	}
 }
@@ -643,30 +634,15 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
 		if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
 			S32 param_id = param->getID();
-			F32* weight = mVisualParamMap.getIfThere( param_id );
-			if( weight )
+			F32 weight = get_if_there(mVisualParamMap, param_id, param->getDefaultWeight());
+			// only animate with user-originated changes
+			if (set_by_user)
 			{
-				// only animate with user-originated changes
-				if (set_by_user)
-				{
-					param->setAnimationTarget(*weight, set_by_user);
-				}
-				else
-				{
-					avatar->setVisualParamWeight( param_id, *weight, set_by_user );
-				}
+				param->setAnimationTarget(weight, set_by_user);
 			}
 			else
 			{
-				// only animate with user-originated changes
-				if (set_by_user)
-				{
-					param->setAnimationTarget(param->getDefaultWeight(), set_by_user);
-				}
-				else
-				{
-					avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), set_by_user );
-				}
+				avatar->setVisualParamWeight( param_id, weight, set_by_user );
 			}
 		}
 	}
@@ -682,8 +658,7 @@ void LLWearable::writeToAvatar( BOOL set_by_user )
 	{
 		if( LLVOAvatar::getTEWearableType( te ) == mType )
 		{
-			LLUUID* mapped_image_id = mTEMap.getIfThere( te );
-			const LLUUID& image_id = mapped_image_id ? *mapped_image_id : LLVOAvatar::getDefaultTEImageID( te );
+			const LLUUID& image_id = get_if_there(mTEMap, te, LLVOAvatar::getDefaultTEImageID( te ) );
 			LLViewerImage* image = gImageList.getImage( image_id );
 			avatar->setLocTexTE( te, image, set_by_user );
 		}
@@ -792,16 +767,16 @@ void LLWearable::readFromAvatar()
 
 	mDefinitionVersion = LLWearable::sCurrentDefinitionVersion;
 
-	mVisualParamMap.deleteAllData();
+	mVisualParamMap.clear();
 	for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
 	{
 		if( (((LLViewerVisualParam*)param)->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
-			mVisualParamMap.addData( param->getID(), new F32( param->getWeight() ) );
+			mVisualParamMap[param->getID()] = param->getWeight();
 		}
 	}
 
-	mTEMap.deleteAllData();
+	mTEMap.clear();
 	for( S32 te = 0; te < LLVOAvatar::TEX_NUM_ENTRIES; te++ )
 	{
 		if( LLVOAvatar::getTEWearableType( te ) == mType )
@@ -809,7 +784,7 @@ void LLWearable::readFromAvatar()
 			LLViewerImage* image = avatar->getTEImage( te );
 			if( image )
 			{
-				mTEMap.addData( te, new LLUUID( image->getID() ) );
+				mTEMap[te] = image->getID();
 			}
 		}
 	}
@@ -847,9 +822,8 @@ void LLWearable::copyDataFrom( LLWearable* src )
 		if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
 		{
 			S32 id = param->getID();
-			F32* weightp = src->mVisualParamMap.getIfThere( id );
-			F32 weight = weightp ? *weightp : param->getDefaultWeight();
-			mVisualParamMap.addData( id, new F32( weight ) );
+			F32 weight = get_if_there(src->mVisualParamMap, id, param->getDefaultWeight() );
+			mVisualParamMap[id] = weight;
 		}
 	}
 
@@ -858,9 +832,8 @@ void LLWearable::copyDataFrom( LLWearable* src )
 	{
 		if( LLVOAvatar::getTEWearableType( te ) == mType )
 		{
-			LLUUID* mapped_image_id = src->mTEMap.getIfThere( te );
-			const LLUUID& image_id = mapped_image_id ? *mapped_image_id : LLVOAvatar::getDefaultTEImageID( te );
-			mTEMap.addData( te, new LLUUID( image_id ) );
+			const LLUUID& image_id = get_if_there(src->mTEMap, te, LLVOAvatar::getDefaultTEImageID( te ) );
+			mTEMap[te] = image_id;
 		}
 	}
 }
@@ -985,21 +958,21 @@ void LLWearable::dump()
 	//mSaleInfo
 
 	llinfos << "    Params:" << llendl;
-	for( F32* param_weightp = mVisualParamMap.getFirstData(); 
-		param_weightp;
-		param_weightp = mVisualParamMap.getNextData() )
+	for (param_map_t::iterator iter = mVisualParamMap.begin();
+		 iter != mVisualParamMap.end(); ++iter)
 	{
-		S32 param_id = mVisualParamMap.getCurrentKeyWithoutIncrement();
-		llinfos << "        " << param_id << " " << *param_weightp << llendl;
+		S32 param_id = iter->first;
+		F32 param_weight = iter->second;
+		llinfos << "        " << param_id << " " << param_weight << llendl;
 	}
 
 	llinfos << "    Textures:" << llendl;
-	for( LLUUID* image_id = mTEMap.getFirstData();
-		image_id;
-		image_id = mTEMap.getNextData() )
+	for (te_map_t::iterator iter = mTEMap.begin();
+		 iter != mTEMap.end(); ++iter)
 	{
-		S32 te = mTEMap.getCurrentKeyWithoutIncrement();
-		llinfos << "        " << te << " " << *image_id << llendl;
+		S32 te = iter->first;
+		LLUUID& image_id = iter->second;
+		llinfos << "        " << te << " " << image_id << llendl;
 	}
 }
 
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index cd02843ccf5782ff2de65299053c29a795a3ae43..1b0fb3d7aac7dbc78a506aa6e1d396de1ec94cf3 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -33,7 +33,6 @@
 #define LL_LLWEARABLE_H
 
 #include "lluuid.h"
-#include "llptrskipmap.h"
 #include "llstring.h"
 #include "llpermissions.h"
 #include "llsaleinfo.h"
@@ -132,8 +131,10 @@ private:
 	LLTransactionID		mTransactionID;
 	EWearableType		mType;
 
-	LLPtrSkipMap<S32, F32*>	mVisualParamMap;	// maps visual param id to weight
-	LLPtrSkipMap<S32, LLUUID*>	mTEMap;				// maps TE to Image ID
+	typedef std::map<S32, F32> param_map_t;
+	param_map_t mVisualParamMap;	// maps visual param id to weight
+	typedef std::map<S32, LLUUID> te_map_t;
+	te_map_t mTEMap;				// maps TE to Image ID
 
 	static const char* sTypeName[ WT_COUNT ];
 	static const char* sTypeLabel[ WT_COUNT ];
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 39a6046f5946682d8a43093f9cd2b83b9a0c2f2e..c94ee7c54eff1148e2e0da560ec60f93caa0baf0 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -73,13 +73,14 @@ struct LLWearableArrivedData
 
 LLWearableList::~LLWearableList()
 {
-	mList.deleteAllData();
+	for_each(mList.begin(), mList.end(), DeletePairedPointer());
+	mList.clear();
 }
 
 void LLWearableList::getAsset( const LLAssetID& assetID, const LLString& wearable_name, LLAssetType::EType asset_type, void(*asset_arrived_callback)(LLWearable*, void* userdata), void* userdata )
 {
 	llassert( (asset_type == LLAssetType::AT_CLOTHING) || (asset_type == LLAssetType::AT_BODYPART) );
-	LLWearable* instance = mList.getIfThere( assetID );
+	LLWearable* instance = get_if_there(mList, assetID, (LLWearable*)NULL );
 	if( instance )
 	{
 		asset_arrived_callback( instance, userdata );
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index 303fcb7bd39a46ec6cab2891d02e36027488d11a..c3a7e1bd913cdee0588e009ba36c95919b30a573 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -33,7 +33,6 @@
 #define LL_LLWEARABLELIST_H
 
 #include "llwearable.h"
-#include "llskiplist.h"
 #include "lluuid.h"
 #include "llassetstorage.h"
 
@@ -43,9 +42,7 @@ public:
 	LLWearableList()	{}
 	~LLWearableList();
 
-	S32					getLength() { return mList.getLength(); }
-	const LLWearable*	getFirst()	{ return mList.getFirstData(); }
-	const LLWearable*	getNext()	{ return mList.getNextData(); }
+	S32					getLength() { return mList.size(); }
 
 	void				getAsset( 
 							const LLAssetID& assetID,
@@ -65,7 +62,7 @@ public:
 	static void	 	    processGetAssetReply(const char* filename, const LLAssetID& assetID, void* user_data, S32 status, LLExtStat ext_status);
 
 protected:
-	LLPtrSkipMap< const LLUUID, LLWearable* > mList;
+	std::map< LLUUID, LLWearable* > mList;
 };
 
 extern LLWearableList gWearableList;
diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp
index 949ea71c56f9a955abaf16b58303e9ffc2ec3cd0..42f8a12e4ce1eaabd10f12d779a155a486451dff 100644
--- a/indra/newview/llwindebug.cpp
+++ b/indra/newview/llwindebug.cpp
@@ -121,6 +121,172 @@ MODULE32_NEST	Module32Next_;
 #define	CALL_TRACE_MAX	((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40))	//max number of traced calls
 #define	NL				L"\r\n"	//new line
 
+BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr);
+
+
+void printError( CHAR* msg )
+{
+  DWORD eNum;
+  TCHAR sysMsg[256];
+  TCHAR* p;
+
+  eNum = GetLastError( );
+  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+         NULL, eNum,
+         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
+         sysMsg, 256, NULL );
+
+  // Trim the end of the line and terminate it with a null
+  p = sysMsg;
+  while( ( *p > 31 ) || ( *p == 9 ) )
+    ++p;
+  do { *p-- = 0; } while( ( p >= sysMsg ) &&
+                          ( ( *p == '.' ) || ( *p < 33 ) ) );
+
+  // Display the message
+  printf( "\n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg );
+}
+
+BOOL GetProcessThreadIDs(DWORD process_id, std::vector<DWORD>& thread_ids) 
+{ 
+  HANDLE hThreadSnap = INVALID_HANDLE_VALUE; 
+  THREADENTRY32 te32; 
+ 
+  // Take a snapshot of all running threads  
+  hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 ); 
+  if( hThreadSnap == INVALID_HANDLE_VALUE ) 
+    return( FALSE ); 
+ 
+  // Fill in the size of the structure before using it. 
+  te32.dwSize = sizeof(THREADENTRY32 ); 
+ 
+  // Retrieve information about the first thread,
+  // and exit if unsuccessful
+  if( !Thread32First( hThreadSnap, &te32 ) ) 
+  {
+    printError( "Thread32First" );  // Show cause of failure
+    CloseHandle( hThreadSnap );     // Must clean up the snapshot object!
+    return( FALSE );
+  }
+
+  // Now walk the thread list of the system,
+  // and display information about each thread
+  // associated with the specified process
+  do 
+  { 
+    if( te32.th32OwnerProcessID == process_id )
+    {
+      thread_ids.push_back(te32.th32ThreadID); 
+    }
+  } while( Thread32Next(hThreadSnap, &te32 ) ); 
+
+//  Don't forget to clean up the snapshot object.
+  CloseHandle( hThreadSnap );
+  return( TRUE );
+}
+
+void WINAPI GetCallStackData(const CONTEXT* context_struct, LLSD& info)
+{	
+    // Fill Str with call stack info.
+    // pException can be either GetExceptionInformation() or NULL.
+    // If pException = NULL - get current call stack.
+
+    LPWSTR	Module_Name = new WCHAR[MAX_PATH];
+	PBYTE	Module_Addr = 0;
+	
+	typedef struct STACK
+	{
+		STACK *	Ebp;
+		PBYTE	Ret_Addr;
+		DWORD	Param[0];
+	} STACK, * PSTACK;
+
+	PSTACK	Ebp;
+
+    if(context_struct)
+    {
+        Ebp = (PSTACK)context_struct->Ebp;
+    }
+    else
+    {
+        // The context struct is NULL, 
+        // so we will use the current stack.
+        Ebp = (PSTACK)&context_struct - 1;
+
+        // Skip frame of GetCallStackData().
+		if (!IsBadReadPtr(Ebp, sizeof(PSTACK)))
+			Ebp = Ebp->Ebp;		//caller ebp
+    }
+
+	// Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX.
+	// Break trace on wrong stack frame.
+	for (int Ret_Addr_I = 0, i = 0;
+		(Ret_Addr_I < CALL_TRACE_MAX) && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr));
+		Ret_Addr_I++, Ebp = Ebp->Ebp, ++i)
+	{
+		// If module with Ebp->Ret_Addr found.
+
+		if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr))
+		{
+			// Save module's address and full path.
+			info["CallStack"][i]["ModuleName"] = ll_convert_wide_to_string(Module_Name);
+			info["CallStack"][i]["ModuleAddress"] = (int)Module_Addr;
+			info["CallStack"][i]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr);
+
+			LLSD params;
+			// Save 5 params of the call. We don't know the real number of params.
+			if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD)))
+			{
+				for(int j = 0; j < 5; ++j)
+				{
+					params[j] = (int)Ebp->Param[j];
+				}
+			}
+			info["CallStack"][i]["Parameters"] = params;
+		}
+		info["CallStack"][i]["ReturnAddress"] = (int)Ebp->Ret_Addr;			
+	}
+}
+
+BOOL GetThreadCallStack(DWORD thread_id, LLSD& info)
+{
+    if(GetCurrentThreadId() == thread_id)
+    {
+        // Early exit for the current thread.
+        // Suspending the current thread would be a bad idea.
+        // Plus you can't retrieve a valid current thread context.
+        return false;
+    }
+
+    HANDLE thread_handle = INVALID_HANDLE_VALUE; 
+    thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, thread_id);
+    if(INVALID_HANDLE_VALUE == thread_handle)
+    {
+        return FALSE;
+    }
+
+    BOOL result = false;
+    if(-1 != SuspendThread(thread_handle))
+    {
+        CONTEXT context_struct;
+        context_struct.ContextFlags = CONTEXT_FULL;
+        if(GetThreadContext(thread_handle, &context_struct))
+        {
+            GetCallStackData(&context_struct, info);
+            result = true;
+        }
+        ResumeThread(thread_handle);
+    }
+    else
+    {
+        // Couldn't suspend thread.
+    }
+
+    CloseHandle(thread_handle);
+    return result;
+}
+
+
 //Windows Call Stack Construction idea from 
 //http://www.codeproject.com/tools/minidump.asp
 
@@ -490,7 +656,33 @@ LONG LLWinDebug::handleException(struct _EXCEPTION_POINTERS *exception_infop)
 
 		LLSD info;
 		info = Get_Exception_Info(exception_infop);
-		if (info)
+
+
+        LLSD threads;
+        std::vector<DWORD> thread_ids;
+        GetProcessThreadIDs(GetCurrentProcessId(), thread_ids);
+
+        for(std::vector<DWORD>::iterator th_itr = thread_ids.begin(); 
+                 th_itr != thread_ids.end();
+                 ++th_itr)
+        {
+            LLSD thread_info;
+            if(*th_itr != GetCurrentThreadId())
+            {
+                GetThreadCallStack(*th_itr, thread_info);
+            }
+
+            if(thread_info)
+            {
+                
+                threads[llformat("ID %d", *th_itr)] = thread_info;
+            }
+        }
+
+
+        info["Threads"] = threads;
+
+        if (info)
 		{
 			std::ofstream out_file(log_path.c_str());
 			LLSDSerialize::toPrettyXML(info, out_file);
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 6bbe5307b0e7080bc9841da981681b9050e6da39..1664515f585b34a26f4dc5b9eb3e1e9e2c1b6ce3 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -35,7 +35,6 @@
 
 #include "indra_constants.h"
 #include "llui.h"
-#include "linked_lists.h"
 #include "llmath.h"		// clampf()
 #include "llregionhandle.h"
 #include "lleventflags.h"
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 4f533e11899e0b58ce240bd3a13abd2ebca6ad37..136612e1a889b80b789111fab940da7fd5c19f2b 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -5073,11 +5073,6 @@ LLCubeMap* LLPipeline::findReflectionMap(const LLVector3& location)
 	return NULL;
 }
 
-S32 LLPipeline::getVisibleCount() const 
-{ 
-	return sCull->getVisibleListSize();
-}
-
 void LLPipeline::renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture)
 {
 #if !LL_RELEASE_FOR_DOWNLOAD
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 32f5a7487ba68e8c9dbc3cd68c1972f34be30772..2054492b7216e8f549bf3f8cb260549b807c038e 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -36,8 +36,6 @@
 #include "lldarrayptr.h"
 #include "lldqueueptr.h"
 #include "llstat.h"
-#include "lllinkedqueue.h"
-#include "llskiplist.h"
 #include "lldrawpool.h"
 #include "llspatialpartition.h"
 #include "m4math.h"
@@ -193,7 +191,6 @@ public:
 	void findReferences(LLDrawable *drawablep);	// Find the lists which have references to this object
 	BOOL verify();						// Verify that all data in the pipeline is "correct"
 
-	S32  getVisibleCount() const;
 	S32  getLightCount() const { return mLights.size(); }
 
 	void calcNearbyLights(LLCamera& camera);