diff --git a/.hgtags b/.hgtags
index 0d06bfe598984241858c8c073e3600d4ab73b23e..cee1281f2b4f75aafa0eb7f49269fe484a1f5a26 100755
--- a/.hgtags
+++ b/.hgtags
@@ -517,3 +517,4 @@ e9d350764dfbf5a46229e627547ef5c1b1eeef00 4.0.2-release
 0a5de9ec2cb868f367501024d8d6958c20869053 4.0.4-release
 450de775fff66a011be1a001acd117cc623c445d 4.0.5-release
 4070611edd95eb3a683d1cd97c4c07fe67793812 4.0.6-release
+33981d8130f031597b4c7f4c981b18359afb61a0 4.0.7-release
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 9b31e5032ad73da1c285e7606c344ff3aece315e..8ed41ddc3491f5ae626f94ae19a4d8361c9f55c2 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -190,6 +190,9 @@ Ansariel Hiller
 	STORM-2094
 	MAINT-5756
 	MAINT-4677
+	MAINT-6432
+	STORM-2133
+	MAINT-6511
 Aralara Rajal
 Arare Chantilly
 	CHUIBUG-191
diff --git a/indra/llcommon/indra_constants.cpp b/indra/llcommon/indra_constants.cpp
index 60721977cdc6f2196732dff012441f394c4fc1cc..7ea42a3fc0296e3ea620974f4a8b4b167ca06d08 100644
--- a/indra/llcommon/indra_constants.cpp
+++ b/indra/llcommon/indra_constants.cpp
@@ -60,6 +60,10 @@ const LLUUID IMG_SMOKE_POOF				("1e63e323-5fe0-452e-92f8-b98bd0f764e3"); // On d
 const LLUUID IMG_BIG_EXPLOSION_1		("5e47a0dc-97bf-44e0-8b40-de06718cee9d"); // On dataserver
 const LLUUID IMG_BIG_EXPLOSION_2		("9c8eca51-53d5-42a7-bb58-cef070395db8"); // On dataserver
 
+const LLUUID IMG_ALPHA_GRAD				("e97cf410-8e61-7005-ec06-629eba4cd1fb"); // VIEWER
+const LLUUID IMG_ALPHA_GRAD_2D			("38b86f85-2575-52a9-a531-23108d8da837"); // VIEWER
+const LLUUID IMG_TRANSPARENT			("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"); // VIEWER
+
 const LLUUID IMG_BLOOM1	  			    ("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); // VIEWER
 const LLUUID TERRAIN_DIRT_DETAIL		("0bc58228-74a0-7e83-89bc-5c23464bcec5"); // VIEWER
 const LLUUID TERRAIN_GRASS_DETAIL		("63338ede-0037-c4fd-855b-015d77112fc8"); // VIEWER
diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h
index 02f063f5e843cf2105440983e85e05d6f7e2ec98..fda84aa5a8c4cf4b4de411b66d3270dc0d8f10e2 100644
--- a/indra/llcommon/indra_constants.h
+++ b/indra/llcommon/indra_constants.h
@@ -197,6 +197,10 @@ LL_COMMON_API extern const LLUUID IMG_SMOKE_POOF;
 LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_1;
 LL_COMMON_API extern const LLUUID IMG_BIG_EXPLOSION_2;
 
+LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD;
+LL_COMMON_API extern const LLUUID IMG_ALPHA_GRAD_2D;
+LL_COMMON_API extern const LLUUID IMG_TRANSPARENT;
+
 LL_COMMON_API extern const LLUUID IMG_BLOOM1;
 LL_COMMON_API extern const LLUUID TERRAIN_DIRT_DETAIL;
 LL_COMMON_API extern const LLUUID TERRAIN_GRASS_DETAIL;
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index f3b8999883ab2d1892ee769fe66ca2b6409a4419..c45db3b1859d0a67d36ec9270d8ce69c7ed5ade7 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -576,6 +576,33 @@ std::string utf8str_truncate(const std::string& utf8str, const S32 max_len)
 	}
 }
 
+std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len)
+{
+    if (0 == symbol_len)
+    {
+        return std::string();
+    }
+    if ((S32)utf8str.length() <= symbol_len)
+    {
+        return utf8str;
+    }
+    else
+    {
+        int len = 0, byteIndex = 0;
+        const char* aStr = utf8str.c_str();
+        size_t origSize = utf8str.size();
+
+        for (byteIndex = 0; len < symbol_len && byteIndex < origSize; byteIndex++)
+        {
+            if ((aStr[byteIndex] & 0xc0) != 0x80)
+            {
+                len += 1;
+            }
+        }
+        return utf8str.substr(0, byteIndex);
+    }
+}
+
 std::string utf8str_substChar(
 	const std::string& utf8str,
 	const llwchar target_char,
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 393f6d7a8c1534ef0c796079c04f7136d8fb1bcd..a40db0f8cc786473daff03886aa1a19a78f8be27 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -563,6 +563,17 @@ LL_COMMON_API S32 utf8str_compare_insensitive(
 	const std::string& lhs,
 	const std::string& rhs);
 
+/**
+* @brief Properly truncate a utf8 string to a maximum character count.
+*
+* If symbol_len is longer than the string passed in, the return
+* value == utf8str.
+* @param utf8str A valid utf8 string to truncate.
+* @param symbol_len The maximum number of symbols in the return value.
+* @return Returns a valid utf8 string with symbol count <= max_len.
+*/
+LL_COMMON_API std::string utf8str_symbol_truncate(const std::string& utf8str, const S32 symbol_len);
+
 /**
  * @brief Replace all occurences of target_char with replace_char
  *
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 08462c7834ae31b7d3ae031482238a18995a8ca2..91fa8c6ad15b8c23ea4e0d4343352cb8861c0338 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -773,7 +773,8 @@ const U8* LLImageBase::getData() const
 { 
 	if(mBadBufferAllocation)
 	{
-		LL_ERRS() << "Bad memory allocation for the image buffer!" << LL_ENDL ;
+		LL_WARNS() << "Bad memory allocation for the image buffer!" << LL_ENDL ;
+		return NULL;
 	}
 
 	return mData; 
@@ -783,7 +784,8 @@ U8* LLImageBase::getData()
 { 
 	if(mBadBufferAllocation)
 	{
-		LL_ERRS() << "Bad memory allocation for the image buffer!" << LL_ENDL ;
+		LL_WARNS() << "Bad memory allocation for the image buffer!" << LL_ENDL;
+		return NULL;
 	}
 
 	return mData; 
@@ -895,30 +897,30 @@ void LLImageRaw::setDataAndSize(U8 *data, S32 width, S32 height, S8 components)
 	sGlobalRawMemory += getDataSize();
 }
 
-BOOL LLImageRaw::resize(U16 width, U16 height, S8 components)
+bool LLImageRaw::resize(U16 width, U16 height, S8 components)
 {
 	if ((getWidth() == width) && (getHeight() == height) && (getComponents() == components))
 	{
-		return TRUE;
+		return true;
 	}
 	// Reallocate the data buffer.
 	deleteData();
 
 	allocateDataSize(width,height,components);
 
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
-							 const U8 *data, U32 stride, BOOL reverse_y)
+bool LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
+							 const U8 *data, U32 stride, bool reverse_y)
 {
 	if (!getData())
 	{
-		return FALSE;
+		return false;
 	}
 	if (!data)
 	{
-		return FALSE;
+		return false;
 	}
 
 	// Should do some simple bounds checking
@@ -933,7 +935,7 @@ BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
 				data + from_offset, getComponents()*width);
 	}
 
-	return TRUE;
+	return true;
 }
 
 void LLImageRaw::clear(U8 r, U8 g, U8 b, U8 a)
@@ -988,7 +990,7 @@ void LLImageRaw::verticalFlip()
 }
 
 
-void LLImageRaw::expandToPowerOfTwo(S32 max_dim, BOOL scale_image)
+void LLImageRaw::expandToPowerOfTwo(S32 max_dim, bool scale_image)
 {
 	// Find new sizes
 	S32 new_width  = expandDimToPowerOfTwo(getWidth(), max_dim);
@@ -997,7 +999,7 @@ void LLImageRaw::expandToPowerOfTwo(S32 max_dim, BOOL scale_image)
 	scale( new_width, new_height, scale_image );
 }
 
-void LLImageRaw::contractToPowerOfTwo(S32 max_dim, BOOL scale_image)
+void LLImageRaw::contractToPowerOfTwo(S32 max_dim, bool scale_image)
 {
 	// Find new sizes
 	S32 new_width  = contractDimToPowerOfTwo(getWidth(), MIN_IMAGE_SIZE);
@@ -1397,7 +1399,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )
 }
 
 
-BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
+bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
 {
 	llassert((1 == getComponents()) || (3 == getComponents()) || (4 == getComponents()) );
 
@@ -1406,7 +1408,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
 	
 	if( (old_width == new_width) && (old_height == new_height) )
 	{
-		return TRUE;  // Nothing to do.
+		return true;  // Nothing to do.
 	}
 
 	// Reallocate the data buffer.
@@ -1441,7 +1443,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
 		U8 *new_data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), new_data_size); 
 		if(NULL == new_data) 
 		{
-			return FALSE; 
+			return false; 
 		}
 
 		bilinear_scale(getData(), old_width, old_height, getComponents(), old_width*getComponents(), new_data, new_width, new_height, getComponents(), new_width*getComponents());
@@ -1476,7 +1478,7 @@ BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )
 		}
 	}
 
-	return TRUE ;
+	return true ;
 }
 
 void LLImageRaw::copyLineScaled( U8* in, U8* out, S32 in_pixel_len, S32 out_pixel_len, S32 in_pixel_step, S32 out_pixel_step )
@@ -1795,7 +1797,7 @@ bool LLImageRaw::createFromFile(const std::string &filename, bool j2c_lowest_mip
 	ifs.read ((char*)buffer, length);
 	ifs.close();
 	
-	BOOL success;
+	bool success;
 
 	success = image->updateData();
 	if (success)
@@ -1971,7 +1973,7 @@ S32 LLImageFormatted::calcDiscardLevelBytes(S32 bytes)
 //----------------------------------------------------------------------------
 
 // Subclasses that can handle more than 4 channels should override this function.
-BOOL LLImageFormatted::decodeChannels(LLImageRaw* raw_image,F32  decode_time, S32 first_channel, S32 max_channel)
+bool LLImageFormatted::decodeChannels(LLImageRaw* raw_image,F32  decode_time, S32 first_channel, S32 max_channel)
 {
 	llassert( (first_channel == 0) && (max_channel == 4) );
 	return decode( raw_image, decode_time );  // Loads first 4 channels by default.
@@ -2022,7 +2024,7 @@ void LLImageFormatted::sanityCheck()
 
 //----------------------------------------------------------------------------
 
-BOOL LLImageFormatted::copyData(U8 *data, S32 size)
+bool LLImageFormatted::copyData(U8 *data, S32 size)
 {
 	if ( data && ((data != getData()) || (size != getDataSize())) )
 	{
@@ -2030,7 +2032,7 @@ BOOL LLImageFormatted::copyData(U8 *data, S32 size)
 		allocateData(size);
 		memcpy(getData(), data, size);	/* Flawfinder: ignore */
 	}
-	return TRUE;
+	return true;
 }
 
 // LLImageFormatted becomes the owner of data
@@ -2066,7 +2068,7 @@ void LLImageFormatted::appendData(U8 *data, S32 size)
 
 //----------------------------------------------------------------------------
 
-BOOL LLImageFormatted::load(const std::string &filename, int load_size)
+bool LLImageFormatted::load(const std::string &filename, int load_size)
 {
 	resetLastError();
 
@@ -2077,12 +2079,12 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
 	if (!apr_file)
 	{
 		setLastError("Unable to open file for reading", filename);
-		return FALSE;
+		return false;
 	}
 	if (file_size == 0)
 	{
 		setLastError("File is empty",filename);
-		return FALSE;
+		return false;
 	}
 
 	// Constrain the load size to acceptable values
@@ -2090,7 +2092,7 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
 	{
 		load_size = file_size;
 	}
-	BOOL res;
+	bool res;
 	U8 *data = allocateData(load_size);
 	apr_size_t bytes_read = load_size;
 	apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read
@@ -2098,7 +2100,7 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
 	{
 		deleteData();
 		setLastError("Unable to read file",filename);
-		res = FALSE;
+		res = false;
 	}
 	else
 	{
@@ -2108,7 +2110,7 @@ BOOL LLImageFormatted::load(const std::string &filename, int load_size)
 	return res;
 }
 
-BOOL LLImageFormatted::save(const std::string &filename)
+bool LLImageFormatted::save(const std::string &filename)
 {
 	resetLastError();
 
@@ -2117,15 +2119,15 @@ BOOL LLImageFormatted::save(const std::string &filename)
 	if (!outfile.getFileHandle())
 	{
 		setLastError("Unable to open file for writing", filename);
-		return FALSE;
+		return false;
 	}
 	
 	outfile.write(getData(), 	getDataSize());
 	outfile.close() ;
-	return TRUE;
+	return true;
 }
 
-// BOOL LLImageFormatted::save(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type)
+// bool LLImageFormatted::save(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type)
 // Depricated to remove VFS dependency.
 // Use:
 // LLVFile::writeFile(image->getData(), image->getDataSize(), vfs, uuid, type);
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index cd3f76f1fd0e3a0ac195874bd8611b211698fa15..adc650d3604417c68e1f830334ce664cbe25b57e 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -199,11 +199,11 @@ class LLImageRaw : public LLImageBase
 	/*virtual*/ U8* allocateData(S32 size = -1);
 	/*virtual*/ U8* reallocateData(S32 size);
 	
-	BOOL resize(U16 width, U16 height, S8 components);
+	bool resize(U16 width, U16 height, S8 components);
 
 	//U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const;
-	BOOL setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
-					 const U8 *data, U32 stride = 0, BOOL reverse_y = FALSE);
+	bool setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,
+					 const U8 *data, U32 stride = 0, bool reverse_y = false);
 
 	void clear(U8 r=0, U8 g=0, U8 b=0, U8 a=255);
 
@@ -212,10 +212,10 @@ class LLImageRaw : public LLImageBase
     static S32 biasedDimToPowerOfTwo(S32 curr_dim, S32 max_dim = MAX_IMAGE_SIZE);
     static S32 expandDimToPowerOfTwo(S32 curr_dim, S32 max_dim = MAX_IMAGE_SIZE);
     static S32 contractDimToPowerOfTwo(S32 curr_dim, S32 min_dim = MIN_IMAGE_SIZE);
-	void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
-	void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);
+	void expandToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
+	void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, bool scale_image = true);
 	void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);
-	BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE );
+	bool scale( S32 new_width, S32 new_height, bool scale_image = true );
 	
 	// Fill the buffer with a constant color
 	void fill( const LLColor4U& color );
@@ -314,23 +314,23 @@ class LLImageFormatted : public LLImageBase
 	// getRawDiscardLevel() by default returns mDiscardLevel, but may be overridden (LLImageJ2C)
 	virtual S8  getRawDiscardLevel() { return mDiscardLevel; }
 	
-	BOOL load(const std::string& filename, int load_size = 0);
-	BOOL save(const std::string& filename);
+	bool load(const std::string& filename, int load_size = 0);
+	bool save(const std::string& filename);
 
-	virtual BOOL updateData() = 0; // pure virtual
+	virtual bool updateData() = 0; // pure virtual
  	void setData(U8 *data, S32 size);
  	void appendData(U8 *data, S32 size);
 
 	// Loads first 4 channels.
-	virtual BOOL decode(LLImageRaw* raw_image, F32 decode_time) = 0;  
+	virtual bool decode(LLImageRaw* raw_image, F32 decode_time) = 0;  
 	// Subclasses that can handle more than 4 channels should override this function.
-	virtual BOOL decodeChannels(LLImageRaw* raw_image, F32 decode_time, S32 first_channel, S32 max_channel);
+	virtual bool decodeChannels(LLImageRaw* raw_image, F32 decode_time, S32 first_channel, S32 max_channel);
 
-	virtual BOOL encode(const LLImageRaw* raw_image, F32 encode_time) = 0;
+	virtual bool encode(const LLImageRaw* raw_image, F32 encode_time) = 0;
 
 	S8 getCodec() const;
-	BOOL isDecoding() const { return mDecoding ? TRUE : FALSE; }
-	BOOL isDecoded()  const { return mDecoded ? TRUE : FALSE; }
+	bool isDecoding() const { return mDecoding; }
+	bool isDecoded()  const { return mDecoded; }
 	void setDiscardLevel(S8 discard_level) { mDiscardLevel = discard_level; }
 	S8 getDiscardLevel() const { return mDiscardLevel; }
 	S8 getLevels() const { return mLevels; }
@@ -341,7 +341,7 @@ class LLImageFormatted : public LLImageBase
 	virtual void setLastError(const std::string& message, const std::string& filename = std::string());
 	
 protected:
-	BOOL copyData(U8 *data, S32 size); // calls updateData()
+	bool copyData(U8 *data, S32 size); // calls updateData()
 	
 protected:
 	S8 mCodec;
diff --git a/indra/llimage/llimagebmp.cpp b/indra/llimage/llimagebmp.cpp
index a2ce2fee860a537467a174c8807ac2c696fe9e78..2cdd26c22b4616c07a212821f9d9a632b4222403 100644
--- a/indra/llimage/llimagebmp.cpp
+++ b/indra/llimage/llimagebmp.cpp
@@ -78,7 +78,7 @@ LLImageBMP::LLImageBMP()
 	mColorPalette( NULL ),
 	mBitmapOffset( 0 ),
 	mBitsPerPixel( 0 ),
-	mOriginAtTop( FALSE )
+	mOriginAtTop( false )
 {
 	mBitfieldMask[0] = 0;
 	mBitfieldMask[1] = 0;
@@ -92,7 +92,7 @@ LLImageBMP::~LLImageBMP()
 }
 
 
-BOOL LLImageBMP::updateData()
+bool LLImageBMP::updateData()
 {
 	resetLastError();
 
@@ -101,7 +101,7 @@ BOOL LLImageBMP::updateData()
 	if (!mdata || (0 == getDataSize()))
 	{
 		setLastError("Uninitialized instance of LLImageBMP");
-		return FALSE;
+		return false;
 	}
 
 	// Read the bitmap headers in order to get all the useful info
@@ -120,12 +120,12 @@ BOOL LLImageBMP::updateData()
 		if ((mdata[0] != 'B') || (mdata[1] != 'A'))
 		{
 			setLastError("OS/2 bitmap array BMP files are not supported");
-			return FALSE;
+			return false;
 		}
 		else
 		{
 			setLastError("Does not appear to be a bitmap file");
-			return FALSE;
+			return false;
 		}
 	}
 
@@ -160,12 +160,12 @@ BOOL LLImageBMP::updateData()
 	llendianswizzleone(header.mNumColors);
 	llendianswizzleone(header.mNumColorsImportant);
 
-	BOOL windows_nt_version = FALSE;
-	BOOL windows_95_version = FALSE;
+	bool windows_nt_version = false;
+	bool windows_95_version = false;
 	if( 12 == header.mSize )
 	{
 		setLastError("Windows 2.x and OS/2 1.x BMP files are not supported");
-		return FALSE;
+		return false;
 	}
 	else
 	if( 40 == header.mSize )
@@ -173,7 +173,7 @@ BOOL LLImageBMP::updateData()
 		if( 3 == header.mCompression )
 		{
 			// Windows NT
-			windows_nt_version = TRUE;
+			windows_nt_version = true;
 		}
 		else
 		{
@@ -184,32 +184,32 @@ BOOL LLImageBMP::updateData()
 	if( 12 <= header.mSize && 64 <= header.mSize )
 	{
 		setLastError("OS/2 2.x BMP files are not supported");
-		return FALSE;
+		return false;
 	}
 	else
 	if( 108 == header.mSize )
 	{
 		// BITMAPV4HEADER
-		windows_95_version = TRUE;
+		windows_95_version = true;
 	}
 	else
 	if( 108 < header.mSize )
 	{
 		// BITMAPV5HEADER or greater
 		// Should work as long at Microsoft maintained backwards compatibility (which they did in V4 and V5)
-		windows_95_version = TRUE;
+		windows_95_version = true;
 	}
 
 	S32 width = header.mWidth;
 	S32 height = header.mHeight;
 	if (height < 0)
 	{
-		mOriginAtTop = TRUE;
+		mOriginAtTop = true;
 		height = -height;
 	}
 	else
 	{
-		mOriginAtTop = FALSE;
+		mOriginAtTop = false;
 	}
 
 	mBitsPerPixel = header.mBitsPerPixel;
@@ -228,10 +228,10 @@ BOOL LLImageBMP::updateData()
 	case 16: // Started work on 16, but doesn't work yet
 		// These are legal, but we don't support them yet.
 		setLastError("Unsupported bit depth");
-		return FALSE;
+		return false;
 	default:
 		setLastError("Unrecognized bit depth");
-		return FALSE;
+		return false;
 	}
 
 	setSize(width, height, components);
@@ -244,11 +244,11 @@ BOOL LLImageBMP::updateData()
 
 	case 1:
 		setLastError("8 bit RLE compression not supported.");
-		return FALSE;
+		return false;
 
 	case 2: 
 		setLastError("4 bit RLE compression not supported.");
-		return FALSE;
+		return false;
 
 	case 3:
 		// Windows NT or Windows 95
@@ -256,7 +256,7 @@ BOOL LLImageBMP::updateData()
 
 	default:
 		setLastError("Unsupported compression format.");
-		return FALSE;
+		return false;
 	}
 
 	////////////////////////////////////////////////////////////////////
@@ -267,13 +267,13 @@ BOOL LLImageBMP::updateData()
 		if( (16 != header.mBitsPerPixel) && (32 != header.mBitsPerPixel) )
 		{
 			setLastError("Bitfield encoding requires 16 or 32 bits per pixel.");
-			return FALSE;
+			return false;
 		}
 
 		if( 0 != header.mNumColors )
 		{
 			setLastError("Bitfield encoding is not compatible with a color table.");
-			return FALSE;
+			return false;
 		}
 
 		
@@ -322,15 +322,15 @@ BOOL LLImageBMP::updateData()
 		if (!mColorPalette)
 		{
 			LL_ERRS() << "Out of memory in LLImageBMP::updateData()" << LL_ENDL;
-			return FALSE;
+			return false;
 		}
 		memcpy( mColorPalette, mdata + FILE_HEADER_SIZE + BITMAP_HEADER_SIZE + extension_size, color_palette_size );	/* Flawfinder: ignore */
 	}
 
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
+bool LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
 {
 	llassert_always(raw_image);
 	
@@ -341,7 +341,7 @@ BOOL LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
 	if (!mdata || (0 == getDataSize()))
 	{
 		setLastError("llimagebmp trying to decode an image with no data!");
-		return FALSE;
+		return false;
 	}
 	
 	raw_image->resize(getWidth(), getHeight(), 3);
@@ -349,7 +349,7 @@ BOOL LLImageBMP::decode(LLImageRaw* raw_image, F32 decode_time)
 	U8* src = mdata + mBitmapOffset;
 	U8* dst = raw_image->getData();
 
-	BOOL success = FALSE;
+	bool success = false;
 
 	switch( mBitsPerPixel )
 	{
@@ -393,7 +393,7 @@ U32 LLImageBMP::countTrailingZeros( U32 m )
 }
 
 
-BOOL LLImageBMP::decodeColorMask16( U8* dst, U8* src )
+bool LLImageBMP::decodeColorMask16( U8* dst, U8* src )
 {
 	llassert( 16 == mBitsPerPixel );
 
@@ -426,10 +426,10 @@ BOOL LLImageBMP::decodeColorMask16( U8* dst, U8* src )
 		src += alignment_bytes;
 	}
 
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageBMP::decodeColorMask32( U8* dst, U8* src )
+bool LLImageBMP::decodeColorMask32( U8* dst, U8* src )
 {
 	// Note: alpha is not supported
 
@@ -445,7 +445,7 @@ BOOL LLImageBMP::decodeColorMask32( U8* dst, U8* src )
 
 	if (getWidth() * getHeight() * 4 > getDataSize() - mBitmapOffset)
 	{ //here we have situation when data size in src less than actually needed
-		return FALSE;
+		return false;
 	}
 
 	S32 src_row_span = getWidth() * 4;
@@ -469,11 +469,11 @@ BOOL LLImageBMP::decodeColorMask32( U8* dst, U8* src )
 		src += alignment_bytes;
 	}
 
-	return TRUE;
+	return true;
 }
 
 
-BOOL LLImageBMP::decodeColorTable8( U8* dst, U8* src )
+bool LLImageBMP::decodeColorTable8( U8* dst, U8* src )
 {
 	llassert( (8 == mBitsPerPixel) && (mColorPaletteColors >= 256) );
 
@@ -482,7 +482,7 @@ BOOL LLImageBMP::decodeColorTable8( U8* dst, U8* src )
 
 	if ((getWidth() * getHeight()) + getHeight() * alignment_bytes > getDataSize() - mBitmapOffset)
 	{ //here we have situation when data size in src less than actually needed
-		return FALSE;
+		return false;
 	}
 
 	for( S32 row = 0; row < getHeight(); row++ )
@@ -499,11 +499,11 @@ BOOL LLImageBMP::decodeColorTable8( U8* dst, U8* src )
 		src += alignment_bytes;
 	}
 
-	return TRUE;
+	return true;
 }
 
 
-BOOL LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
+bool LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
 {
 	llassert( 24 == mBitsPerPixel );
 	llassert( 3 == getComponents() );
@@ -512,7 +512,7 @@ BOOL LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
 
 	if ((getWidth() * getHeight() * 3) + getHeight() * alignment_bytes > getDataSize() - mBitmapOffset)
 	{ //here we have situation when data size in src less than actually needed
-		return FALSE;
+		return false;
 	}
 
 	for( S32 row = 0; row < getHeight(); row++ )
@@ -528,10 +528,10 @@ BOOL LLImageBMP::decodeTruecolor24( U8* dst, U8* src )
 		src += alignment_bytes;
 	}
 
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
+bool LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
 {
 	llassert_always(raw_image);
 	
@@ -563,7 +563,7 @@ BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
 	// Allocate the new buffer for the data.
 	if(!allocateData(file_bytes)) //memory allocation failed
 	{
-		return FALSE ;
+		return false ;
 	}
 
 	magic[0] = 'B'; magic[1] = 'M';
@@ -663,5 +663,5 @@ BOOL LLImageBMP::encode(const LLImageRaw* raw_image, F32 encode_time)
 		}
 	}
 
-	return TRUE;
+	return true;
 }
diff --git a/indra/llimage/llimagebmp.h b/indra/llimage/llimagebmp.h
index db0b45def0e9680298a1fd6df16ce08bbabdcc54..6a5fa4697d10872ad323f80f9ffe770ed4fb843e 100644
--- a/indra/llimage/llimagebmp.h
+++ b/indra/llimage/llimagebmp.h
@@ -40,15 +40,15 @@ class LLImageBMP : public LLImageFormatted
 	LLImageBMP();
 
 	/*virtual*/ std::string getExtension() { return std::string("bmp"); }
-	/*virtual*/ BOOL updateData();
-	/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
-	/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
+	/*virtual*/ bool updateData();
+	/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
+	/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
 
 protected:
-	BOOL		decodeColorTable8( U8* dst, U8* src );
-	BOOL		decodeColorMask16( U8* dst, U8* src );
-	BOOL		decodeTruecolor24( U8* dst, U8* src );
-	BOOL		decodeColorMask32( U8* dst, U8* src );
+	bool		decodeColorTable8( U8* dst, U8* src );
+	bool		decodeColorMask16( U8* dst, U8* src );
+	bool		decodeTruecolor24( U8* dst, U8* src );
+	bool		decodeColorMask32( U8* dst, U8* src );
 
 	U32			countTrailingZeros( U32 m );
 
@@ -58,7 +58,7 @@ class LLImageBMP : public LLImageFormatted
 	S32			mBitmapOffset;
 	S32			mBitsPerPixel;
 	U32			mBitfieldMask[4]; // rgba
-	BOOL		mOriginAtTop;
+	bool		mOriginAtTop;
 };
 
 #endif
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 04e0e752ebd3374b85b5c12dfff8e466bb0fddea..0ec83415a09d98e2585d64b3c7c525235065a28d 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -172,7 +172,7 @@ LLImageDXT::~LLImageDXT()
 }
 
 // virtual
-BOOL LLImageDXT::updateData()
+bool LLImageDXT::updateData()
 {
 	resetLastError();
 
@@ -182,7 +182,7 @@ BOOL LLImageDXT::updateData()
 	if (!data || !data_size)
 	{
 		setLastError("LLImageDXT uninitialized");
-		return FALSE;
+		return false;
 	}
 
 	S32 width, height, miplevelmax;
@@ -216,7 +216,7 @@ BOOL LLImageDXT::updateData()
 	discard = llmin(discard, miplevelmax);
 	setDiscardLevel(discard);
 
-	return TRUE;
+	return true;
 }
 
 // discard: 0 = largest (last) mip
@@ -257,7 +257,7 @@ void LLImageDXT::setFormat()
 }
 		
 // virtual
-BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
+bool LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
 {
 	// *TODO: Test! This has been tweaked since its intial inception,
 	//  but we don't use it any more!
@@ -266,7 +266,7 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
 	if (mFileFormat >= FORMAT_DXT1 && mFileFormat <= FORMAT_DXR5)
 	{
 		LL_WARNS() << "Attempt to decode compressed LLImageDXT to Raw (unsupported)" << LL_ENDL;
-		return FALSE;
+		return false;
 	}
 	
 	S32 width = getWidth(), height = getHeight();
@@ -286,16 +286,16 @@ BOOL LLImageDXT::decode(LLImageRaw* raw_image, F32 time)
 	if ((!getData()) || (data + image_size > getData() + getDataSize()))
 	{
 		setLastError("LLImageDXT trying to decode an image with not enough data!");
-		return FALSE;
+		return false;
 	}
 
 	raw_image->resize(width, height, ncomponents);
 	memcpy(raw_image->getData(), data, image_size);	/* Flawfinder: ignore */
 
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
+bool LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
 {
 	if (discard < 0)
 	{
@@ -310,10 +310,10 @@ BOOL LLImageDXT::getMipData(LLPointer<LLImageRaw>& raw, S32 discard)
 	S32 height = 0;
 	calcDiscardWidthHeight(discard, mFileFormat, width, height);
 	raw = new LLImageRaw(data, width, height, getComponents());
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_mips)
+bool LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_mips)
 {
 	llassert_always(raw_image);
 	
@@ -395,11 +395,11 @@ BOOL LLImageDXT::encodeDXT(const LLImageRaw* raw_image, F32 time, bool explicit_
 		prev_mipdata = mipdata;
 	}
 	
-	return TRUE;
+	return true;
 }
 
 // virtual
-BOOL LLImageDXT::encode(const LLImageRaw* raw_image, F32 time)
+bool LLImageDXT::encode(const LLImageRaw* raw_image, F32 time)
 {
 	return encodeDXT(raw_image, time, false);
 }
diff --git a/indra/llimage/llimagedxt.h b/indra/llimage/llimagedxt.h
index a8756ba8edb7bcc1c7c041a09add13a8364c3efd..a4a9bcf99c4b6c5876d843dea5cce41a9ee35fce 100644
--- a/indra/llimage/llimagedxt.h
+++ b/indra/llimage/llimagedxt.h
@@ -93,21 +93,21 @@ class LLImageDXT : public LLImageFormatted
 	/*virtual*/ ~LLImageDXT();
 
 private:
-	BOOL encodeDXT(const LLImageRaw* raw_image, F32 decode_time, bool explicit_mips);
+	bool encodeDXT(const LLImageRaw* raw_image, F32 decode_time, bool explicit_mips);
 	
 public:
 	LLImageDXT();
 
 	/*virtual*/ std::string getExtension() { return std::string("dxt"); }
-	/*virtual*/ BOOL updateData();
+	/*virtual*/ bool updateData();
 
-	/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
-	/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
+	/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
+	/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
 
 	/*virtual*/ S32 calcHeaderSize();
 	/*virtual*/ S32 calcDataSize(S32 discard_level = 0);
 
-	BOOL getMipData(LLPointer<LLImageRaw>& raw, S32 discard=-1);
+	bool getMipData(LLPointer<LLImageRaw>& raw, S32 discard=-1);
 	
 	void setFormat();
 	S32 getMipOffset(S32 discard);
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index 7cd59a2983efe617250a58ec198eca828efa2fed..68694496bcf502a13989070efc283d36deeca07d 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -31,18 +31,13 @@
 #include "llmath.h"
 #include "llmemory.h"
 #include "llsd.h"
+#include <boost/scoped_ptr.hpp>
 
-typedef LLImageJ2CImpl* (*CreateLLImageJ2CFunction)();
-typedef void (*DestroyLLImageJ2CFunction)(LLImageJ2CImpl*);
-typedef const char* (*EngineInfoLLImageJ2CFunction)();
-
-// Declare the prototype for theses functions here. Their functionality
-// will be implemented in other files which define a derived LLImageJ2CImpl
-// but only ONE static library which has the implementation for these
-// functions should ever be included.
+// Declare the prototype for this factory function here. It is implemented in
+// other files which define a LLImageJ2CImpl subclass, but only ONE static
+// library which has the implementation for this function should ever be
+// linked.
 LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl();
-void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl);
-const char* fallbackEngineInfoLLImageJ2CImpl();
 
 // Test data gathering handle
 LLImageCompressionTester* LLImageJ2C::sTesterp = NULL ;
@@ -51,17 +46,20 @@ const std::string sTesterName("ImageCompressionTester");
 //static
 std::string LLImageJ2C::getEngineInfo()
 {
-    return fallbackEngineInfoLLImageJ2CImpl();
+	// All known LLImageJ2CImpl implementation subclasses are cheap to
+	// construct.
+	boost::scoped_ptr<LLImageJ2CImpl> impl(fallbackCreateLLImageJ2CImpl());
+	return impl->getEngineInfo();
 }
 
 LLImageJ2C::LLImageJ2C() : 	LLImageFormatted(IMG_CODEC_J2C),
 							mMaxBytes(0),
 							mRawDiscardLevel(-1),
 							mRate(DEFAULT_COMPRESSION_RATE),
-							mReversible(FALSE),
+							mReversible(false),
 							mAreaUsedForDataSizeCalcs(0)
 {
-	mImpl = fallbackCreateLLImageJ2CImpl();
+	mImpl.reset(fallbackCreateLLImageJ2CImpl());
 	claimMem(mImpl);
 
 	// Clear data size table
@@ -83,13 +81,7 @@ LLImageJ2C::LLImageJ2C() : 	LLImageFormatted(IMG_CODEC_J2C),
 }
 
 // virtual
-LLImageJ2C::~LLImageJ2C()
-{
-	if ( mImpl )
-	{
-        fallbackDestroyLLImageJ2CImpl(mImpl);
-	}
-}
+LLImageJ2C::~LLImageJ2C() {}
 
 // virtual
 void LLImageJ2C::resetLastError()
@@ -111,16 +103,16 @@ S8  LLImageJ2C::getRawDiscardLevel()
 	return mRawDiscardLevel;
 }
 
-BOOL LLImageJ2C::updateData()
+bool LLImageJ2C::updateData()
 {
-	BOOL res = TRUE;
+	bool res = true;
 	resetLastError();
 
 	// Check to make sure that this instance has been initialized with data
 	if (!getData() || (getDataSize() < 16))
 	{
 		setLastError("LLImageJ2C uninitialized");
-		res = FALSE;
+		res = false;
 	}
 	else 
 	{
@@ -142,29 +134,29 @@ BOOL LLImageJ2C::updateData()
 	return res;
 }
 
-BOOL LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region)
+bool LLImageJ2C::initDecode(LLImageRaw &raw_image, int discard_level, int* region)
 {
 	setDiscardLevel(discard_level != -1 ? discard_level : 0);
 	return mImpl->initDecode(*this,raw_image,discard_level,region);
 }
 
-BOOL LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+bool LLImageJ2C::initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
 {
 	return mImpl->initEncode(*this,raw_image,blocks_size,precincts_size,levels);
 }
 
-BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
+bool LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time)
 {
 	return decodeChannels(raw_imagep, decode_time, 0, 4);
 }
 
 
-// Returns TRUE to mean done, whether successful or not.
-BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count )
+// Returns true to mean done, whether successful or not.
+bool LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count )
 {
 	LLTimer elapsed;
 
-	BOOL res = TRUE;
+	bool res = true;
 	
 	resetLastError();
 
@@ -172,13 +164,13 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
 	if (!getData() || (getDataSize() < 16))
 	{
 		setLastError("LLImageJ2C uninitialized");
-		res = TRUE; // done
+		res = true; // done
 	}
 	else
 	{
 		// Update the raw discard level
 		updateRawDiscardLevel();
-		mDecoding = TRUE;
+		mDecoding = true;
 		res = mImpl->decodeImpl(*this, *raw_imagep, decode_time, first_channel, max_channel_count);
 	}
 	
@@ -191,7 +183,7 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
 		}
 		else
 		{
-			mDecoding = FALSE;
+			mDecoding = false;
 		}
 	}
 
@@ -210,7 +202,7 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
 		tester->updateDecompressionStats(elapsed.getElapsedTimeF32()) ;
 		if (res)
 		{
-			// The whole data stream is finally decompressed when res is returned as TRUE
+			// The whole data stream is finally decompressed when res is returned as true
 			tester->updateDecompressionStats(this->getDataSize(), raw_imagep->getDataSize()) ;
 		}
 	}
@@ -219,17 +211,17 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir
 }
 
 
-BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
+bool LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time)
 {
 	return encode(raw_imagep, NULL, encode_time);
 }
 
 
-BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
+bool LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time)
 {
 	LLTimer elapsed;
 	resetLastError();
-	BOOL res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
+	bool res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible);
 	if (!mLastError.empty())
 	{
 		LLImage::setLastError(mLastError);
@@ -245,7 +237,7 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text,
 		tester->updateCompressionStats(elapsed.getElapsedTimeF32()) ;
 		if (res)
 		{
-			// The whole data stream is finally compressed when res is returned as TRUE
+			// The whole data stream is finally compressed when res is returned as true
 			tester->updateCompressionStats(this->getDataSize(), raw_imagep->getDataSize()) ;
 		}
 	}
@@ -348,15 +340,15 @@ void LLImageJ2C::setMaxBytes(S32 max_bytes)
 	mMaxBytes = max_bytes;
 }
 
-void LLImageJ2C::setReversible(const BOOL reversible)
+void LLImageJ2C::setReversible(const bool reversible)
 {
  	mReversible = reversible;
 }
 
 
-BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
+bool LLImageJ2C::loadAndValidate(const std::string &filename)
 {
-	BOOL res = TRUE;
+	bool res = true;
 	
 	resetLastError();
 
@@ -367,12 +359,12 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
 	if (!apr_file)
 	{
 		setLastError("Unable to open file for reading", filename);
-		res = FALSE;
+		res = false;
 	}
 	else if (file_size == 0)
 	{
 		setLastError("File is empty",filename);
-		res = FALSE;
+		res = false;
 	}
 	else
 	{
@@ -385,7 +377,7 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
 		{
 			FREE_MEM(LLImageBase::getPrivatePool(), data);
 			setLastError("Unable to read entire file");
-			res = FALSE;
+			res = false;
 		}
 		else
 		{
@@ -402,21 +394,21 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)
 }
 
 
-BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
+bool LLImageJ2C::validate(U8 *data, U32 file_size)
 {
 
 	resetLastError();
 	
 	setData(data, file_size);
 
-	BOOL res = updateData();
+	bool res = updateData();
 	if ( res )
 	{
 		// Check to make sure that this instance has been initialized with data
 		if (!getData() || (0 == getDataSize()))
 		{
 			setLastError("LLImageJ2C uninitialized");
-			res = FALSE;
+			res = false;
 		}
 		else
 		{
@@ -433,7 +425,7 @@ BOOL LLImageJ2C::validate(U8 *data, U32 file_size)
 
 void LLImageJ2C::decodeFailed()
 {
-	mDecoding = FALSE;
+	mDecoding = false;
 }
 
 void LLImageJ2C::updateRawDiscardLevel()
diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h
index ce8195940d7c43683bad9380c1b40f903a1aff73..e196f7479ed0c83dd30b17e3a5db0db5f7c7d863 100644
--- a/indra/llimage/llimagej2c.h
+++ b/indra/llimage/llimagej2c.h
@@ -30,6 +30,7 @@
 #include "llimage.h"
 #include "llassettype.h"
 #include "llmetricperformancetester.h"
+#include <boost/scoped_ptr.hpp>
 
 // JPEG2000 : compression rate used in j2c conversion.
 const F32 DEFAULT_COMPRESSION_RATE = 1.f/8.f;
@@ -47,10 +48,10 @@ class LLImageJ2C : public LLImageFormatted
 
 	// Base class overrides
 	/*virtual*/ std::string getExtension() { return std::string("j2c"); }
-	/*virtual*/ BOOL updateData();
-	/*virtual*/ BOOL decode(LLImageRaw *raw_imagep, F32 decode_time);
-	/*virtual*/ BOOL decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count);
-	/*virtual*/ BOOL encode(const LLImageRaw *raw_imagep, F32 encode_time);
+	/*virtual*/ bool updateData();
+	/*virtual*/ bool decode(LLImageRaw *raw_imagep, F32 decode_time);
+	/*virtual*/ bool decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count);
+	/*virtual*/ bool encode(const LLImageRaw *raw_imagep, F32 encode_time);
 	/*virtual*/ S32 calcHeaderSize();
 	/*virtual*/ S32 calcDataSize(S32 discard_level = 0);
 	/*virtual*/ S32 calcDiscardLevelBytes(S32 bytes);
@@ -59,17 +60,17 @@ class LLImageJ2C : public LLImageFormatted
 	/*virtual*/ void resetLastError();
 	/*virtual*/ void setLastError(const std::string& message, const std::string& filename = std::string());
 	
-	BOOL initDecode(LLImageRaw &raw_image, int discard_level, int* region);
-	BOOL initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
+	bool initDecode(LLImageRaw &raw_image, int discard_level, int* region);
+	bool initEncode(LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels);
 	
 	// Encode with comment text 
-	BOOL encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
+	bool encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time=0.0);
 
-	BOOL validate(U8 *data, U32 file_size);
-	BOOL loadAndValidate(const std::string &filename);
+	bool validate(U8 *data, U32 file_size);
+	bool loadAndValidate(const std::string &filename);
 
 	// Encode accessors
-	void setReversible(const BOOL reversible); // Use non-lossy?
+	void setReversible(const bool reversible); // Use non-lossy?
 	void setMaxBytes(S32 max_bytes);
 	S32 getMaxBytes() const { return mMaxBytes; }
 
@@ -93,8 +94,8 @@ class LLImageJ2C : public LLImageFormatted
 
 	S8  mRawDiscardLevel;
 	F32 mRate;
-	BOOL mReversible;
-	LLImageJ2CImpl *mImpl;
+	bool mReversible;
+	boost::scoped_ptr<LLImageJ2CImpl> mImpl;
 	std::string mLastError;
 
     // Image compression/decompression tester
@@ -111,23 +112,25 @@ class LLImageJ2CImpl
 	// Return value:
 	// true: image size and number of channels was determined
 	// false: error on decode
-	virtual BOOL getMetadata(LLImageJ2C &base) = 0;
+	virtual bool getMetadata(LLImageJ2C &base) = 0;
 	// Decode the raw image optionally aborting (to continue later) after
 	// decode_time seconds.  Decode at most max_channel_count and start
 	// decoding channel first_channel.
 	// Return value:
 	// true: decoding complete (even if it failed)
 	// false: time expired while decoding
-	virtual BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0;
-	virtual BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
-							BOOL reversible=FALSE) = 0;
-	virtual BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
-	virtual BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
+	virtual bool decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count) = 0;
+	virtual bool encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
+							bool reversible=false) = 0;
+	virtual bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL) = 0;
+	virtual bool initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0) = 0;
+
+	virtual std::string getEngineInfo() const = 0;
 
 	friend class LLImageJ2C;
 };
 
-#define LINDEN_J2C_COMMENT_PREFIX "LL_"
+#define LINDEN_J2C_COMMENT_PREFIX "LL_" // Used by LLAppearanceUtility
 
 //
 // This class is used for performance data gathering only.
diff --git a/indra/llimage/llimagejpeg.cpp b/indra/llimage/llimagejpeg.cpp
index e419c77ff2ce4b1f8f84ba8999844a2378b17c3b..60b2d0faa53fc2c11c90c24a36b6c23d18c6efdc 100644
--- a/indra/llimage/llimagejpeg.cpp
+++ b/indra/llimage/llimagejpeg.cpp
@@ -45,7 +45,7 @@ LLImageJPEG::~LLImageJPEG()
 	delete[] mOutputBuffer;
 }
 
-BOOL LLImageJPEG::updateData()
+bool LLImageJPEG::updateData()
 {
 	resetLastError();
 
@@ -53,7 +53,7 @@ BOOL LLImageJPEG::updateData()
 	if (!getData() || (0 == getDataSize()))
 	{
 		setLastError("Uninitialized instance of LLImageJPEG");
-		return FALSE;
+		return false;
 	}
 
 	////////////////////////////////////////
@@ -79,7 +79,7 @@ BOOL LLImageJPEG::updateData()
 	if(setjmp(sSetjmpBuffer))
 	{
 		jpeg_destroy_decompress(&cinfo);
-		return FALSE;
+		return false;
 	}
 	try
 	{
@@ -106,7 +106,7 @@ BOOL LLImageJPEG::updateData()
 		
 		////////////////////////////////////////
 		// Step 3: read file parameters with jpeg_read_header()
-		jpeg_read_header( &cinfo, TRUE );
+		jpeg_read_header( &cinfo, true );
 
 		// Data set by jpeg_read_header
 		setSize(cinfo.image_width, cinfo.image_height, 3); // Force to 3 components (RGB)
@@ -115,13 +115,13 @@ BOOL LLImageJPEG::updateData()
 		// More data set by jpeg_read_header
 		cinfo.num_components;
 		cinfo.jpeg_color_space;	// Colorspace of image
-		cinfo.saw_JFIF_marker;		// TRUE if a JFIF APP0 marker was seen
+		cinfo.saw_JFIF_marker;		// true if a JFIF APP0 marker was seen
 		cinfo.JFIF_major_version;	// Version information from JFIF marker
 		cinfo.JFIF_minor_version;  //
 		cinfo.density_unit;		// Resolution data from JFIF marker
 		cinfo.X_density;
 		cinfo.Y_density;
-		cinfo.saw_Adobe_marker;	// TRUE if an Adobe APP14 marker was seen
+		cinfo.saw_Adobe_marker;	// true if an Adobe APP14 marker was seen
 		cinfo.Adobe_transform;     // Color transform code from Adobe marker
 		*/
 	}
@@ -129,13 +129,13 @@ BOOL LLImageJPEG::updateData()
 	{
 		jpeg_destroy_decompress(&cinfo);
 
-		return FALSE;
+		return false;
 	}
 	////////////////////////////////////////
 	// Step 4: Release JPEG decompression object 
 	jpeg_destroy_decompress(&cinfo);
 
-	return TRUE;
+	return true;
 }
 
 // Initialize source --- called by jpeg_read_header
@@ -154,7 +154,7 @@ boolean LLImageJPEG::decodeFillInputBuffer( j_decompress_ptr cinfo )
 	// Should never get here, since we provide the entire buffer up front.
 	ERREXIT(cinfo, JERR_INPUT_EMPTY);
 
-	return TRUE;
+	return true;
 }
 
 // Skip data --- used to skip over a potentially large amount of
@@ -182,7 +182,7 @@ void LLImageJPEG::decodeTermSource (j_decompress_ptr cinfo)
 
 
 // Returns true when done, whether or not decode was successful.
-BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
+bool LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
 {
 	llassert_always(raw_image);
 	
@@ -192,7 +192,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
 	if (!getData() || (0 == getDataSize()))
 	{
 		setLastError("LLImageJPEG trying to decode an image with no data!");
-		return TRUE;  // done
+		return true;  // done
 	}
 	
 	S32 row_stride = 0;
@@ -220,7 +220,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
 	if(setjmp(sSetjmpBuffer))
 	{
 		jpeg_destroy_decompress(&cinfo);
-		return TRUE; // done
+		return true; // done
 	}
 	try
 	{
@@ -247,11 +247,11 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
 		////////////////////////////////////////
 		// Step 3: read file parameters with jpeg_read_header()
 		
-		jpeg_read_header(&cinfo, TRUE);
+		jpeg_read_header(&cinfo, true);
 
 		// We can ignore the return value from jpeg_read_header since
 		//   (a) suspension is not possible with our data source, and
-		//   (b) we passed TRUE to reject a tables-only JPEG file as an error.
+		//   (b) we passed true to reject a tables-only JPEG file as an error.
 		// See libjpeg.doc for more info.
 
 		setSize(cinfo.image_width, cinfo.image_height, 3); // Force to 3 components (RGB)
@@ -314,7 +314,7 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
 	catch (int)
 	{
 		jpeg_destroy_decompress(&cinfo);
-		return TRUE; // done
+		return true; // done
 	}
 
 	// Check to see whether any corrupt-data warnings occurred
@@ -322,10 +322,10 @@ BOOL LLImageJPEG::decode(LLImageRaw* raw_image, F32 decode_time)
 	{
 		// TODO: extract the warning to find out what went wrong.
 		setLastError( "Unable to decode JPEG image.");
-		return TRUE; // done
+		return true; // done
 	}
 
-	return TRUE;
+	return true;
 }
 
 
@@ -344,11 +344,11 @@ void LLImageJPEG::encodeInitDestination ( j_compress_ptr cinfo )
 // 
 //  In typical applications, this should write the entire output buffer
 //  (ignoring the current state of next_output_byte & free_in_buffer),
-//  reset the pointer & count to the start of the buffer, and return TRUE
+//  reset the pointer & count to the start of the buffer, and return true
 //  indicating that the buffer has been dumped.
 // 
 //  In applications that need to be able to suspend compression due to output
-//  overrun, a FALSE return indicates that the buffer cannot be emptied now.
+//  overrun, a false return indicates that the buffer cannot be emptied now.
 //  In this situation, the compressor will return to its caller (possibly with
 //  an indication that it has not accepted all the supplied scanlines).  The
 //  application should resume compression after it has made more room in the
@@ -357,7 +357,7 @@ void LLImageJPEG::encodeInitDestination ( j_compress_ptr cinfo )
 // 
 //  When suspending, the compressor will back up to a convenient restart point
 //  (typically the start of the current MCU). next_output_byte & free_in_buffer
-//  indicate where the restart point will be if the current call returns FALSE.
+//  indicate where the restart point will be if the current call returns false.
 //  Data beyond this point will be regenerated after resumption, so do not
 //  write it out when emptying the buffer externally.
 
@@ -374,7 +374,7 @@ boolean LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )
   if (!new_buffer)
   {
   	LL_ERRS() << "Out of memory in LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )" << LL_ENDL;
-  	return FALSE;
+  	return false;
   }
   memcpy( new_buffer, self->mOutputBuffer, self->mOutputBufferSize );	/* Flawfinder: ignore */
   delete[] self->mOutputBuffer;
@@ -386,7 +386,7 @@ boolean LLImageJPEG::encodeEmptyOutputBuffer( j_compress_ptr cinfo )
   self->mOutputBufferSize = new_buffer_size;
   self->claimMem(new_buffer_size);
 
-  return TRUE;
+  return true;
 }
 
 //  Terminate destination --- called by jpeg_finish_compress
@@ -465,11 +465,11 @@ void LLImageJPEG::errorOutputMessage( j_common_ptr cinfo )
 	std::string error = buffer ;
 	LLImage::setLastError(error);
 
-	BOOL is_decode = (cinfo->is_decompressor != 0);
+	bool is_decode = (cinfo->is_decompressor != 0);
 	LL_WARNS() << "LLImageJPEG " << (is_decode ? "decode " : "encode ") << " failed: " << buffer << LL_ENDL;
 }
 
-BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
+bool LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
 {
 	llassert_always(raw_image);
 	
@@ -482,7 +482,7 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
 		break;
 	default:
 		setLastError("Unable to encode a JPEG image that doesn't have 1 or 3 components.");
-		return FALSE;
+		return false;
 	}
 
 	setSize(raw_image->getWidth(), raw_image->getHeight(), raw_image->getComponents());
@@ -531,7 +531,7 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
 		mOutputBuffer = NULL;
 		disclaimMem(mOutputBufferSize);
 		mOutputBufferSize = 0;
-		return FALSE;
+		return false;
 	}
 
 	try
@@ -576,7 +576,7 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
 			break;
 		default:
 			setLastError("Unable to encode a JPEG image that doesn't have 1 or 3 components.");
-			return FALSE;
+			return false;
 		}
 
 		// Now use the library's routine to set default compression parameters.
@@ -585,15 +585,15 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
 		jpeg_set_defaults(&cinfo);
 
 		// Now you can set any non-default parameters you wish to.
-		jpeg_set_quality(&cinfo, mEncodeQuality, TRUE );  // limit to baseline-JPEG values
+		jpeg_set_quality(&cinfo, mEncodeQuality, true );  // limit to baseline-JPEG values
 
 		////////////////////////////////////////
 		// Step 4: Start compressor 
 		//
-		// TRUE ensures that we will write a complete interchange-JPEG file.
-		// Pass TRUE unless you are very sure of what you're doing.
+		// true ensures that we will write a complete interchange-JPEG file.
+		// Pass true unless you are very sure of what you're doing.
    
-		jpeg_start_compress(&cinfo, TRUE);
+		jpeg_start_compress(&cinfo, true);
 
 		////////////////////////////////////////
 		// Step 5: while (scan lines remain to be written) 
@@ -647,8 +647,8 @@ BOOL LLImageJPEG::encode( const LLImageRaw* raw_image, F32 encode_time )
 		mOutputBuffer = NULL;
 		disclaimMem(mOutputBufferSize);
 		mOutputBufferSize = 0;
-		return FALSE;
+		return false;
 	}
 
-	return TRUE;
+	return true;
 }
diff --git a/indra/llimage/llimagejpeg.h b/indra/llimage/llimagejpeg.h
index 2142660c819ae129f185451a000f27cf8ff5a474..7a849a84212aa8f43123baf41dd2e3029cf2cef0 100644
--- a/indra/llimage/llimagejpeg.h
+++ b/indra/llimage/llimagejpeg.h
@@ -51,9 +51,9 @@ class LLImageJPEG : public LLImageFormatted
 	LLImageJPEG(S32 quality = 75);
 
 	/*virtual*/ std::string getExtension() { return std::string("jpg"); }
-	/*virtual*/ BOOL updateData();
-	/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
-	/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
+	/*virtual*/ bool updateData();
+	/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
+	/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
 
 	void			setEncodeQuality( S32 q )	{ mEncodeQuality = q; } // on a scale from 1 to 100
 	S32				getEncodeQuality()			{ return mEncodeQuality; }
@@ -73,7 +73,7 @@ class LLImageJPEG : public LLImageFormatted
 	static void		errorEmitMessage(j_common_ptr cinfo, int msg_level);
 	static void		errorOutputMessage(j_common_ptr cinfo);
 
-	static BOOL		decompress(LLImageJPEG* imagep);
+	static bool		decompress(LLImageJPEG* imagep);
 
 protected:
 	U8*				mOutputBuffer;		// temp buffer used during encoding
diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp
index 7735dc13797a2807c7425eed8c778f501554def1..a299602d790ddf9fab46d366187bfd92bddfd145 100644
--- a/indra/llimage/llimagepng.cpp
+++ b/indra/llimage/llimagepng.cpp
@@ -47,7 +47,7 @@ LLImagePNG::~LLImagePNG()
 // Virtual
 // Parse PNG image information and set the appropriate
 // width, height and component (channel) information.
-BOOL LLImagePNG::updateData()
+bool LLImagePNG::updateData()
 {
     resetLastError();
 
@@ -55,7 +55,7 @@ BOOL LLImagePNG::updateData()
     if (!getData() || (0 == getDataSize()))
     {
         setLastError("Uninitialized instance of LLImagePNG");
-        return FALSE;
+        return false;
     }
 
 	// Decode the PNG data and extract sizing information
@@ -63,25 +63,25 @@ BOOL LLImagePNG::updateData()
 	if (!pngWrapper.isValidPng(getData()))
 	{
 		setLastError("LLImagePNG data does not have a valid PNG header!");
-		return FALSE;
+		return false;
 	}
 
 	LLPngWrapper::ImageInfo infop;
 	if (! pngWrapper.readPng(getData(), getDataSize(), NULL, &infop))
 	{
 		setLastError(pngWrapper.getErrorMessage());
-		return FALSE;
+		return false;
 	}
 
 	setSize(infop.mWidth, infop.mHeight, infop.mComponents);
 
-	return TRUE;
+	return true;
 }
 
 // Virtual
 // Decode an in-memory PNG image into the raw RGB or RGBA format
 // used within SecondLife.
-BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
+bool LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
 {
 	llassert_always(raw_image);
 
@@ -91,7 +91,7 @@ BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
     if (!getData() || (0 == getDataSize()))
     {
         setLastError("LLImagePNG trying to decode an image with no data!");
-        return FALSE;
+        return false;
     }
 
 	// Decode the PNG data into the raw image
@@ -99,21 +99,21 @@ BOOL LLImagePNG::decode(LLImageRaw* raw_image, F32 decode_time)
 	if (!pngWrapper.isValidPng(getData()))
 	{
 		setLastError("LLImagePNG data does not have a valid PNG header!");
-		return FALSE;
+		return false;
 	}
 
 	if (! pngWrapper.readPng(getData(), getDataSize(), raw_image))
 	{
 		setLastError(pngWrapper.getErrorMessage());
-		return FALSE;
+		return false;
 	}
 
-	return TRUE;
+	return true;
 }
 
 // Virtual
 // Encode the in memory RGB image into PNG format.
-BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
+bool LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
 {
 	llassert_always(raw_image);
 
@@ -133,7 +133,7 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
 	{
 		setLastError(pngWrapper.getErrorMessage());
 		delete[] tmpWriteBuffer;
-		return FALSE;
+		return false;
 	}
 
 	// Resize internal buffer and copy from temp
@@ -143,6 +143,6 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
 
 	delete[] tmpWriteBuffer;
 
-	return TRUE;
+	return true;
 }
 
diff --git a/indra/llimage/llimagepng.h b/indra/llimage/llimagepng.h
index 1fbd850a2eb22c0250e2713090661558eaad5196..ef16f2996f9a533fff0b4a88ad8ea0dc84184605 100644
--- a/indra/llimage/llimagepng.h
+++ b/indra/llimage/llimagepng.h
@@ -38,9 +38,9 @@ class LLImagePNG : public LLImageFormatted
 	LLImagePNG();
 
 	/*virtual*/ std::string getExtension() { return std::string("png"); }
-	/*virtual*/ BOOL updateData();
-	/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
-	/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
+	/*virtual*/ bool updateData();
+	/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time);
+	/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time);
 };
 
 #endif
diff --git a/indra/llimage/llimagetga.cpp b/indra/llimage/llimagetga.cpp
index d0ae105ba79699126098012987418a6eac58fa21..5ad7658ec1bbc7ca498760fc826dc89f04d76c57 100644
--- a/indra/llimage/llimagetga.cpp
+++ b/indra/llimage/llimagetga.cpp
@@ -61,7 +61,7 @@ LLImageTGA::LLImageTGA()
 	  mColorMapStart( 0 ),
 	  mColorMapLength( 0 ),
 	  mColorMapBytesPerEntry( 0 ),
-	  mIs15Bit( FALSE ),
+	  mIs15Bit( false ),
 
 	  mAttributeBits(0),
 	  mColorMapDepth(0),
@@ -94,7 +94,7 @@ LLImageTGA::LLImageTGA(const std::string& file_name)
 	  mColorMapStart( 0 ),
 	  mColorMapLength( 0 ),
 	  mColorMapBytesPerEntry( 0 ),
-	  mIs15Bit( FALSE )
+	  mIs15Bit( false )
 {
 	loadFile(file_name);
 }
@@ -104,7 +104,7 @@ LLImageTGA::~LLImageTGA()
 	delete [] mColorMap;
 }
 
-BOOL LLImageTGA::updateData()
+bool LLImageTGA::updateData()
 {
 	resetLastError();
 
@@ -112,7 +112,7 @@ BOOL LLImageTGA::updateData()
 	if (!getData() || (0 == getDataSize()))
 	{
 		setLastError("LLImageTGA uninitialized");
-		return FALSE;
+		return false;
 	}
 	
 	// Pull image information from the header...
@@ -185,13 +185,13 @@ BOOL LLImageTGA::updateData()
 	case 0:
 		// No image data included in file
 		setLastError("Unable to load file.  TGA file contains no image data.");
-		return FALSE;
+		return false;
 	case 1:
 		// Colormapped uncompressed
 		if( 8 != mPixelSize )
 		{
 			setLastError("Unable to load file.  Colormapped images must have 8 bits per pixel.");
-			return FALSE;
+			return false;
 		}
 		break;
 	case 2:
@@ -202,7 +202,7 @@ BOOL LLImageTGA::updateData()
 		if( 8 != mPixelSize )
 		{
 			setLastError("Unable to load file.  Monochrome images must have 8 bits per pixel.");
-			return FALSE;
+			return false;
 		}
 		break;
 	case 9:
@@ -216,12 +216,12 @@ BOOL LLImageTGA::updateData()
 		if( 8 != mPixelSize )
 		{
 			setLastError("Unable to load file.  Monochrome images must have 8 bits per pixel.");
-			return FALSE;
+			return false;
 		}
 		break;
 	default:
 		setLastError("Unable to load file.  Unrecoginzed TGA image type.");
-		return FALSE;
+		return false;
 	}
 
 	// discard the ID field, if any
@@ -266,8 +266,8 @@ BOOL LLImageTGA::updateData()
 			mColorMap = new U8[ color_map_bytes ];  
 			if (!mColorMap)
 			{
-				LL_ERRS() << "Out of Memory in BOOL LLImageTGA::updateData()" << LL_ENDL;
-				return FALSE;
+				LL_ERRS() << "Out of Memory in bool LLImageTGA::updateData()" << LL_ENDL;
+				return false;
 			}
 			memcpy( mColorMap, getData() + mDataOffset, color_map_bytes );	/* Flawfinder: ignore */
 		}
@@ -302,28 +302,28 @@ BOOL LLImageTGA::updateData()
 //		if( mAttributeBits != 8 )
 //		{
 //			setLastError("Unable to load file. 32 bit TGA image does not have 8 bits of alpha.");
-//			return FALSE;
+//			return false;
 //		}
 		mAttributeBits = 8;
 		break;
 	case 15:
 	case 16:
 		components = 3;
-		mIs15Bit = TRUE;  // 16th bit is used for Targa hardware interupts and is ignored.
+		mIs15Bit = true;  // 16th bit is used for Targa hardware interupts and is ignored.
 		break;
 	case 8:
 		components = 1;
 		break;
 	default:
 		setLastError("Unable to load file. Unknown pixel size.");
-		return FALSE;
+		return false;
 	}
 	setSize(width, height, components);
 	
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
+bool LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
 {
 	llassert_always(raw_image);
 	
@@ -331,7 +331,7 @@ BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
 	if (!getData() || (0 == getDataSize()))
 	{
 		setLastError("LLImageTGA trying to decode an image with no data!");
-		return FALSE;
+		return false;
 	}
 
 	// Copy everything after the header.
@@ -343,18 +343,18 @@ BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
 		(getComponents() != 4) )
 	{
 		setLastError("TGA images with a number of components other than 1, 3, and 4 are not supported.");
-		return FALSE;
+		return false;
 	}
 
 
 	if( mOriginRightBit )
 	{
 		setLastError("TGA images with origin on right side are not supported.");
-		return FALSE;
+		return false;
 	}
 
-	BOOL flipped = (mOriginTopBit != 0);
-	BOOL rle_compressed = ((mImageType & 0x08) != 0);
+	bool flipped = (mOriginTopBit != 0);
+	bool rle_compressed = ((mImageType & 0x08) != 0);
 
 	if( mColorMap )
 	{
@@ -366,10 +366,10 @@ BOOL LLImageTGA::decode(LLImageRaw* raw_image, F32 decode_time)
 	}
 }
 
-BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
+bool LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, bool rle, bool flipped )
 {
-	BOOL success = FALSE;
-	BOOL alpha_opaque = FALSE;
+	bool success = false;
+	bool alpha_opaque = false;
 	if( rle )
 	{
 
@@ -404,7 +404,7 @@ BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped
 	}
 	else
 	{
-		BOOL alpha_opaque;
+		bool alpha_opaque;
 		success = decodeTruecolorNonRle( raw_image, alpha_opaque );
 		if (alpha_opaque && raw_image->getComponents() == 4)
 		{
@@ -430,9 +430,9 @@ BOOL LLImageTGA::decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped
 }
 
 
-BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaque )
+bool LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, bool &alpha_opaque )
 {
-	alpha_opaque = TRUE;
+	alpha_opaque = true;
 
 	// Origin is the bottom left
 	U8* dst = raw_image->getData();
@@ -442,7 +442,7 @@ BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaqu
 	
 	if (pixels * (mIs15Bit ? 2 : getComponents()) > getDataSize() - mDataOffset)
 	{ //here we have situation when data size in src less than actually needed
-		return FALSE;
+		return false;
 	}
 
 	if (getComponents() == 4)
@@ -456,7 +456,7 @@ BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaqu
 			dst[3] = src[3]; // Alpha
 			if (dst[3] != 255)
 			{
-				alpha_opaque = FALSE;
+				alpha_opaque = false;
 			}
 			dst += 4;
 			src += 4;
@@ -490,7 +490,7 @@ BOOL LLImageTGA::decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaqu
 		memcpy(dst, src, pixels);	/* Flawfinder: ignore */
 	}
 
-	return TRUE;
+	return true;
 }
 
 void LLImageTGA::decodeColorMapPixel8( U8* dst, const U8* src )
@@ -523,14 +523,14 @@ void LLImageTGA::decodeColorMapPixel32( U8* dst, const U8* src )
 }
 
 
-BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
+bool LLImageTGA::decodeColorMap( LLImageRaw* raw_image, bool rle, bool flipped )
 {
 	// If flipped, origin is the top left.  Need to reverse the order of the rows.
 	// Otherwise the origin is the bottom left.
 
 	if( 8 != mPixelSize )
 	{
-		return FALSE;
+		return false;
 	}
 
 	U8* src = getData() + mDataOffset;
@@ -544,7 +544,7 @@ BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
 		case 2:	pixel_decoder = &LLImageTGA::decodeColorMapPixel15; break;
 		case 3:	pixel_decoder = &LLImageTGA::decodeColorMapPixel24; break;
 		case 4:	pixel_decoder = &LLImageTGA::decodeColorMapPixel32; break;
-		default: llassert(0); return FALSE;
+		default: llassert(0); return false;
 	}
 
 	if( rle )
@@ -613,12 +613,12 @@ BOOL LLImageTGA::decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped )
 		}
 	}
 
-	return TRUE;
+	return true;
 }
 
 
 
-BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
+bool LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
 {
 	llassert_always(raw_image);
 	
@@ -642,7 +642,7 @@ BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
 		mImageType = 2;		
 		break;
 	default:
-		return FALSE;
+		return false;
 	}
 
 	// Color map stuff (unsupported)
@@ -678,7 +678,7 @@ BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
 		bytes_per_pixel = 4;		
 		break;
 	default:
-		return FALSE;
+		return false;
 	}
 	mPixelSize = U8(bytes_per_pixel * 8);		// 8, 16, 24, 32 bits per pixel
 
@@ -765,13 +765,13 @@ BOOL LLImageTGA::encode(const LLImageRaw* raw_image, F32 encode_time)
 		break;
 	}
 	
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque )
+bool LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, bool &alpha_opaque )
 {
 	llassert( getComponents() == 4 );
-	alpha_opaque = TRUE;
+	alpha_opaque = true;
 
 	U8* dst = raw_image->getData();
 	U32* dst_pixels = (U32*) dst;
@@ -788,7 +788,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
 		// Read RLE block header
 		
 		if (src >= last_src)
-			return FALSE;
+			return false;
 
 		U8 block_header_byte = *src;
 		src++;
@@ -799,7 +799,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
 			// Encoded (duplicate-pixel) block
 
 			if (src + 3 >= last_src)
-				return FALSE;
+				return false;
 			
 			rgba_byte_p[0] = src[2];
 			rgba_byte_p[1] = src[1];
@@ -807,7 +807,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
 			rgba_byte_p[3] = src[3];
 			if (rgba_byte_p[3] != 255)
 			{
-				alpha_opaque = FALSE;
+				alpha_opaque = false;
 			}
 
 			src += 4;
@@ -826,7 +826,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
 			do
 			{
 				if (src + 3 >= last_src)
-					return FALSE;
+					return false;
 				
 				((U8*)dst_pixels)[0] = src[2];
 				((U8*)dst_pixels)[1] = src[1];
@@ -834,7 +834,7 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
 				((U8*)dst_pixels)[3] = src[3];
 				if (src[3] != 255)
 				{
-					alpha_opaque = FALSE;
+					alpha_opaque = false;
 				}
 				src += 4;
 				dst_pixels++;
@@ -844,10 +844,10 @@ BOOL LLImageTGA::decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque
 		}
 	}
 
-	return TRUE; 
+	return true; 
 }
 
-BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
+bool LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
 {
 	llassert( getComponents() == 3 );
 	llassert( mIs15Bit );
@@ -863,7 +863,7 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
 		// Read RLE block header
 
 		if (src >= last_src)
-			return FALSE;
+			return false;
 
 		U8 block_header_byte = *src;
 		src++;
@@ -875,7 +875,7 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
 			do
 			{
 				if (src + 2 >= last_src)
-					return FALSE;
+					return false;
 				
 				decodeTruecolorPixel15( dst, src );   // slow
 				dst += 3;
@@ -890,7 +890,7 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
 			do
 			{
 				if (src + 2 >= last_src)
-					return FALSE;
+					return false;
 
 				decodeTruecolorPixel15( dst, src );
 				dst += 3;
@@ -901,12 +901,12 @@ BOOL LLImageTGA::decodeTruecolorRle15( LLImageRaw* raw_image )
 		}
 	}
 
-	return TRUE;
+	return true;
 }
 
 
 
-BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
+bool LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
 {
 	llassert( getComponents() == 3 );
 
@@ -921,7 +921,7 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
 		// Read RLE block header
 
 		if (src >= last_src)
-			return FALSE;
+			return false;
 	
 		U8 block_header_byte = *src;
 		src++;
@@ -933,7 +933,7 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
 			do
 			{
 				if (src + 2 >= last_src)
-					return FALSE;
+					return false;
 				dst[0] = src[2];
 				dst[1] = src[1];
 				dst[2] = src[0];
@@ -949,7 +949,7 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
 			do
 			{
 				if (src + 2 >= last_src)
-					return FALSE;
+					return false;
 				
 				dst[0] = src[2];
 				dst[1] = src[1];
@@ -962,11 +962,11 @@ BOOL LLImageTGA::decodeTruecolorRle24( LLImageRaw* raw_image )
 		}
 	}
 
-	return TRUE;
+	return true;
 }
 
 
-BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
+bool LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
 {
 	llassert( getComponents() == 1 );
 
@@ -981,7 +981,7 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
 		// Read RLE block header
 
 		if (src >= last_src)
-			return FALSE;
+			return false;
 
 		U8 block_header_byte = *src;
 		src++;
@@ -990,7 +990,7 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
 		if( block_header_byte & 0x80 )
 		{
 			if (src >= last_src)
-				return FALSE;
+				return false;
 			
 			// Encoded (duplicate-pixel) block
 			memset( dst, *src, block_pixel_count );
@@ -1003,7 +1003,7 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
 			do
 			{
 				if (src >= last_src)
-					return FALSE;
+					return false;
 				
 				*dst = *src;
 				dst++;
@@ -1014,13 +1014,13 @@ BOOL LLImageTGA::decodeTruecolorRle8( LLImageRaw* raw_image )
 		}
 	}
 
-	return TRUE;
+	return true;
 }
 
 
 // Decoded and process the image for use in avatar gradient masks.
 // Processing happens during the decode for speed.
-BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight )
+bool LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight )
 {
 	llassert_always(raw_image);
 	
@@ -1043,14 +1043,14 @@ BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight
 	if (!getData() || (0 == getDataSize()))
 	{
 		setLastError("LLImageTGA trying to decode an image with no data!");
-		return FALSE;
+		return false;
 	}
 
 	// Only works for unflipped monochrome RLE images
 	if( (getComponents() != 1) || (mImageType != 11) || mOriginTopBit || mOriginRightBit ) 
 	{
 		LL_ERRS() << "LLImageTGA trying to alpha-gradient process an image that's not a standard RLE, one component image" << LL_ENDL;
-		return FALSE;
+		return false;
 	}
 
 	raw_image->resize(getWidth(), getHeight(), getComponents());
@@ -1136,7 +1136,7 @@ BOOL LLImageTGA::decodeAndProcess( LLImageRaw* raw_image, F32 domain, F32 weight
 			}
 		}
 	}
-	return TRUE;
+	return true;
 }
 
 // Reads a .tga file and creates an LLImageTGA with its data.
diff --git a/indra/llimage/llimagetga.h b/indra/llimage/llimagetga.h
index 5da3525149b37a016f52deb0c0e854d8c0ca05b0..b1f34dcdaddf1f90e974fe6d3579021f49d02afb 100644
--- a/indra/llimage/llimagetga.h
+++ b/indra/llimage/llimagetga.h
@@ -41,25 +41,25 @@ class LLImageTGA : public LLImageFormatted
 	LLImageTGA(const std::string& file_name);
 
 	/*virtual*/ std::string getExtension() { return std::string("tga"); }
-	/*virtual*/ BOOL updateData();
-	/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time=0.0);
-	/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time=0.0);
+	/*virtual*/ bool updateData();
+	/*virtual*/ bool decode(LLImageRaw* raw_image, F32 decode_time=0.0);
+	/*virtual*/ bool encode(const LLImageRaw* raw_image, F32 encode_time=0.0);
 
-	BOOL			 decodeAndProcess(LLImageRaw* raw_image, F32 domain, F32 weight);
+	bool			 decodeAndProcess(LLImageRaw* raw_image, F32 domain, F32 weight);
 	
 private:
-	BOOL			 decodeTruecolor( LLImageRaw* raw_image, BOOL rle, BOOL flipped );
+	bool			 decodeTruecolor( LLImageRaw* raw_image, bool rle, bool flipped );
 
-	BOOL			 decodeTruecolorRle8( LLImageRaw* raw_image );
-	BOOL			 decodeTruecolorRle15( LLImageRaw* raw_image );
-	BOOL			 decodeTruecolorRle24( LLImageRaw* raw_image );
-	BOOL			 decodeTruecolorRle32( LLImageRaw* raw_image, BOOL &alpha_opaque );
+	bool			 decodeTruecolorRle8( LLImageRaw* raw_image );
+	bool			 decodeTruecolorRle15( LLImageRaw* raw_image );
+	bool			 decodeTruecolorRle24( LLImageRaw* raw_image );
+	bool			 decodeTruecolorRle32( LLImageRaw* raw_image, bool &alpha_opaque );
 
 	void			 decodeTruecolorPixel15( U8* dst, const U8* src );
 
-	BOOL			 decodeTruecolorNonRle( LLImageRaw* raw_image, BOOL &alpha_opaque );
+	bool			 decodeTruecolorNonRle( LLImageRaw* raw_image, bool &alpha_opaque );
 	
-	BOOL			 decodeColorMap( LLImageRaw* raw_image, BOOL rle, BOOL flipped );
+	bool			 decodeColorMap( LLImageRaw* raw_image, bool rle, bool flipped );
 
 	void			 decodeColorMapPixel8(U8* dst, const U8* src);
 	void			 decodeColorMapPixel15(U8* dst, const U8* src);
@@ -100,7 +100,7 @@ class LLImageTGA : public LLImageFormatted
 	S32		mColorMapLength; 
 	S32		mColorMapBytesPerEntry;
 
-	BOOL	mIs15Bit;
+	bool	mIs15Bit;
 
 	static const U8 s5to8bits[32];
 };
diff --git a/indra/llimagej2coj/llimagej2coj.cpp b/indra/llimagej2coj/llimagej2coj.cpp
index e98f677d9b3753a57a274ddecb07dca95dd29b00..3bb1778d9d13e5912ceff5db5f0ba024a205e304 100644
--- a/indra/llimagej2coj/llimagej2coj.cpp
+++ b/indra/llimagej2coj/llimagej2coj.cpp
@@ -33,23 +33,16 @@
 #include "lltimer.h"
 //#include "llmemory.h"
 
-const char* fallbackEngineInfoLLImageJ2CImpl()
-{
-	static std::string version_string =
-		std::string("OpenJPEG: " OPENJPEG_VERSION ", Runtime: ")
-		+ opj_version();
-	return version_string.c_str();
-}
-
+// Factory function: see declaration in llimagej2c.cpp
 LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
 {
 	return new LLImageJ2COJ();
 }
 
-void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl)
+std::string LLImageJ2COJ::getEngineInfo() const
 {
-	delete impl;
-	impl = NULL;
+	return std::string("OpenJPEG: " OPENJPEG_VERSION ", Runtime: ")
+		+ opj_version();
 }
 
 // Return string from message, eliminating final \n if present
@@ -107,19 +100,19 @@ LLImageJ2COJ::~LLImageJ2COJ()
 {
 }
 
-BOOL LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
+bool LLImageJ2COJ::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
 {
 	// No specific implementation for this method in the OpenJpeg case
-	return FALSE;
+	return false;
 }
 
-BOOL LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+bool LLImageJ2COJ::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
 {
 	// No specific implementation for this method in the OpenJpeg case
-	return FALSE;
+	return false;
 }
 
-BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
+bool LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
 {
 	//
 	// FIXME: Get the comment field out of the texture
@@ -186,7 +179,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 			opj_image_destroy(image);
 		}
 
-		return TRUE; // done
+		return true; // done
 	}
 
 	// sometimes we get bad data out of the cache - check to see if the decode succeeded
@@ -196,8 +189,8 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 		{
 			// if we didn't get the discard level we're expecting, fail
 			opj_image_destroy(image);
-			base.mDecoding = FALSE;
-			return TRUE;
+			base.mDecoding = false;
+			return true;
 		}
 	}
 	
@@ -209,7 +202,7 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 			opj_image_destroy(image);
 		}
 			
-		return TRUE;
+		return true;
 	}
 
 	// Copy image data into our raw image format (instead of the separate channel format
@@ -256,18 +249,18 @@ BOOL LLImageJ2COJ::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decod
 			LL_DEBUGS("Texture") << "ERROR -> decodeImpl: failed to decode image! (NULL comp data - OpenJPEG bug)" << LL_ENDL;
 			opj_image_destroy(image);
 
-			return TRUE; // done
+			return true; // done
 		}
 	}
 
 	/* free image data structure */
 	opj_image_destroy(image);
 
-	return TRUE; // done
+	return true; // done
 }
 
 
-BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible)
+bool LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, bool reversible)
 {
 	const S32 MAX_COMPS = 5;
 	opj_cparameters_t parameters;	/* compression parameters */
@@ -388,7 +381,7 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
 	{
 		opj_cio_close(cio);
 		LL_DEBUGS("Texture") << "Failed to encode image." << LL_ENDL;
-		return FALSE;
+		return false;
 	}
 	codestream_length = cio_tell(cio);
 
@@ -407,10 +400,10 @@ BOOL LLImageJ2COJ::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, con
 
 	/* free image data */
 	opj_image_destroy(image);
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
+bool LLImageJ2COJ::getMetadata(LLImageJ2C &base)
 {
 	//
 	// FIXME: We get metadata by decoding the ENTIRE image.
@@ -473,7 +466,7 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
 	if(!image)
 	{
 		LL_WARNS() << "ERROR -> getMetadata: failed to decode image!" << LL_ENDL;
-		return FALSE;
+		return false;
 	}
 
 	// Copy image data into our raw image format (instead of the separate channel format
@@ -487,5 +480,5 @@ BOOL LLImageJ2COJ::getMetadata(LLImageJ2C &base)
 
 	/* free image data structure */
 	opj_image_destroy(image);
-	return TRUE;
+	return true;
 }
diff --git a/indra/llimagej2coj/llimagej2coj.h b/indra/llimagej2coj/llimagej2coj.h
index 40ad4edb00fef16f726be93416fef5d216f4719a..5c6193944e3222a062090e06fec90b458dcee6a8 100644
--- a/indra/llimagej2coj/llimagej2coj.h
+++ b/indra/llimagej2coj/llimagej2coj.h
@@ -35,12 +35,13 @@ class LLImageJ2COJ : public LLImageJ2CImpl
 	LLImageJ2COJ();
 	virtual ~LLImageJ2COJ();
 protected:
-	/*virtual*/ BOOL getMetadata(LLImageJ2C &base);
-	/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
-	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
-								BOOL reversible = FALSE);
-	/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
-	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
+	virtual bool getMetadata(LLImageJ2C &base);
+	virtual bool decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
+	virtual bool encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
+								bool reversible = false);
+	virtual bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
+	virtual bool initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
+    virtual std::string getEngineInfo() const;
 };
 
 #endif
diff --git a/indra/llkdu/llimagej2ckdu.cpp b/indra/llkdu/llimagej2ckdu.cpp
index 282c859e9e79c6ba702992005446443745568c9b..9347e51b85d2229c1c701cb67b08936ce496a336 100644
--- a/indra/llkdu/llimagej2ckdu.cpp
+++ b/indra/llkdu/llimagej2ckdu.cpp
@@ -72,37 +72,15 @@ class kdc_flow_control {
 //
 void set_default_colour_weights(kdu_params *siz);
 
-const char* engineInfoLLImageJ2CKDU()
-{
-	static std::string version = llformat("KDU %s", KDU_CORE_VERSION);
-	return version.c_str();
-}
-
-LLImageJ2CKDU* createLLImageJ2CKDU()
-{
-	return new LLImageJ2CKDU();
-}
-
-void destroyLLImageJ2CKDU(LLImageJ2CKDU* kdu)
-{
-	delete kdu;
-	kdu = NULL;
-}
-
+// Factory function: see declaration in llimagej2c.cpp
 LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl()
 {
 	return new LLImageJ2CKDU();
 }
 
-void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl)
-{
-	delete impl;
-	impl = NULL;
-}
-
-const char* fallbackEngineInfoLLImageJ2CImpl()
+std::string LLImageJ2CKDU::getEngineInfo() const
 {
-	return engineInfoLLImageJ2CKDU();
+	return llformat("KDU %s", KDU_CORE_VERSION);
 }
 
 class LLKDUDecodeState
@@ -110,11 +88,11 @@ class LLKDUDecodeState
 public:
 	LLKDUDecodeState(kdu_tile tile, kdu_byte *buf, S32 row_gap);
 	~LLKDUDecodeState();
-	BOOL processTileDecode(F32 decode_time, BOOL limit_time = TRUE);
+	bool processTileDecode(F32 decode_time, bool limit_time = true);
 
 private:
 	S32 mNumComponents;
-	BOOL mUseYCC;
+	bool mUseYCC;
 	kdu_dims mDims;
 	kdu_sample_allocator mAllocator;
 	kdu_tile_comp mComps[4];
@@ -128,74 +106,85 @@ class LLKDUDecodeState
 	S32 mRowGap;
 };
 
-void ll_kdu_error( void )
-{
-	// *FIX: This exception is bad, bad, bad. It gets thrown from a
-	// destructor which can lead to immediate program termination!
-	throw "ll_kdu_error() throwing an exception";
-}
-
 // Stuff for new kdu error handling
-class LLKDUMessageWarning : public kdu_message
+class LLKDUMessage: public kdu_message
 {
 public:
-	/*virtual*/ void put_text(const char *s);
-	/*virtual*/ void put_text(const kdu_uint16 *s);
+	LLKDUMessage(const std::string& type):
+		mType(type)
+	{}
 
-	static LLKDUMessageWarning sDefaultMessage;
-};
-
-class LLKDUMessageError : public kdu_message
-{
-public:
-	/*virtual*/ void put_text(const char *s);
-	/*virtual*/ void put_text(const kdu_uint16 *s);
-	/*virtual*/ void flush(bool end_of_message = false);
-	static LLKDUMessageError sDefaultMessage;
-};
-
-void LLKDUMessageWarning::put_text(const char *s)
-{
-	LL_INFOS() << "KDU Warning: " << s << LL_ENDL;
-}
+	virtual void put_text(const char *s)
+	{
+		LL_INFOS() << "KDU " << mType << ": " << s << LL_ENDL;
+	}
 
-void LLKDUMessageWarning::put_text(const kdu_uint16 *s)
-{
-	LL_INFOS() << "KDU Warning: " << s << LL_ENDL;
-}
+	virtual void put_text(const kdu_uint16 *s)
+	{
+		// The previous implementation simply streamed 's' to the log. So
+		// either this put_text() override was never called -- or it produced
+		// some baffling log messages -- because I assert that streaming a
+		// const kdu_uint16* to a std::ostream will display only the hex value
+		// of the pointer.
+		LL_INFOS() << "KDU " << mType << ": "
+				   << utf16str_to_utf8str(llutf16string(s)) << LL_ENDL;
+	}
 
-void LLKDUMessageError::put_text(const char *s)
-{
-	LL_INFOS() << "KDU Error: " << s << LL_ENDL;
-}
+private:
+	std::string mType;
+};
 
-void LLKDUMessageError::put_text(const kdu_uint16 *s)
+struct LLKDUMessageWarning : public LLKDUMessage
 {
-	LL_INFOS() << "KDU Error: " << s << LL_ENDL;
-}
+	LLKDUMessageWarning():
+		LLKDUMessage("Warning")
+	{
+		kdu_customize_warnings(this);
+	}
+};
+// Instantiating LLKDUMessageWarning calls kdu_customize_warnings() with the
+// new instance. Make it static so this only happens once.
+static LLKDUMessageWarning sWarningHandler;
 
-void LLKDUMessageError::flush(bool end_of_message)
+struct LLKDUMessageError : public LLKDUMessage
 {
-	if (end_of_message) 
+	LLKDUMessageError():
+		LLKDUMessage("Error")
 	{
-		throw "KDU throwing an exception";
+		kdu_customize_errors(this);
 	}
-}
 
-LLKDUMessageWarning LLKDUMessageWarning::sDefaultMessage;
-LLKDUMessageError	LLKDUMessageError::sDefaultMessage;
-static bool kdu_message_initialized = false;
+	virtual void flush(bool end_of_message = false)
+	{
+		// According to the documentation nat found:
+		// http://pirlwww.lpl.arizona.edu/resources/guide/software/Kakadu/html_pages/globals__kdu$mize_errors.html
+		// "If a kdu_error object is destroyed, handler→flush will be called with
+		// an end_of_message argument equal to true and the process will
+		// subsequently be terminated through exit. The termination may be
+		// avoided, however, by throwing an exception from within the message
+		// terminating handler→flush call."
+		// So throwing an exception here isn't arbitrary: we MUST throw an
+		// exception if we want to recover from a KDU error.
+		if (end_of_message) 
+		{
+			throw "KDU throwing an exception";
+		}
+	}
+};
+// Instantiating LLKDUMessageError calls kdu_customize_errors() with the new
+// instance. Make it static so this only happens once.
+static LLKDUMessageError sErrorHandler;
 
 LLImageJ2CKDU::LLImageJ2CKDU() : LLImageJ2CImpl(),
-mInputp(NULL),
-mCodeStreamp(NULL),
-mTPosp(NULL),
-mTileIndicesp(NULL),
-mRawImagep(NULL),
-mDecodeState(NULL),
-mBlocksSize(-1),
-mPrecinctsSize(-1),
-mLevels(0)
+	mInputp(),
+	mCodeStreamp(),
+	mTPosp(),
+	mTileIndicesp(),
+	mRawImagep(NULL),
+	mDecodeState(),
+	mBlocksSize(-1),
+	mPrecinctsSize(-1),
+	mLevels(0)
 {
 }
 
@@ -207,7 +196,7 @@ LLImageJ2CKDU::~LLImageJ2CKDU()
 // Stuff for new simple decode
 void transfer_bytes(kdu_byte *dest, kdu_line_buf &src, int gap, int precision);
 
-void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode)
+void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECodeStreamMode mode)
 {
 	S32 data_size = base.getDataSize();
 	S32 max_bytes = (base.getMaxBytes() ? base.getMaxBytes() : data_size);
@@ -215,38 +204,27 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod
 	//
 	//  Initialization
 	//
-	if (!kdu_message_initialized)
-	{
-		kdu_message_initialized = true;
-		kdu_customize_errors(&LLKDUMessageError::sDefaultMessage);
-		kdu_customize_warnings(&LLKDUMessageWarning::sDefaultMessage);
-	}
-
-	if (mCodeStreamp)
-	{
-		mCodeStreamp->destroy();
-		delete mCodeStreamp;
-		mCodeStreamp = NULL;
-	}
+	mCodeStreamp.reset();
 
 	if (!mInputp && base.getData())
 	{
 		// The compressed data has been loaded
 		// Setup the source for the codestream
-		mInputp = new LLKDUMemSource(base.getData(), data_size);
+		mInputp.reset(new LLKDUMemSource(base.getData(), data_size));
 	}
 
 	if (mInputp)
 	{
+		// This is LLKDUMemSource::reset(), not boost::scoped_ptr::reset().
 		mInputp->reset();
 	}
-	mCodeStreamp = new kdu_codestream;
 
-	mCodeStreamp->create(mInputp);
+	mCodeStreamp->create(mInputp.get());
 
 	// Set the maximum number of bytes to use from the codestream
-	// *TODO: This seems to be wrong. The base class should have no idea of how j2c compression works so no
-	// good way of computing what's the byte range to be used.
+	// *TODO: This seems to be wrong. The base class should have no idea of
+	// how j2c compression works so no good way of computing what's the byte
+	// range to be used.
 	mCodeStreamp->set_max_bytes(max_bytes,true);
 
 	//	If you want to flip or rotate the image for some reason, change
@@ -303,42 +281,26 @@ void LLImageJ2CKDU::setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECod
 	
 	if (!keep_codestream)
 	{
-		mCodeStreamp->destroy();
-		delete mCodeStreamp;
-		mCodeStreamp = NULL;
-		delete mInputp;
-		mInputp = NULL;
+		mCodeStreamp.reset();
+		mInputp.reset();
 	}
 }
 
 void LLImageJ2CKDU::cleanupCodeStream()
 {
-	delete mInputp;
-	mInputp = NULL;
-
-	delete mDecodeState;
-	mDecodeState = NULL;
-
-	if (mCodeStreamp)
-	{
-		mCodeStreamp->destroy();
-		delete mCodeStreamp;
-		mCodeStreamp = NULL;
-	}
-
-	delete mTPosp;
-	mTPosp = NULL;
-
-	delete mTileIndicesp;
-	mTileIndicesp = NULL;
+	mInputp.reset();
+	mDecodeState.reset();
+	mCodeStreamp.reset();
+	mTPosp.reset();
+	mTileIndicesp.reset();
 }
 
-BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
+bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level, int* region)
 {
 	return initDecode(base,raw_image,0.0f,MODE_FAST,0,4,discard_level,region);
 }
 
-BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
+bool LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size, int precincts_size, int levels)
 {
 	mPrecinctsSize = precincts_size;
 	if (mPrecinctsSize != -1)
@@ -362,10 +324,10 @@ BOOL LLImageJ2CKDU::initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int bloc
 		mLevels = llclamp(mLevels,MIN_DECOMPOSITION_LEVELS,MAX_DECOMPOSITION_LEVELS);
 		base.setLevels(mLevels);
 	}
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
+bool LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level, int* region)
 {
 	base.resetLastError();
 
@@ -377,7 +339,7 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 		//findDiscardLevelsBoundaries(base);
 
 		base.updateRawDiscardLevel();
-		setupCodeStream(base, TRUE, mode);
+		setupCodeStream(base, true, mode);
 
 		mRawImagep = &raw_image;
 		mCodeStreamp->change_appearance(false, true, false);
@@ -412,12 +374,12 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 
 		if (!mTileIndicesp)
 		{
-			mTileIndicesp = new kdu_dims;
+			mTileIndicesp.reset(new kdu_dims);
 		}
 		mCodeStreamp->get_valid_tiles(*mTileIndicesp);
 		if (!mTPosp)
 		{
-			mTPosp = new kdu_coords;
+			mTPosp.reset(new kdu_coords);
 			mTPosp->y = 0;
 			mTPosp->x = 0;
 		}
@@ -425,32 +387,32 @@ BOOL LLImageJ2CKDU::initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 	catch (const char* msg)
 	{
 		base.setLastError(ll_safe_string(msg));
-		return FALSE;
+		return false;
 	}
 	catch (...)
 	{
 		base.setLastError("Unknown J2C error");
-		return FALSE;
+		return false;
 	}
 
-	return TRUE;
+	return true;
 }
 
 
-// Returns TRUE to mean done, whether successful or not.
-BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
+// Returns true to mean done, whether successful or not.
+bool LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
 {
 	ECodeStreamMode mode = MODE_FAST;
 
 	LLTimer decode_timer;
 
-	if (!mCodeStreamp)
+	if (!mCodeStreamp->exists())
 	{
 		if (!initDecode(base, raw_image, decode_time, mode, first_channel, max_channel_count))
 		{
 			// Initializing the J2C decode failed, bail out.
 			cleanupCodeStream();
-			return TRUE; // done
+			return true; // done
 		}
 	}
 
@@ -460,6 +422,13 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 
 	// Now we are ready to walk through the tiles processing them one-by-one.
 	kdu_byte *buffer = raw_image.getData();
+	if (!buffer)
+	{
+		base.setLastError("Memory error");
+		base.decodeFailed();
+		cleanupCodeStream();
+		return true; // done
+	}
 
 	while (mTPosp->y < mTileIndicesp->size.y)
 	{
@@ -495,21 +464,20 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 					kdu_coords offset = tile_dims.pos - dims.pos;
 					int row_gap = channels*dims.size.x; // inter-row separation
 					kdu_byte *buf = buffer + offset.y*row_gap + offset.x*channels;
-					mDecodeState = new LLKDUDecodeState(tile, buf, row_gap);
+					mDecodeState.reset(new LLKDUDecodeState(tile, buf, row_gap));
 				}
 				// Do the actual processing
 				F32 remaining_time = decode_time - decode_timer.getElapsedTimeF32();
 				// This is where we do the actual decode.  If we run out of time, return false.
 				if (mDecodeState->processTileDecode(remaining_time, (decode_time > 0.0f)))
 				{
-					delete mDecodeState;
-					mDecodeState = NULL;
+					mDecodeState.reset();
 				}
 				else
 				{
 					// Not finished decoding yet.
 					//					setLastError("Ran out of time while decoding");
-					return FALSE;
+					return false;
 				}
 			}
 			catch (const char* msg)
@@ -517,14 +485,14 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 				base.setLastError(ll_safe_string(msg));
 				base.decodeFailed();
 				cleanupCodeStream();
-				return TRUE; // done
+				return true; // done
 			}
 			catch (...)
 			{
 				base.setLastError( "Unknown J2C error" );
 				base.decodeFailed();
 				cleanupCodeStream();
-				return TRUE; // done
+				return true; // done
 			}
 
 
@@ -536,11 +504,11 @@ BOOL LLImageJ2CKDU::decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 deco
 
 	cleanupCodeStream();
 
-	return TRUE;
+	return true;
 }
 
 
-BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, BOOL reversible)
+bool LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time, bool reversible)
 {
 	// Declare and set simple arguments
 	bool transpose = false;
@@ -708,36 +676,36 @@ BOOL LLImageJ2CKDU::encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, co
 	catch(const char* msg)
 	{
 		base.setLastError(ll_safe_string(msg));
-		return FALSE;
+		return false;
 	}
 	catch( ... )
 	{
 		base.setLastError( "Unknown J2C error" );
-		return FALSE;
+		return false;
 	}
 
-	return TRUE;
+	return true;
 }
 
-BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
+bool LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
 {
 	// *FIX: kdu calls our callback function if there's an error, and
 	// then bombs. To regain control, we throw an exception, and
 	// catch it here.
 	try
 	{
-		setupCodeStream(base, FALSE, MODE_FAST);
-		return TRUE;
+		setupCodeStream(base, false, MODE_FAST);
+		return true;
 	}
 	catch (const char* msg)
 	{
 		base.setLastError(ll_safe_string(msg));
-		return FALSE;
+		return false;
 	}
 	catch (...)
 	{
 		base.setLastError( "Unknown J2C error" );
-		return FALSE;
+		return false;
 	}
 }
 
@@ -745,6 +713,8 @@ BOOL LLImageJ2CKDU::getMetadata(LLImageJ2C &base)
 /* STATIC                        copy_block                                  */
 /*****************************************************************************/
 
+/*==========================================================================*|
+// Only called by copy_tile(), which is itself commented out
 static void copy_block(kdu_block *in, kdu_block *out)
 {
 	if (in->K_max_prime != out->K_max_prime)
@@ -773,11 +743,14 @@ static void copy_block(kdu_block *in, kdu_block *out)
 		out->set_max_bytes(num_bytes,false);
 	memcpy(out->byte_buffer,in->byte_buffer,(size_t) num_bytes);
 }
+|*==========================================================================*/
 
 /*****************************************************************************/
 /* STATIC                        copy_tile                                   */
 /*****************************************************************************/
 
+/*==========================================================================*|
+// Only called by findDiscardLevelsBoundaries(), which is itself commented out
 static void
 copy_tile(kdu_tile tile_in, kdu_tile tile_out, int tnum_in, int tnum_out,
 		  kdu_params *siz_in, kdu_params *siz_out, int skip_components,
@@ -834,10 +807,13 @@ copy_tile(kdu_tile tile_in, kdu_tile tile_out, int tnum_in, int tnum_out,
         }
     }
 }
+|*==========================================================================*/
 
 // Find the block boundary for each discard level in the input image.
 // We parse the input blocks and copy them in a temporary output stream.
 // For the moment, we do nothing more that parsing the raw list of blocks and outputing result.
+/*==========================================================================*|
+// See comments in header file for why this is commented out.
 void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
 {
 	// We need the number of levels in that image before starting.
@@ -847,7 +823,7 @@ void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
 	{
 		//std::cout << "Parsing discard level = " << discard_level << std::endl;
 		// Create the input codestream object.
-		setupCodeStream(base, TRUE, MODE_FAST);
+		setupCodeStream(base, true, MODE_FAST);
 		mCodeStreamp->apply_input_restrictions(0, 4, discard_level, 0, NULL);
 		mCodeStreamp->set_max_bytes(KDU_LONG_MAX,true);
 		siz_params *siz_in = mCodeStreamp->access_siz();
@@ -941,6 +917,7 @@ void LLImageJ2CKDU::findDiscardLevelsBoundaries(LLImageJ2C &base)
 	}
 	return;
 }
+|*==========================================================================*/
 
 void set_default_colour_weights(kdu_params *siz)
 {
@@ -1206,7 +1183,7 @@ LLKDUDecodeState::~LLKDUDecodeState()
 	mTile.close();
 }
 
-BOOL LLKDUDecodeState::processTileDecode(F32 decode_time, BOOL limit_time)
+bool LLKDUDecodeState::processTileDecode(F32 decode_time, bool limit_time)
 /* Decompresses a tile, writing the data into the supplied byte buffer.
 The buffer contains interleaved image components, if there are any.
 Although you may think of the buffer as belonging entirely to this tile,
@@ -1238,11 +1215,11 @@ separation between consecutive rows in the real buffer. */
 		{
 			if (limit_time && decode_timer.getElapsedTimeF32() > decode_time)
 			{
-				return FALSE;
+				return false;
 			}
 		}
 	}
-	return TRUE;
+	return true;
 }
 
 // kdc_flow_control 
diff --git a/indra/llkdu/llimagej2ckdu.h b/indra/llkdu/llimagej2ckdu.h
index 02281152bf6e82abc992cfa83917bc64904bea61..7d234435a48058ff75777fe9e65881180be89dd5 100644
--- a/indra/llkdu/llimagej2ckdu.h
+++ b/indra/llkdu/llimagej2ckdu.h
@@ -48,6 +48,8 @@
 #endif
 
 #include "kdu_sample_processing.h"
+#include <boost/scoped_ptr.hpp>
+#include <boost/noncopyable.hpp>
 
 class LLKDUDecodeState;
 class LLKDUMemSource;
@@ -65,43 +67,70 @@ class LLImageJ2CKDU : public LLImageJ2CImpl
 	virtual ~LLImageJ2CKDU();
 	
 protected:
-	/*virtual*/ BOOL getMetadata(LLImageJ2C &base);
-	/*virtual*/ BOOL decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
-	/*virtual*/ BOOL encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
-								BOOL reversible=FALSE);
-	/*virtual*/ BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
-	/*virtual*/ BOOL initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
-	void findDiscardLevelsBoundaries(LLImageJ2C &base);
+	virtual bool getMetadata(LLImageJ2C &base);
+	virtual bool decodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count);
+	virtual bool encodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text, F32 encode_time=0.0,
+								bool reversible=false);
+	virtual bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, int discard_level = -1, int* region = NULL);
+	virtual bool initEncode(LLImageJ2C &base, LLImageRaw &raw_image, int blocks_size = -1, int precincts_size = -1, int levels = 0);
+	virtual std::string getEngineInfo() const;
 
 private:
-	BOOL initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
-	void setupCodeStream(LLImageJ2C &base, BOOL keep_codestream, ECodeStreamMode mode);
+	bool initDecode(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, ECodeStreamMode mode, S32 first_channel, S32 max_channel_count, int discard_level = -1, int* region = NULL);
+	void setupCodeStream(LLImageJ2C &base, bool keep_codestream, ECodeStreamMode mode);
 	void cleanupCodeStream();
 
+	// This method was public, but the only call to it is commented out in our
+	// own initDecode() method. I (nat 2016-08-04) don't know what it does or
+	// why. Even if it should be uncommented, it should probably still be
+	// private.
+//	void findDiscardLevelsBoundaries(LLImageJ2C &base);
+
+	// Helper class to hold a kdu_codestream, which is a handle to the
+	// underlying implementation object. When CodeStreamHolder is reset() or
+	// destroyed, it calls kdu_codestream::destroy() -- which kdu_codestream
+	// itself does not.
+	//
+	// Call through it like a smart pointer using operator->().
+	//
+	// Every RAII class must be noncopyable. For this we don't need move
+	// support.
+	class CodeStreamHolder: public boost::noncopyable
+	{
+	public:
+		~CodeStreamHolder()
+		{
+			reset();
+		}
+
+		void reset()
+		{
+			if (mCodeStream.exists())
+			{
+				mCodeStream.destroy();
+			}
+		}
+
+		kdu_codestream* operator->() { return &mCodeStream; }
+
+	private:
+		kdu_codestream mCodeStream;
+	};
+
 	// Encode variable
-	LLKDUMemSource *mInputp;
-	kdu_codestream *mCodeStreamp;
-	kdu_coords *mTPosp; // tile position
-	kdu_dims *mTileIndicesp;
+	boost::scoped_ptr<LLKDUMemSource> mInputp;
+	CodeStreamHolder mCodeStreamp;
+	boost::scoped_ptr<kdu_coords> mTPosp; // tile position
+	boost::scoped_ptr<kdu_dims> mTileIndicesp;
 	int mBlocksSize;
 	int mPrecinctsSize;
 	int mLevels;
 
 	// Temporary variables for in-progress decodes...
+	// We don't own this LLImageRaw. We're simply pointing to an instance
+	// passed into initDecode().
 	LLImageRaw *mRawImagep;
-	LLKDUDecodeState *mDecodeState;
+	boost::scoped_ptr<LLKDUDecodeState> mDecodeState;
 };
 
-#if LL_WINDOWS
-# define LLSYMEXPORT __declspec(dllexport)
-#elif LL_LINUX
-# define LLSYMEXPORT __attribute__ ((visibility("default")))
-#else
-# define LLSYMEXPORT
-#endif
-
-extern "C" LLSYMEXPORT const char* engineInfoLLImageJ2CKDU();
-extern "C" LLSYMEXPORT LLImageJ2CKDU* createLLImageJ2CKDU();
-extern "C" LLSYMEXPORT void destroyLLImageJ2CKDU(LLImageJ2CKDU* kdu);
-
 #endif
diff --git a/indra/llkdu/tests/llimagej2ckdu_test.cpp b/indra/llkdu/tests/llimagej2ckdu_test.cpp
index 0605fad06884edcb89c3c3e789bc659dda8092ae..e8b550baa66eeedc2ed6ae81cf7b597fee8c84b1 100644
--- a/indra/llkdu/tests/llimagej2ckdu_test.cpp
+++ b/indra/llkdu/tests/llimagej2ckdu_test.cpp
@@ -60,7 +60,7 @@ LLImageRaw::~LLImageRaw() { }
 U8* LLImageRaw::allocateData(S32 ) { return NULL; }
 void LLImageRaw::deleteData() { }
 U8* LLImageRaw::reallocateData(S32 ) { return NULL; }
-BOOL LLImageRaw::resize(U16, U16, S8) { return TRUE; } // this method always returns TRUE...
+bool LLImageRaw::resize(U16, U16, S8) { return true; } // this method always returns true...
 
 LLImageBase::LLImageBase()
 : LLTrace::MemTrackable<LLImageBase>("LLImageBase"),
@@ -89,8 +89,8 @@ LLImageFormatted::~LLImageFormatted() { }
 U8* LLImageFormatted::allocateData(S32 ) { return NULL; }
 S32 LLImageFormatted::calcDataSize(S32 ) { return 0; }
 S32 LLImageFormatted::calcDiscardLevelBytes(S32 ) { return 0; }
-BOOL LLImageFormatted::decodeChannels(LLImageRaw*, F32, S32, S32) { return FALSE; }
-BOOL LLImageFormatted::copyData(U8 *, S32) { return TRUE; }  // this method always returns TRUE...
+bool LLImageFormatted::decodeChannels(LLImageRaw*, F32, S32, S32) { return false; }
+bool LLImageFormatted::copyData(U8 *, S32) { return true; }  // this method always returns true...
 void LLImageFormatted::deleteData() { }
 void LLImageFormatted::dump() { }
 U8* LLImageFormatted::reallocateData(S32 ) { return NULL; }
@@ -103,14 +103,14 @@ LLImageJ2C::~LLImageJ2C() { }
 S32 LLImageJ2C::calcDataSize(S32 ) { return 0; }
 S32 LLImageJ2C::calcDiscardLevelBytes(S32 ) { return 0; }
 S32 LLImageJ2C::calcHeaderSize() { return 0; }
-BOOL LLImageJ2C::decode(LLImageRaw*, F32) { return FALSE; }
-BOOL LLImageJ2C::decodeChannels(LLImageRaw*, F32, S32, S32 ) { return FALSE; }
+bool LLImageJ2C::decode(LLImageRaw*, F32) { return false; }
+bool LLImageJ2C::decodeChannels(LLImageRaw*, F32, S32, S32 ) { return false; }
 void LLImageJ2C::decodeFailed() { }
-BOOL LLImageJ2C::encode(const LLImageRaw*, F32) { return FALSE; }
+bool LLImageJ2C::encode(const LLImageRaw*, F32) { return false; }
 S8  LLImageJ2C::getRawDiscardLevel() { return 0; }
 void LLImageJ2C::resetLastError() { }
 void LLImageJ2C::setLastError(const std::string&, const std::string&) { }
-BOOL LLImageJ2C::updateData() { return FALSE; }
+bool LLImageJ2C::updateData() { return false; }
 void LLImageJ2C::updateRawDiscardLevel() { }
 
 LLKDUMemIn::LLKDUMemIn(const U8*, const U32, const U16, const U16, const U8, siz_params*) { }
@@ -212,12 +212,12 @@ namespace tut
 		{
 		public:
 			// Provides public access to some protected methods for testing
-			BOOL callGetMetadata(LLImageJ2C &base) { return getMetadata(base); }
-			BOOL callDecodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
+			bool callGetMetadata(LLImageJ2C &base) { return getMetadata(base); }
+			bool callDecodeImpl(LLImageJ2C &base, LLImageRaw &raw_image, F32 decode_time, S32 first_channel, S32 max_channel_count)
 			{
 				return decodeImpl(base, raw_image, decode_time, first_channel, max_channel_count);
 			}
-			BOOL callEncodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text)
+			bool callEncodeImpl(LLImageJ2C &base, const LLImageRaw &raw_image, const char* comment_text)
 			{
 				return encodeImpl(base, raw_image, comment_text);
 			}
@@ -254,10 +254,10 @@ namespace tut
 	void llimagej2ckdu_object_t::test<1>()
 	{
 		LLImageJ2C* image = new LLImageJ2C();
-		BOOL res = mImage->callGetMetadata(*image);
-		// Trying to set up a data stream with all NIL values and stubbed KDU will "work" and return TRUE
-		// Note that is linking with KDU, that call will throw an exception and fail, returning FALSE
-		ensure("getMetadata() test failed", res == TRUE);
+		bool res = mImage->callGetMetadata(*image);
+		// Trying to set up a data stream with all NIL values and stubbed KDU will "work" and return true
+		// Note that is linking with KDU, that call will throw an exception and fail, returning false
+		ensure("getMetadata() test failed", res);
 	}
 
 	// Test 2 : test decodeImpl()
@@ -266,9 +266,9 @@ namespace tut
 	{
 		LLImageJ2C* image = new LLImageJ2C();
 		LLImageRaw* raw = new LLImageRaw();
-		BOOL res = mImage->callDecodeImpl(*image, *raw, 0.0, 0, 0);
-		// Decoding returns TRUE whenever there's nothing else to do, including if decoding failed, so we'll get TRUE here
-		ensure("decodeImpl() test failed", res == TRUE);
+		bool res = mImage->callDecodeImpl(*image, *raw, 0.0, 0, 0);
+		// Decoding returns true whenever there's nothing else to do, including if decoding failed, so we'll get true here
+		ensure("decodeImpl() test failed", res);
 	}
 
 	// Test 3 : test encodeImpl()
@@ -277,8 +277,8 @@ namespace tut
 	{
 		LLImageJ2C* image = new LLImageJ2C();
 		LLImageRaw* raw = new LLImageRaw();
-		BOOL res = mImage->callEncodeImpl(*image, *raw, NULL);
-		// Encoding returns TRUE unless an exception was raised, so we'll get TRUE here though nothing really was done
-		ensure("encodeImpl() test failed", res == TRUE);
+		bool res = mImage->callEncodeImpl(*image, *raw, NULL);
+		// Encoding returns true unless an exception was raised, so we'll get true here though nothing really was done
+		ensure("encodeImpl() test failed", res);
 	}
 }
diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h
index 4be677a4b0735a38e529a896abce9d0f86137cb6..0f237540969fc8a620717168b76985aaa62a0b10 100644
--- a/indra/llmessage/llassetstorage.h
+++ b/indra/llmessage/llassetstorage.h
@@ -181,6 +181,10 @@ class LLEstateAssetRequest : public LLBaseDownloadRequest
 // Map of known bad assets
 typedef std::map<LLUUID,U64,lluuid_less> toxic_asset_map_t;
 
+// *TODO: these typedefs are passed into the VFS via a legacy C function pointer
+// future project would be to convert these to C++ callables (std::function<>) so that 
+// we can use bind and remove the userData parameter.
+// 
 typedef void (*LLGetAssetCallback)(LLVFS *vfs, const LLUUID &asset_id,
 										 LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status);
 
diff --git a/indra/llmessage/llavatarname.cpp b/indra/llmessage/llavatarname.cpp
index d12f15791002dccfe538177a743890e98fb9fb1b..d2115ee499616aa014cc97bbd0571f011861316b 100644
--- a/indra/llmessage/llavatarname.cpp
+++ b/indra/llmessage/llavatarname.cpp
@@ -166,7 +166,7 @@ void LLAvatarName::setExpires(F64 expires)
 	mExpires = LLFrameTimer::getTotalSeconds() + expires;
 }
 
-std::string LLAvatarName::getCompleteName() const
+std::string LLAvatarName::getCompleteName(bool use_parentheses) const
 {
 	std::string name;
 	if (sUseDisplayNames)
@@ -182,7 +182,14 @@ std::string LLAvatarName::getCompleteName() const
 			name = mDisplayName;
 			if(sUseUsernames)
 			{
-				name += " (" + mUsername + ")";
+				if(use_parentheses)
+				{
+				    name += " (" + mUsername + ")";
+				}
+				else
+				{
+				    name += "  [ " + mUsername + " ]";
+				}
 			}
 		}
 	}
@@ -220,7 +227,7 @@ std::string LLAvatarName::getDisplayName() const
 	}
 }
 
-std::string LLAvatarName::getUserName() const
+std::string LLAvatarName::getUserName(bool lowercase) const
 {
 	std::string name;
 	if (mLegacyLastName.empty() || (mLegacyLastName == "Resident"))
@@ -238,7 +245,15 @@ std::string LLAvatarName::getUserName() const
 	}
 	else
 	{
-		name = mLegacyFirstName + " " + mLegacyLastName;
+		if(lowercase)
+		{
+		    name = mLegacyFirstName + "." + mLegacyLastName;
+		    LLStringUtil::toLower(name);
+		}
+		else
+		{
+		    name = mLegacyFirstName + " " + mLegacyLastName;
+	    }
 	}
 	return name;
 }
diff --git a/indra/llmessage/llavatarname.h b/indra/llmessage/llavatarname.h
index 1cb3ae421f817b2de991b1730bc1b95ee8037d2e..192f43f07c7b24aa0576961d9a81024330a1a620 100644
--- a/indra/llmessage/llavatarname.h
+++ b/indra/llmessage/llavatarname.h
@@ -65,7 +65,7 @@ class LL_COMMON_API LLAvatarName
 	
 	// For normal names, returns "James Linden (james.linden)"
 	// When display names are disabled returns just "James Linden"
-	std::string getCompleteName() const;
+	std::string getCompleteName(bool use_parentheses = true) const;
 	
 	// Returns "James Linden" or "bobsmith123 Resident" for backwards
 	// compatibility with systems like voice and muting
@@ -80,7 +80,7 @@ class LL_COMMON_API LLAvatarName
 	// Returns "James Linden" or "bobsmith123 Resident"
 	// Used where we explicitely prefer or need a non UTF-8 legacy (ASCII) name
 	// Also used for backwards compatibility with systems like voice and muting
-	std::string getUserName() const;
+	std::string getUserName(bool lowercase = false) const;
 	
 	// Returns "james.linden" or the legacy name for very old names
 	std::string getAccountName() const { return mUsername; }
diff --git a/indra/llprimitive/lldaeloader.cpp b/indra/llprimitive/lldaeloader.cpp
index 720986a4110d0c35c023608ca4ec05f65c8e913c..00bde8dbc32a8a4710f7984b3d0347c747855f8d 100644
--- a/indra/llprimitive/lldaeloader.cpp
+++ b/indra/llprimitive/lldaeloader.cpp
@@ -2235,7 +2235,11 @@ std::string LLDAELoader::getElementLabel(daeElement *element)
 		// retrieve index to distinguish items inside same parent
 		size_t ind = 0;
 		parent->getChildren().find(element, ind);
-		index_string = "_" + boost::lexical_cast<std::string>(ind);
+
+		if (ind > 0)
+		{
+			index_string = "_" + boost::lexical_cast<std::string>(ind);
+		}
 
 		// if parent has a name or ID, use it
 		std::string name = parent->getAttribute("name");
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 14f75a2352396258a5f66c6a0b693e1462068c49..1f9869fadc41fd9154c1b2a373c5ff7ffbc704e2 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1326,7 +1326,7 @@ void LLFloater::setMinimized(BOOL minimize)
 		}
 		
 		mMinimized = FALSE;
-
+		setFrontmost();
 		// Reshape *after* setting mMinimized
 		reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
 	}
@@ -1575,6 +1575,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)
 		if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;
 		if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE;
 
+		setFrontmost(TRUE, FALSE);
 		// Otherwise pass to drag handle for movement
 		return mDragHandle->handleMouseDown(x, y, mask);
 	}
@@ -1649,7 +1650,7 @@ void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key)
 	}
 }
 
-void LLFloater::setFrontmost(BOOL take_focus)
+void LLFloater::setFrontmost(BOOL take_focus, BOOL restore)
 {
 	LLMultiFloater* hostp = getHost();
 	if (hostp)
@@ -1665,7 +1666,7 @@ void LLFloater::setFrontmost(BOOL take_focus)
 		LLFloaterView * parent = dynamic_cast<LLFloaterView*>( getParent() );
 		if (parent)
 		{
-			parent->bringToFront(this, take_focus);
+			parent->bringToFront(this, take_focus, restore);
 		}
 
 		// Make sure to set the appropriate transparency type (STORM-732).
@@ -2262,7 +2263,7 @@ void LLFloaterView::reshape(S32 width, S32 height, BOOL called_from_parent)
 	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
 	{
 		LLView* viewp = *child_it;
-		LLFloater* floaterp = (LLFloater*)viewp;
+		LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp);
 		if (floaterp->isDependent())
 		{
 			// dependents are moved with their "dependee"
@@ -2319,8 +2320,11 @@ void LLFloaterView::restoreAll()
 	// make sure all subwindows aren't minimized
 	for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
 	{
-		LLFloater* floaterp = (LLFloater*)*child_it;
-		floaterp->setMinimized(FALSE);
+		LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);
+		if (floaterp)
+		{
+			floaterp->setMinimized(FALSE);
+		}
 	}
 
 	// *FIX: make sure dependents are restored
@@ -2394,7 +2398,7 @@ LLRect LLFloaterView::findNeighboringPosition( LLFloater* reference_floater, LLF
 }
 
 
-void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
+void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore)
 {
 	if (!child)
 		return;
@@ -2478,7 +2482,12 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
 	{
 		sendChildToFront(child);
 	}
-	child->setMinimized(FALSE);
+
+	if(restore)
+	{
+		child->setMinimized(FALSE);
+	}
+
 	if (give_focus && !gFocusMgr.childHasKeyboardFocus(child))
 	{
 		child->setFocus(TRUE);
@@ -2591,7 +2600,7 @@ void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)
 				++child_it) //loop floaters
 			{
 				// Examine minimized children.
-				LLFloater* floater = (LLFloater*)((LLView*)*child_it);
+				LLFloater* floater = dynamic_cast<LLFloater*>(*child_it);
 				if(floater->isMinimized()) 
 				{
 					LLRect r = floater->getRect();
@@ -2644,7 +2653,7 @@ void LLFloaterView::closeAllChildren(bool app_quitting)
 			continue;
 		}
 
-		LLFloater* floaterp = (LLFloater*)viewp;
+		LLFloater* floaterp = dynamic_cast<LLFloater*>(viewp);
 
 		// Attempt to close floater.  This will cause the "do you want to save"
 		// dialogs to appear.
@@ -2710,8 +2719,7 @@ BOOL LLFloaterView::allChildrenClosed()
 	// by setting themselves invisible)
 	for (child_list_const_iter_t it = getChildList()->begin(); it != getChildList()->end(); ++it)
 	{
-		LLView* viewp = *it;
-		LLFloater* floaterp = (LLFloater*)viewp;
+		LLFloater* floaterp = dynamic_cast<LLFloater*>(*it);
 
 		if (floaterp->getVisible() && !floaterp->isDead() && floaterp->isCloseable())
 		{
@@ -2947,7 +2955,7 @@ void LLFloaterView::syncFloaterTabOrder()
 		// otherwise, make sure the focused floater is in the front of the child list
 		for ( child_list_const_reverse_iter_t child_it = getChildList()->rbegin(); child_it != getChildList()->rend(); ++child_it)
 		{
-			LLFloater* floaterp = (LLFloater*)*child_it;
+			LLFloater* floaterp = dynamic_cast<LLFloater*>(*child_it);
 			if (gFocusMgr.childHasKeyboardFocus(floaterp))
 			{
 				bringToFront(floaterp, FALSE);
@@ -2969,7 +2977,7 @@ LLFloater*	LLFloaterView::getParentFloater(LLView* viewp) const
 
 	if (parentp == this)
 	{
-		return (LLFloater*)viewp;
+		return dynamic_cast<LLFloater*>(viewp);
 	}
 
 	return NULL;
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index ef7c6180d25e579d5d828d60d9bae226cdad7cde..165f67499be11baeb175569e05c1c41e32599046 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -310,7 +310,7 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
 	/*virtual*/ void setVisible(BOOL visible); // do not override
 	/*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override
 	
-	void			setFrontmost(BOOL take_focus = TRUE);
+	void			setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE);
      virtual void	setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
 	
 	// Defaults to false.
@@ -547,7 +547,7 @@ class LLFloaterView : public LLUICtrl
 
 	void			setCycleMode(BOOL mode) { mFocusCycleMode = mode; }
 	BOOL			getCycleMode() const { return mFocusCycleMode; }
-	void			bringToFront( LLFloater* child, BOOL give_focus = TRUE );
+	void			bringToFront( LLFloater* child, BOOL give_focus = TRUE, BOOL restore = TRUE );
 	void			highlightFocusedFloater();
 	void			unhighlightFocusedFloater();
 	void			focusFrontFloater();
diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp
index 3282c5f726967d60ae9111c8b376f5b512dfd80c..8166ef6a07ad777efa1387cd7572af1576d3b9a4 100644
--- a/indra/llui/llfolderview.cpp
+++ b/indra/llui/llfolderview.cpp
@@ -1629,9 +1629,9 @@ void LLFolderView::update()
 	if (mNeedsAutoSelect)
 	{
 		LL_RECORD_BLOCK_TIME(FTM_AUTO_SELECT);
-		// select new item only if a filtered item not currently selected
+		// select new item only if a filtered item not currently selected and there was a selection
 		LLFolderViewItem* selected_itemp = mSelectedItems.empty() ? NULL : mSelectedItems.back();
-		if (!mAutoSelectOverride && (!selected_itemp || !selected_itemp->getViewModelItem()->potentiallyVisible()))
+		if (!mAutoSelectOverride && selected_itemp && !selected_itemp->getViewModelItem()->potentiallyVisible())
 		{
 			// these are named variables to get around gcc not binding non-const references to rvalues
 			// and functor application is inherently non-const to allow for stateful functors
diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h
index 114dd7bd2fd682298864571c305c395a5acd0ef8..b5deefd6537d3e7c70171974ed3e301df291c5f2 100644
--- a/indra/llui/llfolderview.h
+++ b/indra/llui/llfolderview.h
@@ -242,6 +242,8 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
 	bool useLabelSuffix() { return mUseLabelSuffix; }
 	virtual void updateMenu();
 
+	void finishRenamingItem( void );
+
     // Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem.
 	LLHandle<LLFolderView>	getHandle() const { return getDerivedHandle<LLFolderView>(); }
     
@@ -255,7 +257,6 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
 	void commitRename( const LLSD& data );
 	void onRenamerLost();
 
-	void finishRenamingItem( void );
 	void closeRenamer( void );
 
 	bool selectFirstItem();
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 3def0386e12632c042288b1e05b6d8187f38d3f0..5eb5ca4f82783e1f958c8129f83dc6d0b823db4a 100644
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -972,6 +972,11 @@ void LLFolderViewFolder::addToFolder(LLFolderViewFolder* folder)
 	mIndentation = (getParentFolder())
 		? getParentFolder()->getIndentation() + mLocalIndentation
 		: 0; 
+
+	if(isOpen() && folder->isOpen())
+	{
+		requestArrange();
+	}
 }
 
 static LLTrace::BlockTimerStatHandle FTM_ARRANGE("Arrange");
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index a08cf91a69dbcbb85c1ec4c3427699e597285ff3..492c9315d13bb3dd4bd292a173c3b4b720be389e 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -400,12 +400,7 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
 
 	if (mMaxLengthChars)
 	{
-		LLWString truncated_wstring = utf8str_to_wstring(truncated_utf8);
-		if (truncated_wstring.size() > (U32)mMaxLengthChars)
-		{
-			truncated_wstring = truncated_wstring.substr(0, mMaxLengthChars);
-		}
-		mText.assign(wstring_to_utf8str(truncated_wstring));
+		mText.assign(utf8str_symbol_truncate(truncated_utf8, mMaxLengthChars));
 	}
 
 	if (all_selected)
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 616c42895cdd23f50dcf7d64c006c911bd71122c..c7d7535f87cc2aab862ec296bf680aa5005a7d49 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -177,6 +177,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
 :	LLUICtrl(p, LLTextViewModelPtr(new LLTextViewModel)),
 	mURLClickSignal(NULL),
 	mIsFriendSignal(NULL),
+	mIsObjectBlockedSignal(NULL),
 	mMaxTextByteLength( p.max_text_length ),
 	mFont(p.font),
 	mFontShadow(p.font_shadow),
@@ -268,6 +269,8 @@ LLTextBase::~LLTextBase()
 {
 	mSegments.clear();
 	delete mURLClickSignal;
+	delete mIsFriendSignal;
+	delete mIsObjectBlockedSignal;
 }
 
 void LLTextBase::initFromParams(const LLTextBase::Params& p)
@@ -1942,6 +1945,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
 	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url, true));
 	registrar.add("Url.Block", boost::bind(&LLUrlAction::blockObject, url));
+	registrar.add("Url.Unblock", boost::bind(&LLUrlAction::unblockObject, url));
 	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
 	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
 	registrar.add("Url.AddFriend", boost::bind(&LLUrlAction::addFriend, url));
@@ -1968,6 +1972,19 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 			removeFriendButton->setEnabled(isFriend);
 		}
 	}
+
+	if (mIsObjectBlockedSignal)
+	{
+		bool is_blocked = *(*mIsObjectBlockedSignal)(LLUUID(LLUrlAction::getObjectId(url)), LLUrlAction::getObjectName(url));
+		LLView* blockButton = mPopupMenu->getChild<LLView>("block_object");
+		LLView* unblockButton = mPopupMenu->getChild<LLView>("unblock_object");
+
+		if (blockButton && unblockButton)
+		{
+			blockButton->setVisible(!is_blocked);
+			unblockButton->setVisible(is_blocked);
+		}
+	}
 	
 	if (mPopupMenu)
 	{
@@ -3022,6 +3039,15 @@ boost::signals2::connection LLTextBase::setIsFriendCallback(const is_friend_sign
 	return mIsFriendSignal->connect(cb);
 }
 
+boost::signals2::connection LLTextBase::setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb)
+{
+    if (!mIsObjectBlockedSignal)
+    {
+        mIsObjectBlockedSignal = new is_blocked_signal_t();
+    }
+    return mIsObjectBlockedSignal->connect(cb);
+}
+
 //
 // LLTextSegment
 //
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index c6ce5efcb8fc07beba3064b1c6edf1f78c6b3f76..85641fd89920463bf5a94b7c0ccd45193170a07e 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -270,6 +270,7 @@ class LLTextBase
 	friend class LLUICtrlFactory;
 
 	typedef boost::signals2::signal<bool (const LLUUID& user_id)> is_friend_signal_t;
+	typedef boost::signals2::signal<bool (const LLUUID& blocked_id, const std::string from)> is_blocked_signal_t;
 
 	struct LineSpacingParams : public LLInitParam::ChoiceBlock<LineSpacingParams>
 	{
@@ -456,6 +457,7 @@ class LLTextBase
 	virtual void			appendWidget(const LLInlineViewSegment::Params& params, const std::string& text, bool allow_undo);
 	boost::signals2::connection setURLClickedCallback(const commit_signal_t::slot_type& cb);
 	boost::signals2::connection setIsFriendCallback(const is_friend_signal_t::slot_type& cb);
+	boost::signals2::connection setIsObjectBlockedCallback(const is_blocked_signal_t::slot_type& cb);
 
 	void					setWordWrap(bool wrap);
 	LLScrollContainer*		getScrollContainer() const { return mScroller; }
@@ -685,6 +687,7 @@ class LLTextBase
 
 	// Used to check if user with given ID is avatar's friend
 	is_friend_signal_t*         mIsFriendSignal;
+	is_blocked_signal_t*        mIsObjectBlockedSignal;
 
 	LLUIString					mLabel;	// text label that is visible when no user text provided
 };
diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp
index fff04b34f28d68b6df80c1268da80c85da02cf30..f6b2ee1dc0942676a7aff18d3ca8037021f6913e 100644
--- a/indra/llui/lltextutil.cpp
+++ b/indra/llui/lltextutil.cpp
@@ -56,6 +56,26 @@ void LLTextUtil::textboxSetHighlightedVal(LLTextBox *txtbox, const LLStyle::Para
 	txtbox->appendText(text.substr(hl_begin + hl_len),	false, normal_style);
 }
 
+void LLTextUtil::textboxSetGreyedVal(LLTextBox *txtbox, const LLStyle::Params& normal_style, const std::string& text, const std::string& greyed)
+{
+    static LLUIColor sGreyedTextColor = LLUIColorTable::instance().getColor("Gray", LLColor4::grey);
+
+    size_t greyed_begin = 0, greyed_len = greyed.size();
+
+    if (greyed_len == 0 || (greyed_begin = text.find(greyed)) == std::string::npos)
+    {
+        txtbox->setText(text, normal_style);
+        return;
+    }
+
+    LLStyle::Params greyed_style = normal_style;
+    greyed_style.color = sGreyedTextColor;
+    txtbox->setText(LLStringUtil::null); // clear text
+    txtbox->appendText(text.substr(0, greyed_begin),        false, normal_style);
+    txtbox->appendText(text.substr(greyed_begin, greyed_len),   false, greyed_style);
+    txtbox->appendText(text.substr(greyed_begin + greyed_len),  false, normal_style);
+}
+
 const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)
 {
 	static const std::string PHONE_SEPARATOR = LLUI::sSettingGroups["config"]->getString("AvalinePhoneSeparator");
diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h
index 1be81ffd62e6a24c316513125ad21c1a76adb979..a9c143e4450d51d979fe2863994a399911c387c5 100644
--- a/indra/llui/lltextutil.h
+++ b/indra/llui/lltextutil.h
@@ -52,6 +52,12 @@ namespace LLTextUtil
 		const std::string& text,
 		const std::string& hl);
 
+	void textboxSetGreyedVal(
+	        LLTextBox *txtbox,
+	        const LLStyle::Params& normal_style,
+	        const std::string& text,
+	        const std::string& greyed);
+
 	/**
 	 * Formats passed phone number to be more human readable.
 	 *
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index 56977c597b3da695fa7caed90dca3e9011db0363..84ea770a8d80457ccd0c6fcc7dd7516a77869d18 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -231,3 +231,13 @@ void LLUrlAction::blockObject(std::string url)
 		executeSLURL("secondlife:///app/agent/" + object_id + "/block/" + LLURI::escape(object_name));
 	}
 }
+
+void LLUrlAction::unblockObject(std::string url)
+{
+    std::string object_id = getObjectId(url);
+    std::string object_name = getObjectName(url);
+    if (LLUUID::validate(object_id))
+    {
+        executeSLURL("secondlife:///app/agent/" + object_id + "/unblock/" + object_name);
+    }
+}
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 5497e28bb433f531ef1ad82bd67829161104b1f9..2d2a8dfef19835b75ffacedebe9bcc3890d454f2 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -83,6 +83,7 @@ class LLUrlAction
 	static void addFriend(std::string url);
 	static void removeFriend(std::string url);
 	static void blockObject(std::string url);
+	static void unblockObject(std::string url);
 
 	/// specify the callbacks to enable this class's functionality
 	typedef boost::function<void (const std::string&)> url_callback_t;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index bbc55b785c0af926313a7a562b3fc5f537448a55..fd7406b653808fa04fcf282322d1a849dfa8f4df 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -588,6 +588,11 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
 	BOOL log_visibility_change = LLViewerEventRecorder::instance().getLoggingStatus();
 	BOOST_FOREACH(LLView* viewp, mChildList)
 	{
+		if (!viewp)
+		{
+			continue;
+		}
+
 		// only views that are themselves visible will have their overall visibility affected by their ancestors
 		old_visibility=viewp->getVisible();
 
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f7f01a6e4edc1398c556861deb6c2ba6035c3419..b505bd3316bf79a7a3a5a5cc405fdfa2a9ed7d9d 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1315,13 +1315,10 @@ set(viewer_HEADER_FILES
 
 source_group("CMake Rules" FILES ViewerInstall.cmake)
 
+#summary.json creation moved to viewer_manifest.py MAINT-6413
 # the viewer_version.txt file created here is for passing to viewer_manifest and autobuild
-# the summary.json file is created for the benefit of the TeamCity builds, where
-#   it is used to provide descriptive information to the build results page
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"
            "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")
-file(WRITE "${CMAKE_BINARY_DIR}/summary.json"
-           "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\"}\n")
 
 set_source_files_properties(
    llversioninfo.cpp tests/llversioninfo_test.cpp 
diff --git a/indra/newview/app_settings/commands.xml b/indra/newview/app_settings/commands.xml
index 2cd6638042ec2b0b54c8ec5721aaf34bcda6375c..a0d3dc0f998ace803f3c6dbc614f1213e2d7694b 100644
--- a/indra/newview/app_settings/commands.xml
+++ b/indra/newview/app_settings/commands.xml
@@ -37,7 +37,7 @@
            tooltip_ref="Command_Build_Tooltip"
            execute_function="Build.Toggle"
            execute_parameters="build"
-           is_enabled_function="Build.Enabled"
+           is_enabled_function="Build.EnabledOrActive"
            is_enabled_parameters="build"
            is_running_function="Floater.IsOpen"
            is_running_parameters="build"
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index a8d42be2a1658e476347770bb70a0742e069e3cd..6ccf89eabec6c76ac4e370f6dd1ffcca7dcaa4a2 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3701,6 +3701,17 @@
         <key>Value</key>
         <integer>1</integer>
     </map>
+    <key>QueueInventoryFetchTimeout</key>
+    <map>
+        <key>Comment</key>
+        <string>Max time llcompilequeue will wait for inventory fetch to complete (in seconds)</string>
+        <key>Persist</key>
+        <integer>1</integer>
+        <key>Type</key>
+        <string>F32</string>
+        <key>Value</key>
+        <real>300.0</real>
+    </map>
     <key>FindLandArea</key>
     <map>
       <key>Comment</key>
@@ -11065,6 +11076,28 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>FriendsListHideUsernames</key>
+    <map>
+        <key>Comment</key>
+            <string>Show both Display name and Username in Friend list</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>Boolean</string>
+        <key>Value</key>
+            <integer>0</integer>
+    </map>
+    <key>NearbyListHideUsernames</key>
+    <map>
+        <key>Comment</key>
+            <string>Show both Display name and Username in Nearby list</string>
+        <key>Persist</key>
+            <integer>1</integer>
+        <key>Type</key>
+            <string>Boolean</string>
+        <key>Value</key>
+            <integer>0</integer>
+    </map> 
     <key>NearbyListShowMap</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index be8ea2bab99ab85caceb1d4b8a0965b36f3cb7af..e99b94f150231d5dac83dbd1a468decffeeb7a37 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -32,7 +32,7 @@ RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxNonImpostors 1   16
-RenderAvatarMaxComplexity          1	80000
+RenderAvatarMaxComplexity          1	350000
 RenderAvatarVP				1	1
 RenderAutoMuteSurfaceAreaLimit     1	1000.0
 RenderCubeMap				1	1
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index ca6c00951dbb9742dbbaa17964473374fc66efca..801a622e934751a7c080826e555c7b65861539db 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -32,7 +32,7 @@ RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxNonImpostors 1   16
-RenderAvatarMaxComplexity          1	80000
+RenderAvatarMaxComplexity          1	350000
 RenderAvatarVP				1	1
 RenderAutoMuteSurfaceAreaLimit     1	1000.0
 RenderCubeMap				1	1
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index ea69b088f953e547b583a47f78ca6c77dd24a2a5..1f891ee4d7b0cb6a0054a8b891dc9f14ffcdb974 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -32,7 +32,7 @@ RenderAvatarCloth				1	1
 RenderAvatarLODFactor			1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxNonImpostors     1   16
-RenderAvatarMaxComplexity              1	80000
+RenderAvatarMaxComplexity              1	350000
 RenderAvatarVP					1	1
 RenderAutoMuteSurfaceAreaLimit     1	1000.0
 RenderCubeMap				1	1
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index b8677fd9e4527dfcb89b0c0c782977b07737d72d..89317f2793f7069123c54515cf6d9eaf4c8778ca 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -648,6 +648,7 @@ Function un.ProgramFiles
 %%DELETE_FILES%%
 
 # Optional/obsolete files.  Delete won't fail if they don't exist.
+Delete "$INSTDIR\autorun.bat"
 Delete "$INSTDIR\dronesettings.ini"
 Delete "$INSTDIR\message_template.msg"
 Delete "$INSTDIR\newview.pdb"
@@ -679,6 +680,16 @@ FOLDERFOUND:
 
 NOFOLDER:
 
+MessageBox MB_YESNO $(DeleteRegistryKeysMB) IDYES DeleteKeys IDNO NoDelete
+
+DeleteKeys:
+  DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\x-grid-location-info"
+  DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Classes\secondlife"
+  DeleteRegKey HKEY_CLASSES_ROOT "x-grid-location-info"
+  DeleteRegKey HKEY_CLASSES_ROOT "secondlife"
+
+NoDelete:
+
 FunctionEnd
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi
index 343c312ddc5f08bf7009a982ca44688c005a2f3d..aa403a961cbdd0e39122c9273140346bb67a715f 100644
Binary files a/indra/newview/installers/windows/lang_en-us.nsi and b/indra/newview/installers/windows/lang_en-us.nsi differ
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 3e3d5c7456687d955ead55ef01e4a5aa207f576d..648212177b761b1311711066e42da28f953eb4dd 100644
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -838,11 +838,11 @@ void AISUpdate::parseEmbeddedCategories(const LLSD& categories)
 
 void AISUpdate::doUpdate()
 {
-	// Do version/descendent accounting.
+	// Do version/descendant accounting.
 	for (std::map<LLUUID,S32>::const_iterator catit = mCatDescendentDeltas.begin();
 		 catit != mCatDescendentDeltas.end(); ++catit)
 	{
-		LL_DEBUGS("Inventory") << "descendent accounting for " << catit->first << LL_ENDL;
+		LL_DEBUGS("Inventory") << "descendant accounting for " << catit->first << LL_ENDL;
 
 		const LLUUID cat_id(catit->first);
 		// Don't account for update if we just created this category.
@@ -859,13 +859,13 @@ void AISUpdate::doUpdate()
 			continue;
 		}
 
-		// If we have a known descendent count, set that now.
+		// If we have a known descendant count, set that now.
 		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
 		if (cat)
 		{
 			S32 descendent_delta = catit->second;
 			S32 old_count = cat->getDescendentCount();
-			LL_DEBUGS("Inventory") << "Updating descendent count for "
+			LL_DEBUGS("Inventory") << "Updating descendant count for "
 								   << cat->getName() << " " << cat_id
 								   << " with delta " << descendent_delta << " from "
 								   << old_count << " to " << (old_count+descendent_delta) << LL_ENDL;
@@ -896,7 +896,7 @@ void AISUpdate::doUpdate()
 		LLUUID category_id(update_it->first);
 		LLPointer<LLViewerInventoryCategory> new_category = update_it->second;
 		// Since this is a copy of the category *before* the accounting update, above,
-		// we need to transfer back the updated version/descendent count.
+		// we need to transfer back the updated version/descendant count.
 		LLViewerInventoryCategory* curr_cat = gInventory.getCategory(new_category->getUUID());
 		if (!curr_cat)
 		{
@@ -961,7 +961,16 @@ void AISUpdate::doUpdate()
 		{
 			LL_WARNS() << "Possible version mismatch for category " << cat->getName()
 					<< ", viewer version " << cat->getVersion()
-					<< " server version " << version << LL_ENDL;
+					<< " AIS version " << version << " !!!Adjusting local version!!!" <<  LL_ENDL;
+
+            // the AIS version should be considered the true version. Adjust 
+            // our local category model to reflect this version number.  Otherwise 
+            // it becomes possible to get stuck with the viewer being out of 
+            // sync with the inventory system.  Under normal circumstances 
+            // inventory COF is maintained on the viewer through calls to 
+            // LLInventoryModel::accountForUpdate when a changing operation 
+            // is performed.  This occasionally gets out of sync however.
+            cat->setVersion(version);
 		}
 	}
 
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index cc676550abe65783b024ef45b9fd0f5155cc51bb..a1d97863210ef2ff418009298d6b30ddf317972e 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -60,6 +60,8 @@
 #include "llcoros.h"
 #include "lleventcoro.h"
 
+#include "llavatarpropertiesprocessor.h"
+
 #if LL_MSVC
 // disable boost::lexical_cast warning
 #pragma warning (disable:4702)
@@ -3359,15 +3361,9 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
 {
     if (!mOutstandingAppearanceBakeRequest)
     {
-#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
         mRerequestAppearanceBake = false;
         LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
         LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
-#else
-        LLCoros::instance().launch("serverAppearanceUpdateCoro", 
-            boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));
-
-#endif
     }
     else
     {
@@ -3375,17 +3371,8 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
     }
 }
 
-#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
 void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
-#else
-void LLAppearanceMgr::serverAppearanceUpdateCoro()
-#endif
 {
-#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE
-    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
-        new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID));
-#endif
-
     mRerequestAppearanceBake = false;
     if (!gAgent.getRegion())
     {
@@ -3493,10 +3480,15 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro()
             // on multiple machines.
             if (result.has("expected"))
             {
-
                 S32 expectedCofVersion = result["expected"].asInteger();
                 LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
 
+                // Force an update texture request for ourself.  The message will return
+                // through the UDP and be handled in LLVOAvatar::processAvatarAppearance
+                // this should ensure that we receive a new canonical COF from the sim
+                // host. Hopefully it will return before the timeout.
+                LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(gAgent.getID());
+
                 bRetry = true;
                 // Wait for a 1/2 second before trying again.  Just to keep from asking too quickly.
                 if (++retryCount > BAKE_RETRY_MAX_COUNT)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index bf181cb4add27777af9581ec8a2e0dd31ba76b4f..7069da735294761b697ba00e6c937f4389456f14 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -228,11 +228,7 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 
 
 private:
-#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
     void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
-#else
-    void serverAppearanceUpdateCoro();
-#endif
 
     static void debugAppearanceUpdateCOF(const LLSD& content);
 
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index c8153cabdaf0d601bd36f8b9aca5493b6ee036f4..831d968b9266d3ff426031493de81048dbe7fe68 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3454,6 +3454,12 @@ std::string LLAppViewer::getViewerInfoString() const
 	{
 		support << '\n' << LLTrans::getString("AboutTraffic", args);
 	}
+
+	// SLT timestamp
+	LLSD substitution;
+	substitution["datetime"] = (S32)time(NULL);//(S32)time_corrected();
+	support << "\n" << LLTrans::getString("AboutTime", substitution);
+
 	return support.str();
 }
 
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 00bc8ebe871b961e35458f2ce01abe32c81176b9..a6e745448a98c921cd4a1aa46238d01b18251426 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -475,6 +475,57 @@ void LLAvatarActions::kick(const LLUUID& id)
 	LLNotifications::instance().add("KickUser", LLSD(), payload, handleKick);
 }
 
+// static
+void LLAvatarActions::freezeAvatar(const LLUUID& id)
+{
+	std::string fullname;
+	gCacheName->getFullName(id, fullname);
+	LLSD payload;
+	payload["avatar_id"] = id;
+
+	if (!fullname.empty())
+	{
+		LLSD args;
+		args["AVATAR_NAME"] = fullname;
+		LLNotificationsUtil::add("FreezeAvatarFullname", args, payload, handleFreezeAvatar);
+	}
+	else
+	{
+		LLNotificationsUtil::add("FreezeAvatar", LLSD(), payload, handleFreezeAvatar);
+	}
+}
+
+// static
+void LLAvatarActions::ejectAvatar(const LLUUID& id, bool ban_enabled)
+{
+	std::string fullname;
+	gCacheName->getFullName(id, fullname);
+	LLSD payload;
+	payload["avatar_id"] = id;
+	payload["ban_enabled"] = ban_enabled;
+	LLSD args;
+	if (!fullname.empty())
+	{
+		args["AVATAR_NAME"] = fullname;
+	}
+
+	if (ban_enabled)
+	{
+			LLNotificationsUtil::add("EjectAvatarFullname", args, payload, handleEjectAvatar);
+	}
+	else
+	{
+		if (!fullname.empty())
+		{
+			LLNotificationsUtil::add("EjectAvatarFullnameNoBan", args, payload, handleEjectAvatar);
+		}
+		else
+		{
+			LLNotificationsUtil::add("EjectAvatarNoBan", LLSD(), payload, handleEjectAvatar);
+		}
+	}
+}
+
 // static
 void LLAvatarActions::freeze(const LLUUID& id)
 {
@@ -482,7 +533,6 @@ void LLAvatarActions::freeze(const LLUUID& id)
 	payload["avatar_id"] = id;
 	LLNotifications::instance().add("FreezeUser", LLSD(), payload, handleFreeze);
 }
-
 // static
 void LLAvatarActions::unfreeze(const LLUUID& id)
 {
@@ -1133,10 +1183,77 @@ bool LLAvatarActions::handleKick(const LLSD& notification, const LLSD& response)
 	}
 	return false;
 }
-bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
+
+bool LLAvatarActions::handleFreezeAvatar(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
 
+	if (0 == option || 1 == option)
+	{
+	    U32 flags = 0x0;
+	    if (1 == option)
+	    {
+	        // unfreeze
+	        flags |= 0x1;
+	    }
+	    LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+		LLMessageSystem* msg = gMessageSystem;
+
+		msg->newMessage("FreezeUser");
+		msg->nextBlock("AgentData");
+		msg->addUUID("AgentID", gAgent.getID());
+		msg->addUUID("SessionID", gAgent.getSessionID());
+		msg->nextBlock("Data");
+		msg->addUUID("TargetID", avatar_id );
+		msg->addU32("Flags", flags );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
+
+bool LLAvatarActions::handleEjectAvatar(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (2 == option)
+	{
+		return false;
+	}
+	LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
+	bool ban_enabled = notification["payload"]["ban_enabled"].asBoolean();
+
+	if (0 == option)
+	{
+		LLMessageSystem* msg = gMessageSystem;
+		U32 flags = 0x0;
+		msg->newMessage("EjectUser");
+		msg->nextBlock("AgentData");
+		msg->addUUID("AgentID", gAgent.getID() );
+		msg->addUUID("SessionID", gAgent.getSessionID() );
+		msg->nextBlock("Data");
+		msg->addUUID("TargetID", avatar_id );
+		msg->addU32("Flags", flags );
+		gAgent.sendReliableMessage();
+	}
+	else if (ban_enabled)
+	{
+		LLMessageSystem* msg = gMessageSystem;
+
+		U32 flags = 0x1;
+		msg->newMessage("EjectUser");
+		msg->nextBlock("AgentData");
+		msg->addUUID("AgentID", gAgent.getID() );
+		msg->addUUID("SessionID", gAgent.getSessionID() );
+		msg->nextBlock("Data");
+		msg->addUUID("TargetID", avatar_id );
+		msg->addU32("Flags", flags );
+		gAgent.sendReliableMessage();
+	}
+	return false;
+}
+
+bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
@@ -1153,6 +1270,7 @@ bool LLAvatarActions::handleFreeze(const LLSD& notification, const LLSD& respons
 	}
 	return false;
 }
+
 bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index bd0ac24e932c836fc6872bd7875c5d2d57e078e4..256d44d820ae643a0449f6bb37d50c759b6637fd 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -173,6 +173,9 @@ class LLAvatarActions
 	 */	
 	static void inviteToGroup(const LLUUID& id);
 	
+	static void freezeAvatar(const LLUUID& id);
+
+	static void ejectAvatar(const LLUUID& id, bool ban_enabled = false);
 	/**
 	 * Kick avatar off grid
 	 */	
@@ -242,6 +245,8 @@ class LLAvatarActions
 	static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response);
 	static bool handleRemove(const LLSD& notification, const LLSD& response);
 	static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id);
+	static bool handleFreezeAvatar(const LLSD& notification, const LLSD& response);
+	static bool handleEjectAvatar(const LLSD& notification, const LLSD& response);
 	static bool handleKick(const LLSD& notification, const LLSD& response);
 	static bool handleFreeze(const LLSD& notification, const LLSD& response);
 	static bool handleUnfreeze(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 8846d1317d1e173a469be467b3a4502c4e3ab7b7..513f25e3017cd2795ae16c1698fc7d63d325a7c3 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -140,6 +140,7 @@ LLAvatarList::LLAvatarList(const Params& p)
 , mShowProfileBtn(p.show_profile_btn)
 , mShowSpeakingIndicator(p.show_speaking_indicator)
 , mShowPermissions(p.show_permissions_granted)
+, mShowCompleteName(false)
 {
 	setCommitOnSelectionChange(true);
 
@@ -174,6 +175,11 @@ void LLAvatarList::setShowIcons(std::string param_name)
 	mShowIcons = gSavedSettings.getBOOL(mIconParamName);
 }
 
+std::string LLAvatarList::getAvatarName(LLAvatarName av_name)
+{
+	return mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName();
+}
+
 // virtual
 void LLAvatarList::draw()
 {
@@ -279,7 +285,7 @@ void LLAvatarList::refresh()
 		LLAvatarName av_name;
 		have_names &= LLAvatarNameCache::get(buddy_id, &av_name);
 
-		if (!have_filter || findInsensitive(av_name.getDisplayName(), mNameFilter))
+		if (!have_filter || findInsensitive(getAvatarName(av_name), mNameFilter))
 		{
 			if (nadded >= ADD_LIMIT)
 			{
@@ -297,7 +303,7 @@ void LLAvatarList::refresh()
 				}
 				else
 				{
-					std::string display_name = av_name.getDisplayName();
+					std::string display_name = getAvatarName(av_name);
 					addNewItem(buddy_id, 
 						display_name.empty() ? waiting_str : display_name, 
 						LLAvatarTracker::instance().isBuddyOnline(buddy_id));
@@ -327,7 +333,7 @@ void LLAvatarList::refresh()
 			const LLUUID& buddy_id = it->asUUID();
 			LLAvatarName av_name;
 			have_names &= LLAvatarNameCache::get(buddy_id, &av_name);
-			if (!findInsensitive(av_name.getDisplayName(), mNameFilter))
+			if (!findInsensitive(getAvatarName(av_name), mNameFilter))
 			{
 				removeItemByUUID(buddy_id);
 				modified = true;
@@ -381,6 +387,7 @@ void LLAvatarList::updateAvatarNames()
 	for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++)
 	{
 		LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);
+		item->setShowCompleteName(mShowCompleteName);
 		item->updateAvatarName();
 	}
 	mNeedUpdateNames = false;
@@ -400,7 +407,7 @@ bool LLAvatarList::filterHasMatches()
 		// If name has not been loaded yet we consider it as a match.
 		// When the name will be loaded the filter will be applied again(in refresh()).
 
-		if (have_name && !findInsensitive(av_name.getDisplayName(), mNameFilter))
+		if (have_name && !findInsensitive(getAvatarName(av_name), mNameFilter))
 		{
 			continue;
 		}
@@ -434,6 +441,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info)
 void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
 {
 	LLAvatarListItem* item = new LLAvatarListItem();
+	item->setShowCompleteName(mShowCompleteName);
 	// This sets the name as a side effect
 	item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);
 	item->setOnline(mIgnoreOnlineStatus ? true : is_online);
@@ -445,6 +453,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
 	item->showSpeakingIndicator(mShowSpeakingIndicator);
 	item->setShowPermissions(mShowPermissions);
 
+
 	item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4));
 
 	addItem(item, id, pos);
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 3542577ae3c3f7cfb89272fdf1968624c0bd576f..1a672c279b1d94cec40d6f2fdc8a00dea0e5c372 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -83,6 +83,7 @@ class LLAvatarList : public LLFlatListViewEx
 	void setShowIcons(std::string param_name);
 	bool getIconsVisible() const { return mShowIcons; }
 	const std::string getIconParamName() const{return mIconParamName;}
+	std::string getAvatarName(LLAvatarName av_name);
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 	/*virtual*/ BOOL handleMouseDown( S32 x, S32 y, MASK mask );
 	/*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
@@ -100,6 +101,8 @@ class LLAvatarList : public LLFlatListViewEx
 	void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
 	void handleDisplayNamesOptionChanged();
 
+	void setShowCompleteName(bool show) { mShowCompleteName = show;};
+
 protected:
 	void refresh();
 
@@ -126,6 +129,7 @@ class LLAvatarList : public LLFlatListViewEx
 	bool mShowProfileBtn;
 	bool mShowSpeakingIndicator;
 	bool mShowPermissions;
+	bool mShowCompleteName;
 
 	LLTimer*				mLITUpdateTimer; // last interaction time update timer
 	std::string				mIconParamName;
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 3e6c817dd6229f718c05af53b689c9d8e045fc36..af3fac91bc07d17da393ad3010a7c9431c37f3ca 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -77,8 +77,10 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
 	mShowInfoBtn(true),
 	mShowProfileBtn(true),
 	mShowPermissions(false),
+	mShowCompleteName(false),
 	mHovered(false),
-	mAvatarNameCacheConnection()
+	mAvatarNameCacheConnection(),
+	mGreyOutUsername("")
 {
 	if (not_from_ui_factory)
 	{
@@ -399,14 +401,28 @@ void LLAvatarListItem::updateAvatarName()
 
 void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight)
 {
-	LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight);
+    if(mShowCompleteName && highlight.empty())
+    {
+        LLTextUtil::textboxSetGreyedVal(mAvatarName, mAvatarNameStyle, name, mGreyOutUsername);
+    }
+    else
+    {
+        LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight);
+    }
 }
 
 void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name)
 {
 	mAvatarNameCacheConnection.disconnect();
 
-	setAvatarName(av_name.getDisplayName());
+	mGreyOutUsername = "";
+	std::string name_string = mShowCompleteName? av_name.getCompleteName(false) : av_name.getDisplayName();
+	if(av_name.getCompleteName() != av_name.getUserName())
+	{
+	    mGreyOutUsername = "[ " + av_name.getUserName(true) + " ]";
+	    LLStringUtil::toLower(mGreyOutUsername);
+	}
+	setAvatarName(name_string);
 	setAvatarToolTip(av_name.getUserName());
 
 	//requesting the list to resort
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 7ef35a746ec9719018680cd8485663d0cd980b42..36d18114aaec80f6d6a4484b9df94c5c8b41027e 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -106,6 +106,7 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	void setShowPermissions(bool show) { mShowPermissions = show; };
 	void showLastInteractionTime(bool show);
 	void setAvatarIconVisible(bool visible);
+	void setShowCompleteName(bool show) { mShowCompleteName = show;};
 	
 	const LLUUID& getAvatarId() const;
 	std::string getAvatarName() const;
@@ -218,6 +219,9 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	/// true when the mouse pointer is hovering over this item
 	bool mHovered;
 	
+	bool mShowCompleteName;
+	std::string mGreyOutUsername;
+
 	void fetchAvatarName();
 	boost::signals2::connection mAvatarNameCacheConnection;
 
diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp
index a13e142e161dcd45fdd60c599a7f2f7ab30d0d8a..24934fdb73c8008e910a60b7029816b3d43871db 100644
--- a/indra/newview/llavatarrendernotifier.cpp
+++ b/indra/newview/llavatarrendernotifier.cpp
@@ -63,7 +63,7 @@ mLatestAgentComplexity(0),
 mLatestOverLimitPct(0.0f),
 mShowOverLimitAgents(false),
 mNotifyOutfitLoading(false),
-mLastCofVersion(-1),
+mLastCofVersion(LLViewerInventoryCategory::VERSION_UNKNOWN),
 mLastOutfitRezStatus(-1),
 mLastSkeletonSerialNum(-1)
 {
@@ -207,8 +207,8 @@ void LLAvatarRenderNotifier::updateNotificationState()
         mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
     }
     else if (mLastCofVersion >= 0
-        && (mLastCofVersion != gAgentAvatarp->mLastUpdateRequestCOFVersion
-            || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
+        && (mLastCofVersion != LLAppearanceMgr::instance().getCOFVersion()
+        || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
     {
         // version mismatch in comparison to previous outfit - outfit changed
         mNotifyOutfitLoading = true;
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 4b426081d075af6433084805f477fb75ded37834..5d2997688fc2a0f172a4ed43d78263c260f45e88 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -156,6 +156,10 @@ class LLChatHistoryHeader: public LLPanel
 			LLFloaterSidePanelContainer::showPanel("people", "panel_people",
 				LLSD().with("people_panel_tab_name", "blocked_panel").with("blocked_to_select", getAvatarId()));
 		}
+		else if (level == "unblock")
+		{
+			LLMuteList::getInstance()->remove(LLMute(getAvatarId(), mFrom, LLMute::OBJECT));
+		}
 		else if (level == "map")
 		{
 			std::string url = "secondlife://" + mObjectData["slurl"].asString();
@@ -169,6 +173,20 @@ class LLChatHistoryHeader: public LLPanel
 
 	}
 
+    bool onObjectIconContextMenuItemVisible(const LLSD& userdata)
+    {
+        std::string level = userdata.asString();
+        if (level == "is_blocked")
+        {
+            return LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);
+        }
+        else if (level == "not_blocked")
+        {
+            return !LLMuteList::getInstance()->isMuted(getAvatarId(), mFrom, LLMute::flagTextChat);
+        }
+        return false;
+    }
+
 	void onAvatarIconContextMenuItemClicked(const LLSD& userdata)
 	{
 		std::string level = userdata.asString();
@@ -275,6 +293,7 @@ class LLChatHistoryHeader: public LLPanel
 		registrar.add("AvatarIcon.Action", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemClicked, this, _2));
 		registrar_enable.add("AvatarIcon.Check", boost::bind(&LLChatHistoryHeader::onAvatarIconContextMenuItemChecked, this, _2));
 		registrar.add("ObjectIcon.Action", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemClicked, this, _2));
+		registrar_enable.add("ObjectIcon.Visible", boost::bind(&LLChatHistoryHeader::onObjectIconContextMenuItemVisible, this, _2));
 
 		LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_avatar_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
 		mPopupMenuHandleAvatar = menu->getHandle();
@@ -719,6 +738,8 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
 	editor_params.trusted_content = false;
 	mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
 	mEditor->setIsFriendCallback(LLAvatarActions::isFriend);
+	mEditor->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0));
+
 }
 
 LLSD LLChatHistory::getValue() const
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 219bcf0eb03b0da021bcac4bb7c6329b034bf243..7721e6729089c65036cb7b1d7a29bfc189e12775 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -62,6 +62,57 @@
 #include "llviewerassetupload.h"
 #include "llcorehttputil.h"
 
+namespace
+{
+
+    const std::string QUEUE_EVENTPUMP_NAME("ScriptActionQueue");
+
+
+    class ObjectInventoryFetcher: public LLVOInventoryListener
+    {
+    public:
+        typedef boost::shared_ptr<ObjectInventoryFetcher> ptr_t;
+
+        ObjectInventoryFetcher(LLEventPump &pump, LLViewerObject* object, void* user_data) :
+            mPump(pump),
+            LLVOInventoryListener()
+        {
+            registerVOInventoryListener(object, this);
+        }
+
+        virtual void inventoryChanged(LLViewerObject* object,
+            LLInventoryObject::object_list_t* inventory,
+            S32 serial_num,
+            void* user_data);
+
+        void fetchInventory() 
+        {
+            requestVOInventory();
+        }
+
+        const LLInventoryObject::object_list_t & getInventoryList() const { return mInventoryList; }
+
+    private:
+        LLInventoryObject::object_list_t    mInventoryList;
+        LLEventPump &                       mPump;
+    };
+
+    class HandleScriptUserData
+    {
+    public:
+        HandleScriptUserData(const std::string &pumpname) :
+            mPumpname(pumpname)
+        { }
+
+        const std::string &getPumpName() const { return mPumpname; }
+
+    private:
+        std::string mPumpname;
+    };
+
+
+}
+
 // *NOTE$: A minor specialization of LLScriptAssetUpload, it does not require a buffer 
 // (and does not save a buffer to the vFS) and it finds the compile queue window and 
 // displays a compiling message.
@@ -149,47 +200,6 @@ BOOL LLFloaterScriptQueue::postBuild()
 	return TRUE;
 }
 
-// This is the callback method for the viewer object currently being
-// worked on.
-// NOT static, virtual!
-void LLFloaterScriptQueue::inventoryChanged(LLViewerObject* viewer_object,
-											 LLInventoryObject::object_list_t* inv,
-											 S32,
-											 void* q_id)
-{
-	LL_INFOS() << "LLFloaterScriptQueue::inventoryChanged() for  object "
-			<< viewer_object->getID() << LL_ENDL;
-
-	//Remove this listener from the object since its
-	//listener callback is now being executed.
-	
-	//We remove the listener here because the function
-	//removeVOInventoryListener removes the listener from a ViewerObject
-	//which it internally stores.
-	
-	//If we call this further down in the function, calls to handleInventory
-	//and nextObject may update the internally stored viewer object causing
-	//the removal of the incorrect listener from an incorrect object.
-	
-	//Fixes SL-6119:Recompile scripts fails to complete
-	removeVOInventoryListener();
-
-	if (viewer_object && inv && (viewer_object->getID() == mCurrentObjectID) )
-	{
-		handleInventory(viewer_object, inv);
-	}
-	else
-	{
-		// something went wrong...
-		// note that we're not working on this one, and move onto the
-		// next object in the list.
-		LL_WARNS() << "No inventory for " << mCurrentObjectID
-				<< LL_ENDL;
-		nextObject();
-	}
-}
-
-
 // static
 void LLFloaterScriptQueue::onCloseBtn(void* user_data)
 {
@@ -197,9 +207,10 @@ void LLFloaterScriptQueue::onCloseBtn(void* user_data)
 	self->closeFloater();
 }
 
-void LLFloaterScriptQueue::addObject(const LLUUID& id)
+void LLFloaterScriptQueue::addObject(const LLUUID& id, std::string name)
 {
-	mObjectIDs.push_back(id);
+    ObjectData obj = { id, name };
+    mObjectList.push_back(obj);
 }
 
 BOOL LLFloaterScriptQueue::start()
@@ -208,7 +219,7 @@ BOOL LLFloaterScriptQueue::start()
 
 	LLStringUtil::format_map_t args;
 	args["[START]"] = mStartString;
-	args["[COUNT]"] = llformat ("%d", mObjectIDs.size());
+	args["[COUNT]"] = llformat ("%d", mObjectList.size());
 	buffer = getString ("Starting", args);
 	
 	getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
@@ -216,74 +227,24 @@ BOOL LLFloaterScriptQueue::start()
 	return startQueue();
 }
 
-BOOL LLFloaterScriptQueue::isDone() const
+void LLFloaterScriptQueue::addProcessingMessage(const std::string &message, const LLSD &args)
 {
-	return (mCurrentObjectID.isNull() && (mObjectIDs.size() == 0));
-}
+    std::string buffer(LLTrans::getString(message, args));
 
-// go to the next object. If no objects left, it falls out silently
-// and waits to be killed by the window being closed.
-BOOL LLFloaterScriptQueue::nextObject()
-{
-	U32 count;
-	BOOL successful_start = FALSE;
-	do
-	{
-		count = mObjectIDs.size();
-		LL_INFOS() << "LLFloaterScriptQueue::nextObject() - " << count
-				<< " objects left to process." << LL_ENDL;
-		mCurrentObjectID.setNull();
-		if(count > 0)
-		{
-			successful_start = popNext();
-		}
-		LL_INFOS() << "LLFloaterScriptQueue::nextObject() "
-				<< (successful_start ? "successful" : "unsuccessful")
-				<< LL_ENDL; 
-	} while((mObjectIDs.size() > 0) && !successful_start);
-	if(isDone() && !mDone)
-	{
-		mDone = true;
-		getChild<LLScrollListCtrl>("queue output")->addSimpleElement(getString("Done"), ADD_BOTTOM);
-		getChildView("close")->setEnabled(TRUE);
-	}
-	return successful_start;
+    getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
 }
 
-// returns true if the queue has started, otherwise false.  This
-// method pops the top object off of the queue.
-BOOL LLFloaterScriptQueue::popNext()
+void LLFloaterScriptQueue::addStringMessage(const std::string &message)
 {
-	// get the first element off of the container, and attempt to get
-	// the inventory.
-	BOOL rv = FALSE;
-	S32 count = mObjectIDs.size();
-	if(mCurrentObjectID.isNull() && (count > 0))
-	{
-		mCurrentObjectID = mObjectIDs.at(0);
-		LL_INFOS() << "LLFloaterScriptQueue::popNext() - mCurrentID: "
-				<< mCurrentObjectID << LL_ENDL;
-		mObjectIDs.erase(mObjectIDs.begin());
-		LLViewerObject* obj = gObjectList.findObject(mCurrentObjectID);
-		if(obj)
-		{
-			LL_INFOS() << "LLFloaterScriptQueue::popNext() requesting inv for "
-					<< mCurrentObjectID << LL_ENDL;
-			LLUUID* id = new LLUUID(getKey().asUUID());
-			registerVOInventoryListener(obj,id);
-			requestVOInventory();
-			rv = TRUE;
-		}
-	}
-	return rv;
+    getChild<LLScrollListCtrl>("queue output")->addSimpleElement(message, ADD_BOTTOM);
 }
 
-BOOL LLFloaterScriptQueue::startQueue()
+
+BOOL LLFloaterScriptQueue::isDone() const
 {
-	return nextObject();
+	return (mCurrentObjectID.isNull() && (mObjectList.size() == 0));
 }
 
-
 ///----------------------------------------------------------------------------
 /// Class LLFloaterCompileQueue
 ///----------------------------------------------------------------------------
@@ -306,7 +267,7 @@ void LLFloaterCompileQueue::experienceIdsReceived( const LLSD& content )
 	{
 		mExperienceIds.insert(it->asUUID());
 	}
-	nextObject();
+//	nextObject();
 }
 
 BOOL LLFloaterCompileQueue::hasExperience( const LLUUID& id ) const
@@ -314,188 +275,289 @@ BOOL LLFloaterCompileQueue::hasExperience( const LLUUID& id ) const
 	return mExperienceIds.find(id) != mExperienceIds.end();
 }
 
+// //Attempt to record this asset ID.  If it can not be inserted into the set 
+// //then it has already been processed so return false.
+// bool LLFloaterCompileQueue::checkAssetId(const LLUUID &assetId)
+// {
+//     std::pair<uuid_list_t::iterator, bool> result = mAssetIds.insert(assetId);
+//     return result.second;
+// }
 
-void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
-											LLInventoryObject::object_list_t* inv)
+void LLFloaterCompileQueue::handleHTTPResponse(std::string pumpName, const LLSD &expresult)
 {
-	// find all of the lsl, leaving off duplicates. We'll remove
-	// all matching asset uuids on compilation success.
+    LLEventPumps::instance().post(pumpName, expresult);
+}
 
-	typedef std::multimap<LLUUID, LLPointer<LLInventoryItem> > uuid_item_map;
-	uuid_item_map asset_item_map;
+// *TODO: handleSCriptRetrieval is passed into the VFS via a legacy C function pointer
+// future project would be to convert these to C++ callables (std::function<>) so that 
+// we can use bind and remove the userData parameter.
+// 
+void LLFloaterCompileQueue::handleScriptRetrieval(LLVFS *vfs, const LLUUID& assetId, 
+    LLAssetType::EType type, void* userData, S32 status, LLExtStat extStatus)
+{
+    LLSD result(LLSD::emptyMap());
 
-	LLInventoryObject::object_list_t::const_iterator it = inv->begin();
-	LLInventoryObject::object_list_t::const_iterator end = inv->end();
-	for ( ; it != end; ++it)
-	{
-		if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
-		{
-			LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
-			// Check permissions before allowing the user to retrieve data.
-			if (item->getPermissions().allowModifyBy(gAgent.getID(), gAgent.getGroupID())  &&
-				item->getPermissions().allowCopyBy(gAgent.getID(), gAgent.getGroupID()) )
-			{
-				LLPointer<LLViewerInventoryItem> script = new LLViewerInventoryItem(item);
-				mCurrentScripts.push_back(script);
-				asset_item_map.insert(std::make_pair(item->getAssetUUID(), item));
-			}
-		}
-	}
+    result["asset_id"] = assetId;
+    if (status)
+    {
+        result["error"] = status;
+     
+        if (status == LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE)
+        {
+            result["message"] = LLTrans::getString("CompileQueueProblemDownloading") + (":");
+            result["alert"] = LLTrans::getString("CompileQueueScriptNotFound");
+        }
+        else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
+        {
+            result["message"] = LLTrans::getString("CompileQueueInsufficientPermFor") + (":");
+            result["alert"] = LLTrans::getString("CompileQueueInsufficientPermDownload");
+        }
+        else
+        {
+            result["message"] = LLTrans::getString("CompileQueueUnknownFailure");
+        }
+    }
 
-	if (asset_item_map.empty())
-	{
-		// There are no scripts in this object.  move on.
-		nextObject();
-	}
-	else
-	{
-		// request all of the assets.
-		uuid_item_map::iterator iter;
-		for(iter = asset_item_map.begin(); iter != asset_item_map.end(); iter++)
-		{
-			LLInventoryItem *itemp = iter->second;
-			LLScriptQueueData* datap = new LLScriptQueueData(getKey().asUUID(),
-				viewer_object->getID(), itemp);
-
-            LLExperienceCache::instance().fetchAssociatedExperience(itemp->getParentUUID(), itemp->getUUID(),
-                    boost::bind(&LLFloaterCompileQueue::requestAsset, datap, _1));
-		}
-	}
-}
+    LLEventPumps::instance().post(((HandleScriptUserData *)userData)->getPumpName(), result);
 
+}
 
-void LLFloaterCompileQueue::requestAsset( LLScriptQueueData* datap, const LLSD& experience )
+/*static*/
+void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID parent)
 {
-	LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", datap->mQueueID);
-	if(!queue)
-	{
-		delete datap;
-		return;
-	}
-	if(experience.has(LLExperienceCache::EXPERIENCE_ID))
-	{
-		datap->mExperienceId=experience[LLExperienceCache::EXPERIENCE_ID].asUUID();
-		if(!queue->hasExperience(datap->mExperienceId))
-		{
-			std::string buffer = LLTrans::getString("CompileNoExperiencePerm", LLSD::emptyMap()
-				.with("SCRIPT", datap->mItem->getName())
-				.with("EXPERIENCE", experience[LLExperienceCache::NAME].asString()));
-	
-			queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
-			queue->removeItemByItemID(datap->mItem->getUUID());
-			delete datap;
-			return;
-		}
-	}
-	//LL_INFOS() << "ITEM NAME 2: " << names.get(i) << LL_ENDL;
-	gAssetStorage->getInvItemAsset(datap->mHost,
-		gAgent.getID(),
-		gAgent.getSessionID(),
-		datap->mItem->getPermissions().getOwner(),
-		datap->mTaskId,
-		datap->mItem->getUUID(),
-		datap->mItem->getAssetUUID(),
-		datap->mItem->getType(),
-		LLFloaterCompileQueue::scriptArrived,
-		(void*)datap);
+    LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", parent);
+    if (!queue)
+        return;
+
+    queue->experienceIdsReceived(result["experience_ids"]);
+
+    LLHandle<LLFloaterScriptQueue> hFloater(queue->getDerivedHandle<LLFloaterScriptQueue>());
+
+    fnQueueAction_t fn = boost::bind(LLFloaterCompileQueue::processScript,
+        queue->getDerivedHandle<LLFloaterCompileQueue>(), _1, _2, _3);
+
+
+    LLCoros::instance().launch("ScriptQueueCompile", boost::bind(LLFloaterScriptQueue::objectScriptProcessingQueueCoro,
+        queue->mStartString,
+        hFloater,
+        queue->mObjectList,
+        fn));
+
 }
 
-/*static*/
-void LLFloaterCompileQueue::finishLSLUpload(LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response, std::string scriptName, LLUUID queueId)
+bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
+    const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
 {
+    LLSD result;
+    LLFloaterCompileQueue *that = hfloater.get();
+    bool monocompile = that->mMono;
+    F32 fetch_timeout = gSavedSettings.getF32("QueueInventoryFetchTimeout");
+
+    if (!that)
+        return false;
 
-    LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", LLSD(queueId));
-    if (queue)
+    // Initial test to see if we can (or should) attempt to compile the script.
+    LLInventoryItem *item = dynamic_cast<LLInventoryItem *>(inventory);
     {
-        // Bytecode save completed
-        if (response["compiled"])
+
+        if (!item->getPermissions().allowModifyBy(gAgent.getID(), gAgent.getGroupID()) ||
+            !item->getPermissions().allowCopyBy(gAgent.getID(), gAgent.getGroupID()))
         {
-            std::string message = std::string("Compilation of \"") + scriptName + std::string("\" succeeded");
+            std::string buffer = "Skipping: " + item->getName() + "(Permissions)";
+            that->addStringMessage(buffer);
+            return true;
+        }
 
-            queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(message, ADD_BOTTOM);
-            LL_INFOS() << message << LL_ENDL;
+//         if (!that->checkAssetId(item->getAssetUUID()))
+//         {
+//             std::string buffer = "Skipping: " + item->getName() + "(Repeat)";
+//             that->addStringMessage(buffer);
+//             return true;
+//         }
+    }
+    that = NULL;
+
+    // Attempt to retrieve the experience
+    LLUUID experienceId;
+    {
+        LLExperienceCache::instance().fetchAssociatedExperience(inventory->getParentUUID(), inventory->getUUID(),
+            boost::bind(&LLFloaterCompileQueue::handleHTTPResponse, pump.getName(), _1));
+
+        result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout,
+            LLSD().with("timeout", LLSD::Boolean(true)));
+
+        that = hfloater.get();
+        if (!that)
+        {
+            return false;
         }
-        else
+
+        if (result.has("timeout") && result["timeout"].asBoolean())
         {
-            LLSD compile_errors = response["errors"];
-            for (LLSD::array_const_iterator line = compile_errors.beginArray();
-                line < compile_errors.endArray(); line++)
-            {
-                std::string str = line->asString();
-                str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
+            LLStringUtil::format_map_t args;
+            args["[OBJECT_NAME]"] = inventory->getName();
+            std::string buffer = that->getString("Timeout", args);
+            that->addStringMessage(buffer);
+            return true;
+        }
 
-                queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(str, ADD_BOTTOM);
+        if (result.has(LLExperienceCache::EXPERIENCE_ID))
+        {
+            experienceId = result[LLExperienceCache::EXPERIENCE_ID].asUUID();
+            if (!that->hasExperience(experienceId))
+            {
+                that->addProcessingMessage("CompileNoExperiencePerm", LLSD()
+                    .with("SCRIPT", inventory->getName())
+                    .with("EXPERIENCE", result[LLExperienceCache::NAME].asString()));
+                return true;
             }
-            LL_INFOS() << response["errors"] << LL_ENDL;
         }
 
     }
+    that = NULL;
+
+    {
+        HandleScriptUserData    userData(pump.getName());
+
+
+        // request the asset
+        gAssetStorage->getInvItemAsset(LLHost(),
+            gAgent.getID(),
+            gAgent.getSessionID(),
+            item->getPermissions().getOwner(),
+            object->getID(),
+            item->getUUID(),
+            item->getAssetUUID(),
+            item->getType(),
+            &LLFloaterCompileQueue::handleScriptRetrieval,
+            &userData);
+
+        result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout,
+            LLSD().with("timeout", LLSD::Boolean(true)));
+    }
+
+    that = hfloater.get();
+    if (!that)
+    {
+        return false;
+    }
+
+    if (result.has("timeout"))
+    {
+        if (result.has("timeout") && result["timeout"].asBoolean())
+        {
+            LLStringUtil::format_map_t args;
+            args["[OBJECT_NAME]"] = inventory->getName();
+            std::string buffer = that->getString("Timeout", args);
+            that->addStringMessage(buffer);
+            return true;
+        }
+    }
+
+    if (result.has("error"))
+    {
+        LL_WARNS("SCRIPTQ") << "Inventory fetch returned with error. Code: " << result["error"].asString() << LL_ENDL;
+        std::string buffer = result["message"].asString() + " " + inventory->getName();
+        that->addStringMessage(buffer);
+
+        if (result.has("alert"))
+        {
+            LLSD args;
+            args["MESSAGE"] = result["alert"].asString();
+            LLNotificationsUtil::add("SystemMessage", args);
+        }
+        return true;
+    }
+
+    LLUUID assetId = result["asset_id"];
+    that = NULL;
+
+
+    std::string url = object->getRegion()->getCapability("UpdateScriptTask");
+
+
+    {
+        LLResourceUploadInfo::ptr_t uploadInfo(new LLQueuedScriptAssetUpload(object->getID(), 
+            inventory->getUUID(), 
+            assetId, 
+            monocompile ? LLScriptAssetUpload::MONO : LLScriptAssetUpload::LSL2,
+            true, 
+            inventory->getName(), 
+            LLUUID(), 
+            experienceId, 
+            boost::bind(&LLFloaterCompileQueue::handleHTTPResponse, pump.getName(), _4)));
+
+        LLViewerAssetUpload::EnqueueInventoryUpload(url, uploadInfo);
+    }
+
+    result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout, LLSD().with("timeout", LLSD::Boolean(true)));
+
+    that = hfloater.get();
+    if (!that)
+    {
+        return false;
+    }
+
+    if (result.has("timeout"))
+    {
+        if (result.has("timeout") && result["timeout"].asBoolean())
+        {
+            LLStringUtil::format_map_t args;
+            args["[OBJECT_NAME]"] = inventory->getName();
+            std::string buffer = that->getString("Timeout", args);
+            that->addStringMessage(buffer);
+            return true;
+        }
+    }
+
+    // Bytecode save completed
+    if (result["compiled"])
+    {
+        std::string buffer = std::string("Compilation of \"") + inventory->getName() + std::string("\" succeeded");
+
+        that->addStringMessage(buffer);
+        LL_INFOS() << buffer << LL_ENDL;
+    }
+    else
+    {
+        LLSD compile_errors = result["errors"];
+        std::string buffer = std::string("Compilation of \"") + inventory->getName() + std::string("\" failed:");
+        that->addStringMessage(buffer);
+        for (LLSD::array_const_iterator line = compile_errors.beginArray();
+            line < compile_errors.endArray(); line++)
+        {
+            std::string str = line->asString();
+            str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
+
+            that->addStringMessage(str);
+        }
+        LL_INFOS() << result["errors"] << LL_ENDL;
+    }
+
+    return true;
 }
 
-// This is the callback for when each script arrives
-// static
-void LLFloaterCompileQueue::scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
-										  LLAssetType::EType type,
-										  void* user_data, S32 status, LLExtStat ext_status)
+bool LLFloaterCompileQueue::startQueue()
 {
-	LL_INFOS() << "LLFloaterCompileQueue::scriptArrived()" << LL_ENDL;
-	LLScriptQueueData* data = (LLScriptQueueData*)user_data;
-	if(!data)
-	{
-		return;
-	}
-	LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", data->mQueueID);
-	
-	std::string buffer;
-	if(queue && (0 == status))
-	{
-        LLViewerObject* object = gObjectList.findObject(data->mTaskId);
-        if (object)
+    LLViewerRegion* region = gAgent.getRegion();
+    if (region)
+    {
+        std::string lookup_url = region->getCapability("GetCreatorExperiences");
+        if (!lookup_url.empty())
         {
-            std::string url = object->getRegion()->getCapability("UpdateScriptTask");
-            std::string scriptName = data->mItem->getName();
-
-            LLBufferedAssetUploadInfo::taskUploadFinish_f proc = boost::bind(&LLFloaterCompileQueue::finishLSLUpload, _1, _2, _3, _4, 
-                scriptName, data->mQueueID);
+            LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t success =
+                boost::bind(&LLFloaterCompileQueue::processExperienceIdResults, _1, getKey().asUUID());
 
-            LLResourceUploadInfo::ptr_t uploadInfo(new LLQueuedScriptAssetUpload(data->mTaskId, data->mItem->getUUID(), asset_id,
-                (queue->mMono) ? LLScriptAssetUpload::MONO : LLScriptAssetUpload::LSL2,
-                true, scriptName, data->mQueueID, data->mExperienceId, proc));
+            LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t failure =
+                boost::bind(&LLFloaterCompileQueue::processExperienceIdResults, LLSD(), getKey().asUUID());
 
-            LLViewerAssetUpload::EnqueueInventoryUpload(url, uploadInfo);
+            LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(lookup_url,
+                success, failure);
+            return TRUE;
         }
-	}
-	else
-	{
-		if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )
-		{
-			LLSD args;
-			args["MESSAGE"] = LLTrans::getString("CompileQueueScriptNotFound");
-			LLNotificationsUtil::add("SystemMessage", args);
-			
-			buffer = LLTrans::getString("CompileQueueProblemDownloading") + (": ") + data->mItem->getName();
-		}
-		else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
-		{
-			LLSD args;
-			args["MESSAGE"] = LLTrans::getString("CompileQueueInsufficientPermDownload");
-			LLNotificationsUtil::add("SystemMessage", args);
-
-			buffer = LLTrans::getString("CompileQueueInsufficientPermFor") + (": ") + data->mItem->getName();
-		}
-		else
-		{
-			buffer = LLTrans::getString("CompileQueueUnknownFailure") + (" ") + data->mItem->getName();
-		}
-
-		LL_WARNS() << "Problem downloading script asset." << LL_ENDL;
-		if(queue) queue->removeItemByItemID(data->mItem->getUUID());
-	}
-	if(queue && (buffer.size() > 0)) 
-	{
-		queue->getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
-	}
-	delete data;
+    }
+
+    return true;
 }
 
 
@@ -514,40 +576,42 @@ LLFloaterResetQueue::~LLFloaterResetQueue()
 { 
 }
 
-void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj,
-										  LLInventoryObject::object_list_t* inv)
+bool LLFloaterResetQueue::resetObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, 
+    const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
+{
+    LLFloaterScriptQueue *that = hfloater.get();
+    if (that)
+    {
+        std::string buffer;
+        buffer = that->getString("Resetting") + (": ") + inventory->getName();
+        that->addStringMessage(buffer);
+    }
+    
+    LLMessageSystem* msg = gMessageSystem;
+    msg->newMessageFast(_PREHASH_ScriptReset);
+    msg->nextBlockFast(_PREHASH_AgentData);
+    msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+    msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+    msg->nextBlockFast(_PREHASH_Script);
+    msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
+    msg->addUUIDFast(_PREHASH_ItemID, inventory->getUUID());
+    msg->sendReliable(object->getRegion()->getHost());
+
+    return true;
+}
+
+bool LLFloaterResetQueue::startQueue()
 {
-	// find all of the lsl, leaving off duplicates. We'll remove
-	// all matching asset uuids on compilation success.
+    fnQueueAction_t fn = boost::bind(LLFloaterResetQueue::resetObjectScripts,
+        getDerivedHandle<LLFloaterScriptQueue>(), _1, _2, _3);
 
-	LLInventoryObject::object_list_t::const_iterator it = inv->begin();
-	LLInventoryObject::object_list_t::const_iterator end = inv->end();
-	for ( ; it != end; ++it)
-	{
-		if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
-		{
-			LLViewerObject* object = gObjectList.findObject(viewer_obj->getID());
-
-			if (object)
-			{
-				LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
-				std::string buffer;
-				buffer = getString("Resetting") + (": ") + item->getName();
-				getChild<LLScrollListCtrl>("queue output")->addSimpleElement(buffer, ADD_BOTTOM);
-				LLMessageSystem* msg = gMessageSystem;
-				msg->newMessageFast(_PREHASH_ScriptReset);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-				msg->nextBlockFast(_PREHASH_Script);
-				msg->addUUIDFast(_PREHASH_ObjectID, viewer_obj->getID());
-				msg->addUUIDFast(_PREHASH_ItemID, (*it)->getUUID());
-				msg->sendReliable(object->getRegion()->getHost());
-			}
-		}
-	}
+    LLCoros::instance().launch("ScriptResetQueue", boost::bind(LLFloaterScriptQueue::objectScriptProcessingQueueCoro,
+        mStartString,
+        getDerivedHandle<LLFloaterScriptQueue>(),
+        mObjectList,
+        fn));
 
-	nextObject();	
+    return true;
 }
 
 ///----------------------------------------------------------------------------
@@ -565,44 +629,46 @@ LLFloaterRunQueue::~LLFloaterRunQueue()
 { 
 }
 
-void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj,
-										  LLInventoryObject::object_list_t* inv)
+bool LLFloaterRunQueue::runObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, 
+    const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
 {
-	// find all of the lsl, leaving off duplicates. We'll remove
-	// all matching asset uuids on compilation success.
-	LLInventoryObject::object_list_t::const_iterator it = inv->begin();
-	LLInventoryObject::object_list_t::const_iterator end = inv->end();
-	for ( ; it != end; ++it)
-	{
-		if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
-		{
-			LLViewerObject* object = gObjectList.findObject(viewer_obj->getID());
-
-			if (object)
-			{
-				LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
-				LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
-				std::string buffer;
-				buffer = getString("Running") + (": ") + item->getName();
-				list->addSimpleElement(buffer, ADD_BOTTOM);
-
-				LLMessageSystem* msg = gMessageSystem;
-				msg->newMessageFast(_PREHASH_SetScriptRunning);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-				msg->nextBlockFast(_PREHASH_Script);
-				msg->addUUIDFast(_PREHASH_ObjectID, viewer_obj->getID());
-				msg->addUUIDFast(_PREHASH_ItemID, (*it)->getUUID());
-				msg->addBOOLFast(_PREHASH_Running, TRUE);
-				msg->sendReliable(object->getRegion()->getHost());
-			}
-		}
-	}
+    LLFloaterScriptQueue *that = hfloater.get();
+    if (that)
+    {
+        std::string buffer;
+        buffer = that->getString("Running") + (": ") + inventory->getName();
+        that->addStringMessage(buffer);
+    }
 
-	nextObject();	
+    LLMessageSystem* msg = gMessageSystem;
+    msg->newMessageFast(_PREHASH_SetScriptRunning);
+    msg->nextBlockFast(_PREHASH_AgentData);
+    msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+    msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+    msg->nextBlockFast(_PREHASH_Script);
+    msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
+    msg->addUUIDFast(_PREHASH_ItemID, inventory->getUUID());
+    msg->addBOOLFast(_PREHASH_Running, TRUE);
+    msg->sendReliable(object->getRegion()->getHost());
+
+    return true;
 }
 
+bool LLFloaterRunQueue::startQueue()
+{
+    LLHandle<LLFloaterScriptQueue> hFloater(getDerivedHandle<LLFloaterScriptQueue>());
+    fnQueueAction_t fn = boost::bind(LLFloaterRunQueue::runObjectScripts, hFloater, _1, _2, _3);
+
+    LLCoros::instance().launch("ScriptRunQueue", boost::bind(LLFloaterScriptQueue::objectScriptProcessingQueueCoro,
+        mStartString,
+        hFloater,
+        mObjectList,
+        fn));
+
+    return true;
+}
+
+
 ///----------------------------------------------------------------------------
 /// Class LLFloaterNotRunQueue
 ///----------------------------------------------------------------------------
@@ -618,96 +684,171 @@ LLFloaterNotRunQueue::~LLFloaterNotRunQueue()
 { 
 }
 
-void LLFloaterCompileQueue::removeItemByItemID(const LLUUID& asset_id)
+bool LLFloaterNotRunQueue::stopObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, 
+    const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
 {
-	LL_INFOS() << "LLFloaterCompileQueue::removeItemByAssetID()" << LL_ENDL;
-	for(S32 i = 0; i < mCurrentScripts.size(); )
-	{
-		if(asset_id == mCurrentScripts.at(i)->getUUID())
-		{
-			vector_replace_with_last(mCurrentScripts, mCurrentScripts.begin() + i);
-		}
-		else
-		{
-			++i;
-		}
-	}
-	if(mCurrentScripts.empty())
-	{
-		nextObject();
-	}
+    LLFloaterScriptQueue *that = hfloater.get();
+    if (that)
+    {
+        std::string buffer;
+        buffer = that->getString("NotRunning") + (": ") + inventory->getName();
+        that->addStringMessage(buffer);
+    }
+
+    LLMessageSystem* msg = gMessageSystem;
+    msg->newMessageFast(_PREHASH_SetScriptRunning);
+    msg->nextBlockFast(_PREHASH_AgentData);
+    msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+    msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+    msg->nextBlockFast(_PREHASH_Script);
+    msg->addUUIDFast(_PREHASH_ObjectID, object->getID());
+    msg->addUUIDFast(_PREHASH_ItemID, inventory->getUUID());
+    msg->addBOOLFast(_PREHASH_Running, FALSE);
+    msg->sendReliable(object->getRegion()->getHost());
+
+    return true;
 }
 
-BOOL LLFloaterCompileQueue::startQueue()
+bool LLFloaterNotRunQueue::startQueue()
 {
-	LLViewerRegion* region = gAgent.getRegion();
-	if (region)
-	{
-		std::string lookup_url=region->getCapability("GetCreatorExperiences"); 
-		if(!lookup_url.empty())
-		{
-            LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t success =
-                boost::bind(&LLFloaterCompileQueue::processExperienceIdResults, _1, getKey().asUUID());
+    LLHandle<LLFloaterScriptQueue> hFloater(getDerivedHandle<LLFloaterScriptQueue>());
 
-            LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t failure =
-                boost::bind(&LLFloaterCompileQueue::processExperienceIdResults, LLSD(), getKey().asUUID());
+    fnQueueAction_t fn = boost::bind(&LLFloaterNotRunQueue::stopObjectScripts, hFloater, _1, _2, _3);
+    LLCoros::instance().launch("ScriptQueueNotRun", boost::bind(LLFloaterScriptQueue::objectScriptProcessingQueueCoro,
+        mStartString,
+        hFloater,
+        mObjectList,
+        fn));
 
-            LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(lookup_url,
-                success, failure);
-            return TRUE;
-		}
-	}
-	return nextObject();
+    return true;
 }
 
-/*static*/
-void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID parent)
+///----------------------------------------------------------------------------
+/// Local function definitions
+///----------------------------------------------------------------------------
+void ObjectInventoryFetcher::inventoryChanged(LLViewerObject* object,
+        LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data)
 {
-    LLFloaterCompileQueue* queue = LLFloaterReg::findTypedInstance<LLFloaterCompileQueue>("compile_queue", parent);
-    if (!queue)
-        return;
+    mInventoryList.clear();
+    mInventoryList.assign(inventory->begin(), inventory->end());
+
+    mPump.post(LLSD().with("changed", LLSD::Boolean(true)));
 
-    queue->experienceIdsReceived(result["experience_ids"]);
 }
 
-void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj,
-										  LLInventoryObject::object_list_t* inv)
+void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, LLHandle<LLFloaterScriptQueue> hfloater,
+    object_data_list_t objectList, fnQueueAction_t func)
 {
-	// find all of the lsl, leaving off duplicates. We'll remove
-	// all matching asset uuids on compilation success.
-	LLInventoryObject::object_list_t::const_iterator it = inv->begin();
-	LLInventoryObject::object_list_t::const_iterator end = inv->end();
-	for ( ; it != end; ++it)
-	{
-		if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
-		{
-			LLViewerObject* object = gObjectList.findObject(viewer_obj->getID());
-
-			if (object)
-			{
-				LLInventoryItem* item = (LLInventoryItem*)((LLInventoryObject*)(*it));
-				LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
-				std::string buffer;
-				buffer = getString("NotRunning") + (": ") +item->getName();
-				list->addSimpleElement(buffer, ADD_BOTTOM);
-	
-				LLMessageSystem* msg = gMessageSystem;
-				msg->newMessageFast(_PREHASH_SetScriptRunning);
-				msg->nextBlockFast(_PREHASH_AgentData);
-				msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
-				msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
-				msg->nextBlockFast(_PREHASH_Script);
-				msg->addUUIDFast(_PREHASH_ObjectID, viewer_obj->getID());
-				msg->addUUIDFast(_PREHASH_ItemID, (*it)->getUUID());
-				msg->addBOOLFast(_PREHASH_Running, FALSE);
-				msg->sendReliable(object->getRegion()->getHost());
-			}
-		}
-	}
+    LLCoros::set_consuming(true);
+    LLFloaterScriptQueue * floater(NULL);
+    LLEventMailDrop        maildrop(QUEUE_EVENTPUMP_NAME, true);
+    F32 fetch_timeout = gSavedSettings.getF32("QueueInventoryFetchTimeout");
+
+//     floater = hfloater.get();
+//     floater->addProcessingMessage("Starting",
+//         LLSD()
+//         .with("[START]", action)
+//         .with("[COUNT]", LLSD::Integer(objectList.size())));
+//     floater = NULL;
+
+    for (object_data_list_t::iterator itObj(objectList.begin()); (itObj != objectList.end()); ++itObj)
+    {
+        bool firstForObject = true;
+        LLUUID object_id = (*itObj).mObjectId;
+        LL_INFOS("SCRIPTQ") << "Next object in queue with ID=" << object_id.asString() << LL_ENDL;
 
-	nextObject();	
-}
+        LLPointer<LLViewerObject> obj = gObjectList.findObject(object_id);
+        LLInventoryObject::object_list_t inventory;
+        if (obj)
+        {
+            ObjectInventoryFetcher::ptr_t fetcher(new ObjectInventoryFetcher(maildrop, obj, NULL));
 
-///----------------------------------------------------------------------------
-/// Local function definitions
-///----------------------------------------------------------------------------
+            fetcher->fetchInventory();
+
+            floater = hfloater.get();
+            if (floater)
+            {
+                LLStringUtil::format_map_t args;
+                args["[OBJECT_NAME]"] = (*itObj).mObjectName;
+                floater->addStringMessage(floater->getString("LoadingObjInv", args));
+            }
+
+            LLSD result = llcoro::suspendUntilEventOnWithTimeout(maildrop, fetch_timeout,
+                LLSD().with("timeout", LLSD::Boolean(true)));
+
+            if (result.has("timeout") && result["timeout"].asBoolean())
+            {
+                LL_WARNS("SCRIPTQ") << "Unable to retrieve inventory for object " << object_id.asString() <<
+                    ". Skipping to next object." << LL_ENDL;
+
+                // floater could have been closed
+                floater = hfloater.get();
+                if (floater)
+                {
+                    LLStringUtil::format_map_t args;
+                    args["[OBJECT_NAME]"] = (*itObj).mObjectName;
+                    floater->addStringMessage(floater->getString("Timeout", args));
+                }
+
+                continue;
+            }
+
+            inventory.assign(fetcher->getInventoryList().begin(), fetcher->getInventoryList().end());
+        }
+        else
+        {
+            LL_WARNS("SCRIPTQ") << "Unable to retrieve object with ID of " << object_id <<
+                ". Skipping to next." << LL_ENDL;
+            continue;
+        }
+
+        // TODO: Get the name of the object we are looking at here so that we can display it below.
+        //std::string objName = (dynamic_cast<LLInventoryObject *>(obj.get()))->getName();
+        LL_DEBUGS("SCRIPTQ") << "Object has " << inventory.size() << " items." << LL_ENDL;
+
+        for (LLInventoryObject::object_list_t::iterator itInv = inventory.begin();
+            itInv != inventory.end(); ++itInv)
+        {
+            floater = hfloater.get();
+            if (!floater)
+            {
+                LL_WARNS("SCRIPTQ") << "Script Queue floater closed! Canceling remaining ops" << LL_ENDL;
+                break;
+            }
+
+            // note, we have a smart pointer to the obj above... but if we didn't we'd check that 
+            // it still exists here.
+
+            if (((*itInv)->getType() == LLAssetType::AT_LSL_TEXT))
+            {
+                LL_DEBUGS("SCRIPTQ") << "Inventory item " << (*itInv)->getUUID().asString() << "\"" << (*itInv)->getName() << "\"" << LL_ENDL;
+                if (firstForObject)
+                {
+                    //floater->addStringMessage(objName + ":");
+                    firstForObject = false;
+                }
+
+                if (!func(obj, (*itInv), maildrop))
+                {
+                    continue;
+                }
+            }
+
+            llcoro::suspend();
+        }
+        // Just test to be sure the floater is still present before calling the func
+        if (!hfloater.get())
+        {
+            LL_WARNS("SCRIPTQ") << "Script Queue floater dismissed." << LL_ENDL;
+            break;
+        }
+
+    }
+
+    floater = hfloater.get();
+    if (floater)
+    {
+        floater->addStringMessage("Done");
+        floater->getChildView("close")->setEnabled(TRUE);
+    }
+}
diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h
index 46bcb9746b001b87e8ac3a078cf88108a0a2a5ce..1b3d8f83a0bb0f3a3ab24fc315ff18270cb6963d 100644
--- a/indra/newview/llcompilequeue.h
+++ b/indra/newview/llcompilequeue.h
@@ -37,6 +37,8 @@
 
 #include "llviewerinventory.h"
 
+#include "llevents.h"
+
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLFloaterScriptQueue
 //
@@ -48,7 +50,7 @@
 // scripts manipulated.
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-class LLFloaterScriptQueue : public LLFloater, public LLVOInventoryListener
+class LLFloaterScriptQueue : public LLFloater/*, public LLVOInventoryListener*/
 {
 public:
 	LLFloaterScriptQueue(const LLSD& key);
@@ -59,34 +61,23 @@ class LLFloaterScriptQueue : public LLFloater, public LLVOInventoryListener
 	void setMono(bool mono) { mMono = mono; }
 	
 	// addObject() accepts an object id.
-	void addObject(const LLUUID& id);
+	void addObject(const LLUUID& id, std::string name);
 
 	// start() returns TRUE if the queue has started, otherwise FALSE.
 	BOOL start();
 	
-protected:
-	// This is the callback method for the viewer object currently
-	// being worked on.
-	/*virtual*/ void inventoryChanged(LLViewerObject* obj,
-								 LLInventoryObject::object_list_t* inv,
-								 S32 serial_num,
-								 void* queue);
-	
-	// This is called by inventoryChanged
-	virtual void handleInventory(LLViewerObject* viewer_obj,
-								LLInventoryObject::object_list_t* inv) = 0;
+    void addProcessingMessage(const std::string &message, const LLSD &args);
+    void addStringMessage(const std::string &message);
 
+    std::string getStartString() const { return mStartString; }
+
+protected:
 	static void onCloseBtn(void* user_data);
 
 	// returns true if this is done
 	BOOL isDone() const;
 
-	virtual BOOL startQueue();
-
-	// go to the next object. If no objects left, it falls out
-	// silently and waits to be killed by the deleteIfDone() callback.
-	BOOL nextObject();
-	BOOL popNext();
+	virtual bool startQueue() = 0;
 
 	void setStartString(const std::string& s) { mStartString = s; }
 
@@ -96,12 +87,23 @@ class LLFloaterScriptQueue : public LLFloater, public LLVOInventoryListener
 	LLButton* mCloseBtn;
 
 	// Object Queue
-	std::vector<LLUUID> mObjectIDs;
+	struct ObjectData
+	{
+		LLUUID mObjectId;
+		std::string mObjectName;
+	};
+	typedef std::vector<ObjectData> object_data_list_t;
+
+	object_data_list_t mObjectList;
 	LLUUID mCurrentObjectID;
 	bool mDone;
 
 	std::string mStartString;
 	bool mMono;
+
+    typedef boost::function<bool(const LLPointer<LLViewerObject> &, LLInventoryObject*, LLEventPump &)>   fnQueueAction_t;
+    static void objectScriptProcessingQueueCoro(std::string action, LLHandle<LLFloaterScriptQueue> hfloater, object_data_list_t objectList, fnQueueAction_t func);
+
 };
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -122,8 +124,6 @@ class LLFloaterCompileQueue : public LLFloaterScriptQueue
 {
 	friend class LLFloaterReg;
 public:
-	// remove any object in mScriptScripts with the matching uuid.
-	void removeItemByItemID(const LLUUID& item_id);
 	
 	void experienceIdsReceived( const LLSD& content );
 	BOOL hasExperience(const LLUUID& id)const;
@@ -132,27 +132,17 @@ class LLFloaterCompileQueue : public LLFloaterScriptQueue
 	LLFloaterCompileQueue(const LLSD& key);
 	virtual ~LLFloaterCompileQueue();
 	
-	// This is called by inventoryChanged
-	virtual void handleInventory(LLViewerObject* viewer_obj,
-								LLInventoryObject::object_list_t* inv);
-
-	static void requestAsset(struct LLScriptQueueData* datap, const LLSD& experience);
+	virtual bool startQueue();
 
+    static bool processScript(LLHandle<LLFloaterCompileQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
 
-    static void finishLSLUpload(LLUUID itemId, LLUUID taskId, LLUUID newAssetId, LLSD response, std::string scriptName, LLUUID queueId);
-
-	// This is the callback for when each script arrives
-	static void scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
-								LLAssetType::EType type,
-								void* user_data, S32 status, LLExtStat ext_status);
-
-	virtual BOOL startQueue();
-protected:
-	LLViewerInventoryItem::item_array_t mCurrentScripts;
+    //bool checkAssetId(const LLUUID &assetId);
+    static void handleHTTPResponse(std::string pumpName, const LLSD &expresult);
+    static void handleScriptRetrieval(LLVFS *vfs, const LLUUID& assetId, LLAssetType::EType type, void* userData, S32 status, LLExtStat extStatus);
 
 private:
     static void processExperienceIdResults(LLSD result, LLUUID parent);
-
+    //uuid_list_t mAssetIds;  // list of asset IDs processed.
 	uuid_list_t mExperienceIds;
 };
 
@@ -169,9 +159,9 @@ class LLFloaterResetQueue : public LLFloaterScriptQueue
 	LLFloaterResetQueue(const LLSD& key);
 	virtual ~LLFloaterResetQueue();
 	
-	// This is called by inventoryChanged
-	virtual void handleInventory(LLViewerObject* viewer_obj,
-								LLInventoryObject::object_list_t* inv);
+    static bool resetObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
+
+    virtual bool startQueue();
 };
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -186,10 +176,10 @@ class LLFloaterRunQueue : public LLFloaterScriptQueue
 protected:
 	LLFloaterRunQueue(const LLSD& key);
 	virtual ~LLFloaterRunQueue();
-	
-	// This is called by inventoryChanged
-	virtual void handleInventory(LLViewerObject* viewer_obj,
-								LLInventoryObject::object_list_t* inv);
+
+    static bool runObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
+
+    virtual bool startQueue();
 };
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -205,9 +195,9 @@ class LLFloaterNotRunQueue : public LLFloaterScriptQueue
 	LLFloaterNotRunQueue(const LLSD& key);
 	virtual ~LLFloaterNotRunQueue();
 	
-	// This is called by inventoryChanged
-	virtual void handleInventory(LLViewerObject* viewer_obj,
-								LLInventoryObject::object_list_t* inv);
+    static bool stopObjectScripts(LLHandle<LLFloaterScriptQueue> hfloater, const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump);
+
+    virtual bool startQueue();
 };
 
 #endif // LL_LLCOMPILEQUEUE_H
diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp
index 33675bd261e15348b1aae04c5e05d7334cc0b4ad..b716a7654369f39b00f7465d5fd995e333c88a8a 100644
--- a/indra/newview/lldrawpoolterrain.cpp
+++ b/indra/newview/lldrawpoolterrain.cpp
@@ -62,28 +62,15 @@ LLDrawPoolTerrain::LLDrawPoolTerrain(LLViewerTexture *texturep) :
 	LLFacePool(POOL_TERRAIN),
 	mTexturep(texturep)
 {
-	U32 format = GL_ALPHA8;
-	U32 int_format = GL_ALPHA;
-
 	// Hack!
 	sDetailScale = 1.f/gSavedSettings.getF32("RenderTerrainScale");
 	sDetailMode = gSavedSettings.getS32("RenderTerrainDetail");
-	mAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", 
-													FTT_LOCAL_FILE,
-													TRUE, LLGLTexture::BOOST_UI, 
-													LLViewerTexture::FETCHED_TEXTURE,
-													format, int_format,
-													LLUUID("e97cf410-8e61-7005-ec06-629eba4cd1fb"));
+	mAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD);
 
 	//gGL.getTexUnit(0)->bind(mAlphaRampImagep.get());
 	mAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
 
-	m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", 
-													FTT_LOCAL_FILE,
-													TRUE, LLGLTexture::BOOST_UI, 
-													LLViewerTexture::FETCHED_TEXTURE,
-													format, int_format,
-													LLUUID("38b86f85-2575-52a9-a531-23108d8da837"));
+	m2DAlphaRampImagep = LLViewerTextureManager::getFetchedTexture(IMG_ALPHA_GRAD_2D);
 
 	//gGL.getTexUnit(0)->bind(m2DAlphaRampImagep.get());
 	m2DAlphaRampImagep->setAddressMode(LLTexUnit::TAM_CLAMP);
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index 7178042b326f1192f2e101238ef046519ce329b3..cc77b407ae60737e79323d853c06ea61cda11e84 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -40,12 +40,14 @@
 #include "llcorehttputil.h"
 #include "lleventfilter.h"
 
+#include "boost/make_shared.hpp"
+
 namespace LLEventPolling
 {
 namespace Details
 {
 
-    class LLEventPollImpl
+    class LLEventPollImpl: public boost::enable_shared_from_this<LLEventPollImpl>
     {
     public:
         LLEventPollImpl(const LLHost &sender);
@@ -113,7 +115,7 @@ namespace Details
         {
             std::string coroname =
                 LLCoros::instance().launch("LLEventPollImpl::eventPollCoro",
-                boost::bind(&LLEventPollImpl::eventPollCoro, this, url));
+                boost::bind(&LLEventPollImpl::eventPollCoro, this->shared_from_this(), url));
             LL_INFOS("LLEventPollImpl") << coroname << " with  url '" << url << LL_ENDL;
         }
     }
@@ -273,8 +275,7 @@ namespace Details
 LLEventPoll::LLEventPoll(const std::string&	poll_url, const LLHost& sender):
     mImpl()
 { 
-    mImpl = boost::unique_ptr<LLEventPolling::Details::LLEventPollImpl>
-            (new LLEventPolling::Details::LLEventPollImpl(sender));
+    mImpl = boost::make_shared<LLEventPolling::Details::LLEventPollImpl>(sender);
     mImpl->start(poll_url);
 }
 
diff --git a/indra/newview/lleventpoll.h b/indra/newview/lleventpoll.h
index e2afd9226bcf9cbb0163bc1401b19a64992426b6..65766dbb2a8bd6eb1268e2a6ad38695896ecd6c8 100644
--- a/indra/newview/lleventpoll.h
+++ b/indra/newview/lleventpoll.h
@@ -27,12 +27,6 @@
 #ifndef LL_LLEVENTPOLL_H
 #define LL_LLEVENTPOLL_H
 
-#include "boost/move/unique_ptr.hpp"
-
-namespace boost
-{
-    using ::boost::movelib::unique_ptr; // move unique_ptr into the boost namespace.
-}
 
 class LLHost;
 
@@ -57,7 +51,7 @@ class LLEventPoll
 
 
 private:
-    boost::unique_ptr<LLEventPolling::Details::LLEventPollImpl>    mImpl;
+    boost::shared_ptr<LLEventPolling::Details::LLEventPollImpl>  mImpl;
 };
 
 
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 7f1c981a3c71a949b1b473051d3c45d9f9073bef..d4ba230feb24e60ead6609a40c539e332fef5657 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -809,3 +809,62 @@ void LLFeatureManager::applyBaseMasks()
 		maskFeatures("safe");
 	}
 }
+
+LLSD LLFeatureManager::getRecommendedSettingsMap()
+{
+	// Create the map and fill it with the hardware recommended settings.
+	// It's needed to create an initial Default graphics preset (MAINT-6435).
+	// The process is similar to the one LLFeatureManager::applyRecommendedSettings() does.
+
+	LLSD map(LLSD::emptyMap());
+
+	loadGPUClass();
+	U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
+	LL_INFOS("RenderInit") << "Getting the map of recommended settings for level " << level << LL_ENDL;
+
+	applyBaseMasks();
+	std::string features(isValidGraphicsLevel(level) ? getNameForGraphicsLevel(level) : "Low");
+
+	maskFeatures(features);
+
+	LLControlVariable* ctrl = gSavedSettings.getControl("RenderQualityPerformance"); // include the quality value for correct preset loading   
+	map["RenderQualityPerformance"]["Value"] = (LLSD::Integer)level;
+	map["RenderQualityPerformance"]["Comment"] = ctrl->getComment();;
+	map["RenderQualityPerformance"]["Persist"] = 1;
+	map["RenderQualityPerformance"]["Type"] = LLControlGroup::typeEnumToString(ctrl->type());
+
+
+
+	for (feature_map_t::iterator mIt = mFeatures.begin(); mIt != mFeatures.end(); ++mIt)
+	{
+		LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
+		if (ctrl == NULL)
+		{
+			LL_WARNS() << "AHHH! Control setting " << mIt->first << " does not exist!" << LL_ENDL;
+			continue;
+		}
+
+		if (ctrl->isType(TYPE_BOOLEAN))
+		{
+			map[mIt->first]["Value"] = (LLSD::Boolean)getRecommendedValue(mIt->first);
+		}
+		else if (ctrl->isType(TYPE_S32) || ctrl->isType(TYPE_U32))
+		{
+			map[mIt->first]["Value"] = (LLSD::Integer)getRecommendedValue(mIt->first);
+		}
+		else if (ctrl->isType(TYPE_F32))
+		{
+			map[mIt->first]["Value"] = (LLSD::Real)getRecommendedValue(mIt->first);
+		}
+		else
+		{
+			LL_WARNS() << "AHHH! Control variable is not a numeric type!" << LL_ENDL;
+			continue;
+		}
+		map[mIt->first]["Comment"] = ctrl->getComment();;
+		map[mIt->first]["Persist"] = 1;
+		map[mIt->first]["Type"] = LLControlGroup::typeEnumToString(ctrl->type());
+	}
+	
+	return map;
+}
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 12ea691b491f0363ab19d6f62b98c1b69e253481..c3d87cea0bf8a7c0f3f42261ccbfc3b99200e895 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -157,7 +157,9 @@ class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManag
 
 	// load the dynamic GPU/feature table from a website
 	void fetchHTTPTables();
-	
+
+	LLSD getRecommendedSettingsMap();
+
 protected:
 	bool loadGPUClass();
 
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 7da65a9a7c5e7376406fc7e7bb36bc1ce566e826..d842106146e0b3198bd1b5deaf1eabe7f487b86c 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -528,7 +528,8 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
 			LLInventoryItem* item = gInventory.getItem(*it);
 			if(item  && item->getInventoryType() == LLInventoryType::IT_GESTURE)
 			{
-				LLClipboard::instance().addToClipboard(item->getUUID(),LLAssetType::AT_GESTURE);
+				LLWString item_name = utf8str_to_wstring(item->getName());
+				LLClipboard::instance().addToClipboard(item_name, 0, item_name.size());
 			}
 		}
 	}
diff --git a/indra/newview/llfloaterimnearbychathandler.cpp b/indra/newview/llfloaterimnearbychathandler.cpp
index 1f85c5ac1b75719610d3e25c25de4b2458b35814..9fd731ed5630e823b5df16b85086e93f09ce8670 100644
--- a/indra/newview/llfloaterimnearbychathandler.cpp
+++ b/indra/newview/llfloaterimnearbychathandler.cpp
@@ -601,12 +601,31 @@ void LLFloaterIMNearbyChatHandler::processChat(const LLChat& chat_msg,
 			toast_msg = chat_msg.mText;
 		}
 
+		bool chat_overlaps = false;
+		if(nearby_chat->getChatHistory())
+		{
+			LLRect chat_rect = nearby_chat->getChatHistory()->calcScreenRect();
+			for (std::list<LLView*>::const_iterator child_iter = gFloaterView->getChildList()->begin();
+				 child_iter != gFloaterView->getChildList()->end(); ++child_iter)
+			{
+				LLView *view = *child_iter;
+				const LLRect& rect = view->getRect();
+				if(view->isInVisibleChain() && (rect.overlaps(chat_rect)))
+				{
+					if(!nearby_chat->getChatHistory()->hasAncestor(view))
+					{
+						chat_overlaps = true;
+					}
+					break;
+				}
+			}
+		}
 		//Don't show nearby toast, if conversation is visible and selected
 		if ((nearby_chat->hasFocus()) ||
 			(LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized()) ||
-		    ((im_box->getSelectedSession().isNull() &&
-				((LLFloater::isVisible(im_box) && !im_box->isMinimized() && im_box->isFrontmost())
-						|| (LLFloater::isVisible(nearby_chat) && !nearby_chat->isMinimized() && nearby_chat->isFrontmost())))))
+		    ((im_box->getSelectedSession().isNull() && !chat_overlaps &&
+				((LLFloater::isVisible(im_box) && !nearby_chat->isTornOff() && !im_box->isMinimized())
+						|| (LLFloater::isVisible(nearby_chat) && nearby_chat->isTornOff() && !nearby_chat->isMinimized())))))
 		{
 			if(nearby_chat->isMessagePaneExpanded())
 			{
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 357b635594367d21e08bf9f6d14862565e2e5b69..2cd94c592a41128ea42ff14767c00bdfbd4c10dc 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -1094,6 +1094,12 @@ void LLFloaterIMSessionTab::saveCollapsedState()
 		gSavedPerAccountSettings.setBOOL("NearbyChatIsNotCollapsed", isMessagePaneExpanded());
 	}
 }
+
+LLView* LLFloaterIMSessionTab::getChatHistory()
+{
+	return mChatHistory;
+}
+
 BOOL LLFloaterIMSessionTab::handleKeyHere(KEY key, MASK mask )
 {
 	BOOL handled = FALSE;
diff --git a/indra/newview/llfloaterimsessiontab.h b/indra/newview/llfloaterimsessiontab.h
index e7b05a584bd998ab11f2911a943643d806d62450..1b4922fd73105e715dfcb58d0b8b1665d0fe1929 100644
--- a/indra/newview/llfloaterimsessiontab.h
+++ b/indra/newview/llfloaterimsessiontab.h
@@ -103,6 +103,8 @@ class LLFloaterIMSessionTab
 	void restoreFloater();
 	void saveCollapsedState();
 
+	LLView* getChatHistory();
+
 protected:
 
 	// callback for click on any items of the visual states menu
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 135bbb335e41fa9e03cc914566eb492eb18f524c..4a5732aecfed578cf0ab0f6d72a16d2f38274b99 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -42,6 +42,8 @@
 #include "llfloaterperms.h"
 #include "llviewercontrol.h"
 #include "llviewermenufile.h"	// upload_new_resource()
+#include "llstatusbar.h"	// can_afford_transaction()
+#include "llnotificationsutil.h"
 #include "lluictrlfactory.h"
 #include "llstring.h"
 #include "lleconomy.h"
@@ -161,12 +163,15 @@ void LLFloaterNameDesc::onBtnOK( )
 	
 	LLAssetStorage::LLStoreAssetCallback callback = NULL;
 	S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass).
-	void *nruserdata = NULL;
-	std::string display_name = LLStringUtil::null;
 
-    LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
+    if (can_afford_transaction(expected_upload_cost))
+    {
+        void *nruserdata = NULL;
+        std::string display_name = LLStringUtil::null;
+
+        LLResourceUploadInfo::ptr_t uploadInfo(new LLNewFileResourceUploadInfo(
             mFilenameAndPath,
-            getChild<LLUICtrl>("name_form")->getValue().asString(), 
+            getChild<LLUICtrl>("name_form")->getValue().asString(),
             getChild<LLUICtrl>("description_form")->getValue().asString(), 0,
             LLFolderType::FT_NONE, LLInventoryType::IT_NONE,
             LLFloaterPerms::getNextOwnerPerms("Uploads"),
@@ -174,7 +179,14 @@ void LLFloaterNameDesc::onBtnOK( )
             LLFloaterPerms::getEveryonePerms("Uploads"),
             expected_upload_cost));
 
-    upload_new_resource(uploadInfo, callback, nruserdata);
+        upload_new_resource(uploadInfo, callback, nruserdata);
+    }
+    else
+    {
+        LLSD args;
+        args["COST"] = llformat("%d", expected_upload_cost);
+        LLNotificationsUtil::add("ErrorTextureCannotAfford", args);
+    }
 
 	closeFloater(false);
 }
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 4eacd728c36b95ab8773ef1ea1c60edc5f4d1824..843dbbf25efd7038b0e353a76cab74187d75217c 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -412,6 +412,11 @@ void LLFloaterRegionInfo::processRegionInfo(LLMessageSystem* msg)
 	panel->getChild<LLUICtrl>("object_bonus_spin")->setValue(LLSD(object_bonus_factor) );
 	panel->getChild<LLUICtrl>("access_combo")->setValue(LLSD(sim_access) );
 
+	LLPanelRegionGeneralInfo* panel_general = LLFloaterRegionInfo::getPanelGeneral();
+	if (panel)
+	{
+		panel_general->setObjBonusFactor(object_bonus_factor);
+	}
 
  	// detect teen grid for maturity
 
@@ -464,6 +469,16 @@ LLPanelEstateCovenant* LLFloaterRegionInfo::getPanelCovenant()
 	return panel;
 }
 
+// static
+LLPanelRegionGeneralInfo* LLFloaterRegionInfo::getPanelGeneral()
+{
+	LLFloaterRegionInfo* floater = LLFloaterReg::getTypedInstance<LLFloaterRegionInfo>("region_info");
+	if (!floater) return NULL;
+	LLTabContainer* tab = floater->getChild<LLTabContainer>("region_panels");
+	LLPanelRegionGeneralInfo* panel = (LLPanelRegionGeneralInfo*)tab->getChild<LLPanel>("General");
+	return panel;
+}
+
 // static
 LLPanelRegionTerrainInfo* LLFloaterRegionInfo::getPanelRegionTerrain()
 {
@@ -717,7 +732,42 @@ BOOL LLPanelRegionGeneralInfo::postBuild()
 	childSetAction("im_btn", onClickMessage, this);
 //	childSetAction("manage_telehub_btn", onClickManageTelehub, this);
 
-	return LLPanelRegionInfo::postBuild();
+	LLUICtrl* apply_btn = findChild<LLUICtrl>("apply_btn");
+	if (apply_btn)
+	{
+		apply_btn->setCommitCallback(boost::bind(&LLPanelRegionGeneralInfo::onBtnSet, this));
+	}
+
+	refresh();
+	return TRUE;
+}
+
+void LLPanelRegionGeneralInfo::onBtnSet()
+{
+	if(mObjBonusFactor == getChild<LLUICtrl>("object_bonus_spin")->getValue().asReal())
+	{
+		if (sendUpdate())
+		{
+			disableButton("apply_btn");
+		}
+	}
+	else
+	{
+		LLNotificationsUtil::add("ChangeObjectBonusFactor", LLSD(), LLSD(), boost::bind(&LLPanelRegionGeneralInfo::onChangeObjectBonus, this, _1, _2));
+	}
+}
+
+bool LLPanelRegionGeneralInfo::onChangeObjectBonus(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (option == 0)
+	{
+		if (sendUpdate())
+		{
+			disableButton("apply_btn");
+		}
+	}
+	return false;
 }
 
 void LLPanelRegionGeneralInfo::onClickKick()
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 46f2b42137a81a2735f10c82385e48aee209988d..dbb0ad05e92323d2809bfffa9eb0c51036c99638 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -95,6 +95,7 @@ class LLFloaterRegionInfo : public LLFloater
 	static LLPanelEstateCovenant* getPanelCovenant();
 	static LLPanelRegionTerrainInfo* getPanelRegionTerrain();
 	static LLPanelRegionExperiences* getPanelExperiences();
+	static LLPanelRegionGeneralInfo* getPanelGeneral();
 
 	// from LLPanel
 	virtual void refresh();
@@ -183,6 +184,9 @@ class LLPanelRegionGeneralInfo : public LLPanelRegionInfo
 	// LLPanel
 	virtual BOOL postBuild();
 	
+	void onBtnSet();
+	void setObjBonusFactor(F32 object_bonus_factor) {mObjBonusFactor = object_bonus_factor;}
+
 protected:
 	virtual BOOL sendUpdate();
 	void onClickKick();
@@ -191,6 +195,9 @@ class LLPanelRegionGeneralInfo : public LLPanelRegionInfo
 	bool onKickAllCommit(const LLSD& notification, const LLSD& response);
 	static void onClickMessage(void* userdata);
 	bool onMessageCommit(const LLSD& notification, const LLSD& response);
+	bool onChangeObjectBonus(const LLSD& notification, const LLSD& response);
+
+	F32 mObjBonusFactor;
 
 };
 
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index afec981d5652b6da1459da24c4bf93af6299b3a3..b906671c7fd1b0ce387739904dfd142c6d740225 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -1417,6 +1417,20 @@ void LLFloaterSnapshot::postPanelSwitch()
 	instance->impl.setStatus(Impl::STATUS_READY);
 }
 
+// static
+void LLFloaterSnapshot::inventorySaveFailed()
+{
+    LLFloaterSnapshot* instance = findInstance();
+    if (!instance)
+    {
+        llassert(instance != NULL);
+        return;
+    }
+
+    instance->impl.updateControls(instance);
+    instance->impl.setStatus(Impl::STATUS_FINISHED, false, "inventory");
+}
+
 // static
 LLPointer<LLImageFormatted> LLFloaterSnapshot::getImageData()
 {
diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h
index 0bb9474bb5de72acac21028abb00c17d566a6ca2..eb3a94999b0842c6365da43b5c29732b3a379651 100644
--- a/indra/newview/llfloatersnapshot.h
+++ b/indra/newview/llfloatersnapshot.h
@@ -61,6 +61,7 @@ class LLFloaterSnapshot : public LLFloater
 	static BOOL saveLocal();
 	static void postSave();
 	static void postPanelSwitch();
+	static void inventorySaveFailed();
 	static LLPointer<LLImageFormatted> getImageData();
 	static const LLVector3d& getPosTakenGlobal();
 	static void setAgentEmail(const std::string& email);
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index ece3e10faabb3779ac8f18a6bc9c9b6ee435e668..c67feb8158ba72f95199cd4d157278911a6dd5fd 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -963,10 +963,10 @@ F32 LLFloaterWorldMap::getDistanceToDestination(const LLVector3d &destination,
 }
 
 
-void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui)
+void LLFloaterWorldMap::clearLocationSelection(BOOL clear_ui, BOOL dest_reached)
 {
 	LLCtrlListInterface *list = mListSearchResults;
-	if (list)
+	if (list && (!dest_reached || (list->getItemCount() == 1)))
 	{
 		list->operateOnAll(LLCtrlListInterface::OP_DELETE);
 	}
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 7ce8dae9a9a8304162dc0419a180e5b96995e646..c5801c88194be840e4a15acc06e6ab0efd7f8c76 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -94,7 +94,7 @@ class LLFloaterWorldMap : public LLFloater
 	// A z_attenuation of 0.0f collapses the distance into the X-Y plane
 	F32				getDistanceToDestination(const LLVector3d& pos_global, F32 z_attenuation = 0.5f) const;
 
-	void			clearLocationSelection(BOOL clear_ui = FALSE);
+	void			clearLocationSelection(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);
 	void			clearAvatarSelection(BOOL clear_ui = FALSE);
 	void			clearLandmarkSelection(BOOL clear_ui = FALSE);
 
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
index a12ec390af477035e79523785c88b3b511d1ad58..b64df2bd47176affd6fcfc24bb7de8f2f3c24d1f 100644
--- a/indra/newview/llinspectremoteobject.cpp
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -181,7 +181,7 @@ void LLInspectRemoteObject::update()
 	getChild<LLUICtrl>("map_btn")->setEnabled(! mSLurl.empty());
 
 	// disable the Block button if we don't have the object ID (will this ever happen?)
-	getChild<LLUICtrl>("block_btn")->setEnabled(! mObjectID.isNull());
+	getChild<LLUICtrl>("block_btn")->setEnabled(!mObjectID.isNull() && !LLMuteList::getInstance()->isMuted(mObjectID));
 }
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index e3cb4d57ef359b7ee8c12eec27be60171aa92fd9..d8f019374e234d2529b1d39f0a49dd19d579db20 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -287,7 +287,11 @@ void update_marketplace_category(const LLUUID& cur_uuid, bool perform_consistenc
                 LL_INFOS("SLM") << "Unlist and clear version folder as the version folder is not at the right place anymore!!" << LL_ENDL;
                 LLMarketplaceData::instance().setVersionFolder(listing_uuid, LLUUID::null,1);
             }
-            else if (version_folder_uuid.notNull() && LLMarketplaceData::instance().getActivationState(version_folder_uuid) && (count_descendants_items(version_folder_uuid) == 0) && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))
+            else if (version_folder_uuid.notNull()
+                     && gInventory.isCategoryComplete(version_folder_uuid)
+                     && LLMarketplaceData::instance().getActivationState(version_folder_uuid)
+                     && (count_descendants_items(version_folder_uuid) == 0)
+                     && !LLMarketplaceData::instance().isUpdating(version_folder_uuid,version_depth))
             {
                 LL_INFOS("SLM") << "Unlist as the version folder is empty of any item!!" << LL_ENDL;
                 LLNotificationsUtil::add("AlertMerchantVersionFolderEmpty");
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 8d21fda8f918ea694b0046aa890cc8039873223e..53b2ca2b74a12b4ea241778edb37897409b8d3a5 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -64,6 +64,9 @@
 #include "llurllineeditorctrl.h"
 #include "llagentui.h"
 
+#include "llmenuoptionpathfindingrebakenavmesh.h"
+#include "llpathfindingmanager.h"
+
 //============================================================================
 /*
  * "ADD LANDMARK" BUTTON UPDATING LOGIC
@@ -1194,6 +1197,18 @@ bool LLLocationInputCtrl::onLocationContextMenuItemEnabled(const LLSD& userdata)
 	return false;
 }
 
+void LLLocationInputCtrl::callbackRebakeRegion(const LLSD& notification, const LLSD& response)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (option == 0) // OK
+	{
+		if (LLPathfindingManager::getInstance() != NULL)
+		{
+			LLMenuOptionPathfindingRebakeNavmesh::getInstance()->sendRequestRebakeNavmesh();
+		}
+	}
+}
+
 void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
 {
 	switch (icon)
@@ -1211,6 +1226,16 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon)
 		LLNotificationsUtil::add("NoBuild");
 		break;
 	case PATHFINDING_DIRTY_ICON:
+		if (LLPathfindingManager::getInstance() != NULL)
+		{
+			LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance();
+			if (rebakeInstance && rebakeInstance->canRebakeRegion() && (rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available))
+			{
+				LLNotificationsUtil::add("PathfindingDirtyRebake", LLSD(), LLSD(),
+										 boost::bind(&LLLocationInputCtrl::callbackRebakeRegion, this, _1, _2));
+				break;
+			}
+		}
 		LLNotificationsUtil::add("PathfindingDirty");
 		break;
 	case PATHFINDING_DISABLED_ICON:
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index cd6fd24077862e26a956e8656dfe8a12e647ad4d..da71bab6c1bddc09030ae4f1588f97da072e98b7 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -166,6 +166,7 @@ class LLLocationInputCtrl
 	// callbacks
 	bool					onLocationContextMenuItemEnabled(const LLSD& userdata);
 	void 					onLocationContextMenuItemClicked(const LLSD& userdata);
+	void					callbackRebakeRegion(const LLSD& notification, const LLSD& response);
 	void					onParcelIconClick(EParcelIcon icon);
 
 	void                    createNavMeshStatusListenerForCurrentRegion();
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 4116e38f11193b964fbff5acbbca4ac3111360f4..639641d1c25bf07c71e75322bba7a6724034558a 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -904,7 +904,7 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
 	std::string stuff = matches[IDX_STUFF];
 	boost::match_results<std::string::const_iterator> name_and_text;
 	if (!boost::regex_match(stuff, name_and_text, NAME_AND_TEXT)) return false;
-	
+
 	bool has_name = name_and_text[IDX_NAME].matched;
 	std::string name = name_and_text[IDX_NAME];
 
@@ -956,7 +956,6 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im, const LLSD& parse_params
 		im[LL_IM_FROM] = name;
 	}
 	
-
 	im[LL_IM_TEXT] = name_and_text[IDX_TEXT];
 	return true;  //parsed name and message text, maybe have a timestamp too
 }
diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp
index 0aaed3e286768ac9495ddc496a0d5517bc1985cc..54f8fb93d0e7ff5223c71e7a18be73f7cae2f6c5 100644
--- a/indra/newview/llmeshrepository.cpp
+++ b/indra/newview/llmeshrepository.cpp
@@ -3935,7 +3935,7 @@ LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
 	{
 		LLMutexLock lock(mHeaderMutex);
 		mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
-		if (iter != mMeshHeader.end())
+		if (iter != mMeshHeader.end() && mMeshHeaderSize[mesh_id] > 0)
 		{
 			return iter->second;
 		}
@@ -3956,10 +3956,11 @@ void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3
 
 S32 LLMeshRepository::getMeshSize(const LLUUID& mesh_id, S32 lod)
 {
-	if (mThread)
+	if (mThread && mesh_id.notNull())
 	{
+		LLMutexLock lock(mThread->mHeaderMutex);
 		LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
-		if (iter != mThread->mMeshHeader.end())
+		if (iter != mThread->mMeshHeader.end() && mThread->mMeshHeaderSize[mesh_id] > 0)
 		{
 			LLSD& header = iter->second;
 
@@ -4031,9 +4032,30 @@ void LLMeshRepository::uploadError(LLSD& args)
 	mUploadErrorQ.push(args);
 }
 
+F32 LLMeshRepository::getStreamingCost(LLUUID mesh_id, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)
+{
+    if (mThread && mesh_id.notNull())
+    {
+        LLMutexLock lock(mThread->mHeaderMutex);
+        LLMeshRepoThread::mesh_header_map::iterator iter = mThread->mMeshHeader.find(mesh_id);
+        if (iter != mThread->mMeshHeader.end() && mThread->mMeshHeaderSize[mesh_id] > 0)
+        {
+            return getStreamingCost(iter->second, radius, bytes, bytes_visible, lod, unscaled_value);
+        }
+    }
+    return 0.f;
+}
+
 //static
 F32 LLMeshRepository::getStreamingCost(LLSD& header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod, F32 *unscaled_value)
 {
+	if (header.has("404")
+		|| !header.has("lowest_lod")
+		|| (header.has("version") && header["version"].asInteger() > MAX_MESH_VERSION))
+	{
+		return 0.f;
+	}
+
 	F32 max_distance = 512.f;
 
 	F32 dlowest = llmin(radius/0.03f, max_distance);
diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h
index d35c44397b02eb35267d9a83f76c0637efed0f3a..a7620425979617b06d53df68012baf1ad187d82c 100644
--- a/indra/newview/llmeshrepository.h
+++ b/indra/newview/llmeshrepository.h
@@ -475,6 +475,7 @@ class LLMeshRepository
 	
 	static LLDeadmanTimer sQuiescentTimer;		// Time-to-complete-mesh-downloads after significant events
 
+	F32 getStreamingCost(LLUUID mesh_id, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1, F32 *unscaled_value = NULL);
 	static F32 getStreamingCost(LLSD& header, F32 radius, S32* bytes = NULL, S32* visible_bytes = NULL, S32 detail = -1, F32 *unscaled_value = NULL);
 
 	LLMeshRepository();
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 4229419fcea9438ea69af57b036b0d9522d33bbb..c779ba5cdd68006583e75e5592472e63fc40039c 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -150,6 +150,7 @@ BOOL LLPanelMainInventory::postBuild()
 	LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>("Recent Items");
 	if (recent_items_panel)
 	{
+		// assign default values until we will be sure that we have setting to restore
 		recent_items_panel->setSinceLogoff(TRUE);
 		recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
 		recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
@@ -181,6 +182,7 @@ BOOL LLPanelMainInventory::postBuild()
 				LLParamSDParser parser;
 				parser.readSD(recent_items, p);
 				recent_items_panel->getFilter().fromParams(p);
+				recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
 			}
 		}
 
@@ -372,7 +374,14 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata)
 	}
 
 	getActivePanel()->setSortOrder(sort_order_mask);
-	gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
+    if ("Recent Items" == getActivePanel()->getName())
+    {
+        gSavedSettings.setU32("RecentItemsSortOrder", sort_order_mask);
+    }
+    else
+    {
+        gSavedSettings.setU32("InventorySortOrder", sort_order_mask);
+    }
 }
 
 // static
@@ -1143,6 +1152,15 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
 	}
 }
 
+void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility )
+{
+	if(!new_visibility)
+	{
+		mMenuAdd->setVisible(FALSE);
+		getActivePanel()->getRootFolder()->finishRenamingItem();
+	}
+}
+
 bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata)
 {
 	LLFolderViewItem* current_item = getActivePanel()->getRootFolder()->getCurSelectedItem();
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 21f0ca0caeb47215effcd22555898d79b71c0e8e..290e2e5f477d4d47757b0129c689084d085e30c6 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -72,6 +72,7 @@ class LLPanelMainInventory : public LLPanel, LLInventoryObserver
 									   std::string& tooltip_msg);
 	/*virtual*/ void changed(U32);
 	/*virtual*/ void draw();
+	/*virtual*/ void 	onVisibilityChange ( BOOL new_visibility );
 
 	LLInventoryPanel* getPanel() { return mActivePanel; }
 	LLInventoryPanel* getActivePanel() { return mActivePanel; }
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 73b928f0142c3aca0921e6c2391b2b2b4d7f349b..bc177abc57f2f377dfcab06a4195cc56fe2ac347 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -611,9 +611,11 @@ BOOL LLPanelPeople::postBuild()
 	mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
 	mOnlineFriendList->setShowIcons("FriendsListShowIcons");
 	mOnlineFriendList->showPermissions("FriendsListShowPermissions");
+	mOnlineFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
 	mAllFriendList->setNoItemsCommentText(getString("no_friends"));
 	mAllFriendList->setShowIcons("FriendsListShowIcons");
 	mAllFriendList->showPermissions("FriendsListShowPermissions");
+	mAllFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
 
 	LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);
 	nearby_tab->setVisibleCallback(boost::bind(&Updater::setActive, mNearbyListUpdater, _2));
@@ -622,6 +624,7 @@ BOOL LLPanelPeople::postBuild()
 	mNearbyList->setNoItemsMsg(getString("no_one_near"));
 	mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
 	mNearbyList->setShowIcons("NearbyListShowIcons");
+	mNearbyList->setShowCompleteName(!gSavedSettings.getBOOL("NearbyListHideUsernames"));
 	mMiniMap = (LLNetMap*)getChildView("Net Map",true);
 	mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ? 
 		getString("AltMiniMapToolTipMsg") :	getString("MiniMapToolTipMsg"));
@@ -1342,6 +1345,16 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
 		mAllFriendList->showPermissions(show_permissions);
 		mOnlineFriendList->showPermissions(show_permissions);
 	}
+	else if (chosen_item == "view_usernames")
+	{
+		bool hide_usernames = !gSavedSettings.getBOOL("FriendsListHideUsernames");
+		gSavedSettings.setBOOL("FriendsListHideUsernames", hide_usernames);
+
+		mAllFriendList->setShowCompleteName(!hide_usernames);
+		mAllFriendList->handleDisplayNamesOptionChanged();
+		mOnlineFriendList->setShowCompleteName(!hide_usernames);
+		mOnlineFriendList->handleDisplayNamesOptionChanged();
+	}
 	}
 
 void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
@@ -1374,6 +1387,14 @@ void LLPanelPeople::onNearbyViewSortMenuItemClicked(const LLSD& userdata)
 	{
 		setSortOrder(mNearbyList, E_SORT_BY_DISTANCE);
 	}
+	else if (chosen_item == "view_usernames")
+	{
+	    bool hide_usernames = !gSavedSettings.getBOOL("NearbyListHideUsernames");
+	    gSavedSettings.setBOOL("NearbyListHideUsernames", hide_usernames);
+
+	    mNearbyList->setShowCompleteName(!hide_usernames);
+	    mNearbyList->handleDisplayNamesOptionChanged();
+	}
 }
 
 bool LLPanelPeople::onNearbyViewSortMenuItemCheck(const LLSD& userdata)
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index a5f59dbf4a84de1faae87489116593454c442cea..65769ff526490982f8e6b07eb6d22f49ba67ae59 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -38,9 +38,14 @@
 #include "llavataractions.h"
 #include "llcallingcard.h"			// for LLAvatarTracker
 #include "lllogchat.h"
+#include "llparcel.h"
 #include "llviewermenu.h"			// for gMenuHolder
 #include "llconversationmodel.h"
 #include "llviewerobjectlist.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+#include "llvoavatarself.h"
+#include "roles_constants.h"
 
 namespace LLPanelPeopleMenus
 {
@@ -77,9 +82,13 @@ LLContextMenu* PeopleContextMenu::createMenu()
 		registrar.add("Avatar.InviteToGroup",	boost::bind(&LLAvatarActions::inviteToGroup,			id));
 		registrar.add("Avatar.TeleportRequest",	boost::bind(&PeopleContextMenu::requestTeleport,		this));
 		registrar.add("Avatar.Calllog",			boost::bind(&LLAvatarActions::viewChatHistory,			id));
+		registrar.add("Avatar.Freeze",			boost::bind(&LLAvatarActions::freezeAvatar,					id));
+		registrar.add("Avatar.Eject",			boost::bind(&PeopleContextMenu::eject,					this));
+
 
 		enable_registrar.add("Avatar.EnableItem", boost::bind(&PeopleContextMenu::enableContextMenuItem, this, _2));
 		enable_registrar.add("Avatar.CheckItem",  boost::bind(&PeopleContextMenu::checkContextMenuItem,	this, _2));
+		enable_registrar.add("Avatar.EnableFreezeEject", boost::bind(&PeopleContextMenu::enableFreezeEject, this, _2));
 
 		// create the context menu from the XUI
 		menu = createFromFile("menu_people_nearby.xml");
@@ -258,6 +267,50 @@ bool PeopleContextMenu::checkContextMenuItem(const LLSD& userdata)
 	return false;
 }
 
+bool PeopleContextMenu::enableFreezeEject(const LLSD& userdata)
+{
+    if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1))
+    {
+        return false;
+    }
+
+    const LLUUID& id = mUUIDs.front();
+
+    // Use avatar_id if available, otherwise default to right-click avatar
+    LLVOAvatar* avatar = NULL;
+    if (id.notNull())
+    {
+        LLViewerObject* object = gObjectList.findObject(id);
+        if (object)
+        {
+            if( !object->isAvatar() )
+            {
+                object = NULL;
+            }
+            avatar = (LLVOAvatar*) object;
+        }
+    }
+    if (!avatar) return false;
+
+    // Gods can always freeze
+    if (gAgent.isGodlike()) return true;
+
+    // Estate owners / managers can freeze
+    // Parcel owners can also freeze
+    const LLVector3& pos = avatar->getPositionRegion();
+    const LLVector3d& pos_global = avatar->getPositionGlobal();
+    LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos_global)->getParcel();
+    LLViewerRegion* region = avatar->getRegion();
+    if (!region) return false;
+
+    bool new_value = region->isOwnedSelf(pos);
+    if (!new_value || region->isOwnedGroup(pos))
+    {
+        new_value = LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_ADMIN);
+    }
+    return new_value;
+}
+
 void PeopleContextMenu::requestTeleport()
 {
 	// boost::bind cannot recognize overloaded method LLAvatarActions::teleportRequest(),
@@ -272,6 +325,39 @@ void PeopleContextMenu::offerTeleport()
 	LLAvatarActions::offerTeleport(mUUIDs);
 }
 
+void PeopleContextMenu::eject()
+{
+	if((gAgent.getID() == mUUIDs.front()) || (mUUIDs.size() != 1))
+	{
+		return;
+	}
+
+	const LLUUID& id = mUUIDs.front();
+
+	// Use avatar_id if available, otherwise default to right-click avatar
+	LLVOAvatar* avatar = NULL;
+	if (id.notNull())
+	{
+		LLViewerObject* object = gObjectList.findObject(id);
+		if (object)
+		{
+			if( !object->isAvatar() )
+			{
+				object = NULL;
+			}
+			avatar = (LLVOAvatar*) object;
+		}
+	}
+	if (!avatar) return;
+	LLSD payload;
+	payload["avatar_id"] = avatar->getID();
+	std::string fullname = avatar->getFullname();
+
+	const LLVector3d& pos = avatar->getPositionGlobal();
+	LLParcel* parcel = LLViewerParcelMgr::getInstance()->selectParcelAt(pos)->getParcel();
+	LLAvatarActions::ejectAvatar(id ,LLViewerParcelMgr::getInstance()->isParcelOwnedByAgent(parcel,GP_LAND_MANAGE_BANNED));
+}
+
 void PeopleContextMenu::startConference()
 {
 	uuid_vec_t uuids;
@@ -320,6 +406,8 @@ void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags)
 		items.push_back(std::string("share"));
 		items.push_back(std::string("pay"));
 		items.push_back(std::string("block_unblock"));
+		items.push_back(std::string("freeze"));
+		items.push_back(std::string("eject"));
 	}
 
     hide_context_entries(menu, items, disabled_items);
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index 9767bab89f88647c53b08e34386471ad9c7081d5..5ed20e00640c0d0ecac0ce68dae818e6f161f066 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -46,7 +46,9 @@ class PeopleContextMenu : public LLListContextMenu
 private:
 	bool enableContextMenuItem(const LLSD& userdata);
 	bool checkContextMenuItem(const LLSD& userdata);
+	bool enableFreezeEject(const LLSD& userdata);
 	void offerTeleport();
+	void eject();
 	void startConference();
 	void requestTeleport();
 };
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index e795e7eedb0b8bd1312dc46c2f612aad222362e3..184238c40ca1373b0e5b412ee0e4ba2fde30bef0 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -176,6 +176,16 @@ class LLAgentHandler : public LLCommandHandler
 			return true;
 		}
 
+		if (verb == "unblock")
+		{
+			if (params.size() > 2)
+			{
+				const std::string object_name = params[2].asString();
+				LLMute mute(avatar_id, object_name, LLMute::OBJECT);
+				LLMuteList::getInstance()->remove(mute);
+			}
+			return true;
+		}
 		return false;
 	}
 };
diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp
index c55e230b5e70f95e0020ee737ba82b790d66b683..a2d1752c6a88307448892746d350fe6950e619cd 100644
--- a/indra/newview/llpanelsnapshotinventory.cpp
+++ b/indra/newview/llpanelsnapshotinventory.cpp
@@ -34,6 +34,8 @@
 #include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model
 #include "llpanelsnapshot.h"
 #include "llviewercontrol.h" // gSavedSettings
+#include "llstatusbar.h"	// can_afford_transaction()
+#include "llnotificationsutil.h"
 
 /**
  * The panel provides UI for saving snapshot as an inventory texture.
@@ -102,6 +104,17 @@ void LLPanelSnapshotInventory::onResolutionCommit(LLUICtrl* ctrl)
 
 void LLPanelSnapshotInventory::onSend()
 {
-	LLFloaterSnapshot::saveTexture();
-	LLFloaterSnapshot::postSave();
+    S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+    if (can_afford_transaction(expected_upload_cost))
+    {
+        LLFloaterSnapshot::saveTexture();
+        LLFloaterSnapshot::postSave();
+    }
+    else
+    {
+        LLSD args;
+        args["COST"] = llformat("%d", expected_upload_cost);
+        LLNotificationsUtil::add("ErrorPhotoCannotAfford", args);
+        LLFloaterSnapshot::inventorySaveFailed();
+    }
 }
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index d86a8b4480106f34bc65b9f1730f6ab84b285e56..d0353259a52f860da324a1383e7269cb3c115f9c 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -94,6 +94,7 @@ class LLWearingContextMenu : public LLListContextMenu
 		LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 
 		registrar.add("Wearing.Edit", boost::bind(&edit_outfit));
+		registrar.add("Wearing.ShowOriginal", boost::bind(show_item_original, mUUIDs.front()));
 		registrar.add("Wearing.TakeOff",
 					  boost::bind(&LLAppearanceMgr::removeItemsFromAvatar, LLAppearanceMgr::getInstance(), mUUIDs));
 		registrar.add("Wearing.Detach", 
@@ -144,6 +145,7 @@ class LLWearingContextMenu : public LLListContextMenu
 		menu->setItemVisible("take_off",	allow_take_off);
 		menu->setItemVisible("detach",		allow_detach);
 		menu->setItemVisible("edit_outfit_separator", allow_take_off || allow_detach);
+		menu->setItemVisible("show_original", mUUIDs.size() == 1);
 	}
 };
 
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index d95546f11d211a3826cad348239710191f7c390c..9957039f728e326c8d88ccaa1709651e82eb1f30 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -38,6 +38,7 @@
 #include "llviewercontrol.h"
 #include "llfloaterpreference.h"
 #include "llfloaterreg.h"
+#include "llfeaturemanager.h"
 
 LLPresetsManager::LLPresetsManager()
 {
@@ -60,7 +61,7 @@ void LLPresetsManager::createMissingDefault()
 		LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;
 
 		// Write current graphic settings as the default
-		savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT);
+        savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT, true);
 	}
     else
     {
@@ -134,7 +135,7 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_nam
 	presets = mPresetNames;
 }
 
-bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name)
+bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name, bool createDefault)
 {
 	if (LLTrans::getString(PRESETS_DEFAULT) == name)
 	{
@@ -146,11 +147,10 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
 
 	if(PRESETS_GRAPHIC == subdirectory)
 	{
-		gSavedSettings.setString("PresetGraphicActive", name);
-
 		LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
-		if (instance)
+		if (instance && !createDefault)
 		{
+            gSavedSettings.setString("PresetGraphicActive", name);
 			instance->getControlNames(name_list);
             LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
 			name_list.push_back("PresetGraphicActive");
@@ -170,23 +170,36 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
         LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
     }
     
-    if (name_list.size() > 1) // if the active preset name is the only thing in the list, don't save the list
+    if (name_list.size() > 1 // if the active preset name is the only thing in the list, don't save the list
+        || (createDefault && name == PRESETS_DEFAULT && subdirectory == PRESETS_GRAPHIC)) // or create a default graphics preset from hw recommended settings 
     {
         // make an empty llsd
         LLSD paramsData(LLSD::emptyMap());
 
-        for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
+        if (createDefault)
+        {
+            paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap();
+            if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0)
+            {
+                // use the recommended setting as an initial one (MAINT-6435)
+                gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger());
+            }
+        }
+        else
         {
-            std::string ctrl_name = *it;
-            LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
-            std::string comment = ctrl->getComment();
-            std::string type = LLControlGroup::typeEnumToString(ctrl->type());
-            LLSD value = ctrl->getValue();
-
-            paramsData[ctrl_name]["Comment"] =  comment;
-            paramsData[ctrl_name]["Persist"] = 1;
-            paramsData[ctrl_name]["Type"] = type;
-            paramsData[ctrl_name]["Value"] = value;
+            for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
+            {
+                std::string ctrl_name = *it;
+                LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
+                std::string comment = ctrl->getComment();
+                std::string type = LLControlGroup::typeEnumToString(ctrl->type());
+                LLSD value = ctrl->getValue();
+
+                paramsData[ctrl_name]["Comment"] = comment;
+                paramsData[ctrl_name]["Persist"] = 1;
+                paramsData[ctrl_name]["Type"] = type;
+                paramsData[ctrl_name]["Value"] = value;
+            }
         }
 
         std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
@@ -203,10 +216,12 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
             
             LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
 
-            gSavedSettings.setString("PresetGraphicActive", name);
-
-            // signal interested parties
-            triggerChangeSignal();
+            if (!createDefault)
+            {
+                gSavedSettings.setString("PresetGraphicActive", name);
+                // signal interested parties
+                triggerChangeSignal();
+            }
         }
         else
         {
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
index ac4f0c010ce31cfc0862682a33549836288e66a8..21f9885f2786c9d4ec95c0db2462a62488982e50 100644
--- a/indra/newview/llpresetsmanager.h
+++ b/indra/newview/llpresetsmanager.h
@@ -56,7 +56,7 @@ class LLPresetsManager : public LLSingleton<LLPresetsManager>
 	static std::string getPresetsDir(const std::string& subdirectory);
 	void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
 	void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option);
-	bool savePreset(const std::string& subdirectory, std::string name);
+	bool savePreset(const std::string& subdirectory, std::string name, bool createDefault = false);
 	void loadPreset(const std::string& subdirectory, std::string name);
 	bool deletePreset(const std::string& subdirectory, std::string name);
 
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index 20c43bc4325563dead26546a7b3dd972eec6cf3f..ba9845ef04519df0d3e7cc7890f464771b934d80 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -94,7 +94,8 @@ BOOL LLPreviewNotecard::postBuild()
 	if (item)
 	{
 		getChild<LLUICtrl>("desc")->setValue(item->getDescription());
-		getChildView("Delete")->setEnabled(true);
+		BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID());
+		getChildView("Delete")->setEnabled(!source_library);
 	}
 	getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
 
@@ -219,6 +220,7 @@ void LLPreviewNotecard::loadAsset()
 		BOOL is_owner = gAgent.allowOperation(PERM_OWNER, perm, GP_OBJECT_MANIPULATE);
 		BOOL allow_copy = gAgent.allowOperation(PERM_COPY, perm, GP_OBJECT_MANIPULATE);
 		BOOL allow_modify = canModify(mObjectUUID, item);
+		BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID());
 
 		if (allow_copy || gAgent.isGodlike())
 		{
@@ -288,7 +290,7 @@ void LLPreviewNotecard::loadAsset()
 			getChildView("lock")->setVisible( TRUE);
 		}
 
-		if(allow_modify || is_owner)
+		if((allow_modify || is_owner) && !source_library)
 		{
 			getChildView("Delete")->setEnabled(TRUE);
 		}
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 2a2c51be40f1bf931e27f80a27a85aff3745a171..645a77e42aa1a7f9252b4a688eae80e12681ff3e 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -38,6 +38,7 @@
 #include "llimagetga.h"
 #include "llimagepng.h"
 #include "llinventory.h"
+#include "llinventorymodel.h"
 #include "llnotificationsutil.h"
 #include "llresmgr.h"
 #include "lltrans.h"
@@ -120,18 +121,22 @@ BOOL LLPreviewTexture::postBuild()
 	childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);
 	getChildView("save_tex_btn")->setVisible( true);
 	getChildView("save_tex_btn")->setEnabled(canSaveAs());
-	
-	if (!mCopyToInv) 
-	{
-		const LLInventoryItem* item = getItem();
-		
-		if (item)
-		{
-			childSetCommitCallback("desc", LLPreview::onText, this);
-			getChild<LLUICtrl>("desc")->setValue(item->getDescription());
-			getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
-		}
-	}
+
+    const LLInventoryItem* item = getItem();
+    if (item)
+    {
+        if (!mCopyToInv)
+        {
+            childSetCommitCallback("desc", LLPreview::onText, this);
+            getChild<LLUICtrl>("desc")->setValue(item->getDescription());
+            getChild<LLLineEditor>("desc")->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
+        }
+        BOOL source_library = mObjectUUID.isNull() && gInventory.isObjectDescendentOf(item->getUUID(), gInventory.getLibraryRootFolderID());
+        if (source_library)
+        {
+            getChildView("Discard")->setEnabled(false);
+        }
+    }
 
 	// Fill in ratios list with common aspect ratio values
 	mRatiosList.clear();
@@ -526,6 +531,15 @@ void LLPreviewTexture::loadAsset()
 		// check that we can copy inworld items into inventory
 		getChildView("Keep")->setEnabled(mIsCopyable);
 	}
+	else
+	{
+		// check that we can remove item
+		BOOL source_library = gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID());
+		if (source_library)
+		{
+			getChildView("Discard")->setEnabled(false);
+		}
+	}
 }
 
 LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 88fbd233b8cf9bee012ebb3f04dd4c4703501895..a2c8e7772e5e1480e4e4f32407f58a81cae21a76 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -687,6 +687,11 @@ bool idle_startup()
 			gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
 			show_connect_box = TRUE;
 		}
+
+		//setup map of datetime strings to codes and slt & local time offset from utc
+		// *TODO: Does this need to be here?
+		LLStringOps::setupDatetimeInfo(false);
+
 		// Go to the next startup state
 		LLStartUp::setStartupState( STATE_BROWSER_INIT );
 		return FALSE;
@@ -1139,9 +1144,6 @@ bool idle_startup()
 						LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
 					}
 				}
-				//setup map of datetime strings to codes and slt & local time offset from utc
-				// *TODO: Does this need to be here?
-				LLStringOps::setupDatetimeInfo (false);
 				transition_back_to_login_panel(emsg.str());
 				show_connect_box = true;
 			}
@@ -3310,6 +3312,13 @@ bool process_login_success_response()
 		{
 			time_t now = time(NULL);
 			gUTCOffset = (server_utc_time - now);
+
+			// Print server timestamp
+			LLSD substitution;
+			substitution["datetime"] = (S32)server_utc_time;
+			std::string timeStr = "[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second, datetime, slt]";
+			LLStringUtil::format(timeStr, substitution);
+			LL_INFOS("AppInit") << "Server SLT timestamp: " << timeStr << ". Server-viewer time offset before correction: " << gUTCOffset << "s" << LL_ENDL;
 		}
 	}
 
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 7020ac0c6598d3b4dd3f647fc92f367ca417ad8b..edde7c8076c0703dba2aa3dbf481f2566042ebd4 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -202,6 +202,21 @@ void LLToast::hide()
 	}
 }
 
+/*virtual*/
+void LLToast::setFocus(BOOL b)
+{
+    if (b && !hasFocus() && mPanel)
+    {
+        LLModalDialog::setFocus(TRUE);
+        // mostly for buttons
+        mPanel->setFocus(TRUE);
+    }
+    else
+    {
+        LLModalDialog::setFocus(b);
+    }
+}
+
 void LLToast::onFocusLost()
 {
 	if(mWrapperPanel && !isBackgroundVisible())
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index f02d7c2a1a99ea8f5247a5401a527d8067739b08..cd92189012de3b394ced1313c8021a42a3f9d8eb 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -150,6 +150,8 @@ class LLToast : public LLModalDialog, public LLInstanceTracker<LLToast>
 	//
 	virtual void hide();
 
+	/*virtual*/ void setFocus(BOOL b);
+
 	/*virtual*/ void onFocusLost();
 
 	/*virtual*/ void onFocusReceived();
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 98ed2f0fc4519d7410ab614c65e74c88aaf788f3..e3a856be5cd7cde30109888f3b8dbdb00c1044bc 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -103,7 +103,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
 		p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
 	}
 	// for the scriptdialog buttons we use fixed button size. This  is a limit!
-	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH)
+	if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > (BUTTON_WIDTH-2*HPAD))
 	{
 		p.rect.width = 1;
 		p.auto_resize = true;
@@ -160,7 +160,11 @@ void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair
 		}
 		LLButton* btn = it->second;
 		LLRect btn_rect(btn->getRect());
-		if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel
+		if (buttons.size() == 1) // for the one-button forms, center that button
+		{
+			left = (max_width - btn_rect.getWidth()) / 2;
+		}
+		else if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel
 		{
 			// looks like we need to add button to the next row
 			left = 0;
@@ -321,6 +325,7 @@ void LLToastNotifyPanel::init( LLRect rect, bool show_images )
     mTextBox->setContentTrusted(is_content_trusted);
     mTextBox->setValue(mNotification->getMessage());
 	mTextBox->setIsFriendCallback(LLAvatarActions::isFriend);
+    mTextBox->setIsObjectBlockedCallback(boost::bind(&LLMuteList::isMuted, LLMuteList::getInstance(), _1, _2, 0));
 
     // add buttons for a script notification
     if (mIsTip)
diff --git a/indra/newview/lltoastscriptquestion.cpp b/indra/newview/lltoastscriptquestion.cpp
index 91ba8c024777f65132303860936218e8a0f44c1f..7a3a1d8fd7971177116e23519820e70a2964c74a 100644
--- a/indra/newview/lltoastscriptquestion.cpp
+++ b/indra/newview/lltoastscriptquestion.cpp
@@ -54,6 +54,19 @@ BOOL LLToastScriptQuestion::postBuild()
 
 	return TRUE;
 }
+
+// virtual
+void LLToastScriptQuestion::setFocus(BOOL b)
+{
+    LLToastPanel::setFocus(b);
+    // toast can fade out and disappear with focus ON, so reset to default anyway
+    LLButton* dfbutton = getDefaultButton();
+    if (dfbutton && dfbutton->getVisible() && dfbutton->getEnabled())
+    {
+        dfbutton->setFocus(b);
+    }
+}
+
 void LLToastScriptQuestion::snapToMessageHeight()
 {
 	LLTextBox* mMessage = getChild<LLTextBox>("top_info_message");
@@ -118,6 +131,12 @@ void LLToastScriptQuestion::createButtons()
 			button->setRect(rect);
 
 			buttons_width += rect.getWidth() + LEFT_PAD;
+
+			if (form_element.has("default") && form_element["default"].asBoolean())
+			{
+				button->setFocus(TRUE);
+				setDefaultBtn(button);
+			}
 		}
 	}
 }
diff --git a/indra/newview/lltoastscriptquestion.h b/indra/newview/lltoastscriptquestion.h
index 3a557f60f66dc70fde27f855117416ca4691c828..a756f88415ef5f7e89834ec18d19664097c8ee4f 100644
--- a/indra/newview/lltoastscriptquestion.h
+++ b/indra/newview/lltoastscriptquestion.h
@@ -39,6 +39,8 @@ class LLToastScriptQuestion : public LLToastPanel
 	virtual BOOL postBuild();
 	virtual ~LLToastScriptQuestion(){};
 
+	/*virtual*/ void setFocus(BOOL b);
+
 private:
 	void snapToMessageHeight();
 
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index 2f8e464b7140dfdf3f74767dcb3fccfdb6baf552..b0e3b5bf898b2944c8a0a575c16b397596feea13 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -83,6 +83,7 @@ LLToolMgr::LLToolMgr()
 	// Not a panel, register these callbacks globally.
 	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Active", boost::bind(&LLToolMgr::inEdit, this));
 	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.Enabled", boost::bind(&LLToolMgr::canEdit, this));
+	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Build.EnabledOrActive", boost::bind(&LLToolMgr::buildEnabledOrActive, this));
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Build.Toggle", boost::bind(&LLToolMgr::toggleBuildMode, this, _2));
 	LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("Marketplace.Enabled", boost::bind(&LLToolMgr::canAccessMarketplace, this));
 	LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Marketplace.Toggle", boost::bind(&LLToolMgr::toggleMarketplace, this, _2));
@@ -264,17 +265,21 @@ bool LLToolMgr::canEdit()
 	return LLViewerParcelMgr::getInstance()->allowAgentBuild();
 }
 
+bool LLToolMgr::buildEnabledOrActive()
+{
+	return inEdit() || canEdit();
+}
+
 void LLToolMgr::toggleBuildMode(const LLSD& sdname)
 {
 	const std::string& param = sdname.asString();
 
+	LLFloaterReg::toggleInstanceOrBringToFront("build");
 	if (param == "build" && !canEdit())
 	{
 		return;
 	}
 
-	LLFloaterReg::toggleInstanceOrBringToFront("build");
-
 	bool build_visible = LLFloaterReg::instanceVisible("build");
 	if (build_visible)
 	{
diff --git a/indra/newview/lltoolmgr.h b/indra/newview/lltoolmgr.h
index a3c1045aacfb00cc6b41c15e0bf680faf53662d7..e5b45750d900f6fb2eebe1faea562f736f0748ea 100644
--- a/indra/newview/lltoolmgr.h
+++ b/indra/newview/lltoolmgr.h
@@ -54,6 +54,7 @@ class LLToolMgr : public LLSingleton<LLToolMgr>
 
 	bool			inEdit();
 	bool			canEdit();
+	bool 			buildEnabledOrActive();
     bool            canAccessMarketplace();
 	void			toggleBuildMode(const LLSD& sdname);
 	void			toggleMarketplace(const LLSD& sdname);
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index f611d0503f852bf5b09aad3cae30ad47abcfadd4..b015cde45d699f75d62f78d4ea4dfefc7909181d 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -183,7 +183,7 @@ void LLTracker::render3D()
 		F32 dist = gFloaterWorldMap->getDistanceToDestination(pos_global, 0.5f);
 		if (dist < DESTINATION_REACHED_RADIUS)
 		{
-			instance()->stopTrackingLocation();
+			instance()->stopTrackingLocation(FALSE,TRUE);
 		}
 		else
 		{
@@ -655,13 +655,13 @@ void LLTracker::stopTrackingLandmark(BOOL clear_ui)
 }
 
 
-void LLTracker::stopTrackingLocation(BOOL clear_ui)
+void LLTracker::stopTrackingLocation(BOOL clear_ui, BOOL dest_reached)
 {
 	purgeBeaconText();
 	mTrackedLocationName.assign("");
 	mIsTrackingLocation = FALSE;
 	mTrackedPositionGlobal.zeroVec();
-	gFloaterWorldMap->clearLocationSelection(clear_ui);
+	gFloaterWorldMap->clearLocationSelection(clear_ui, dest_reached);
 	mTrackingStatus = TRACKING_NOTHING;
 	mTrackingLocationType = LOCATION_NOTHING;
 }
diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h
index 218f3430a6b9cb7e0e9cf31e062fa3fd1bbc5751..a1c5052c1b85a157c8b8a32e6bd456ba0833719f 100644
--- a/indra/newview/lltracker.h
+++ b/indra/newview/lltracker.h
@@ -116,7 +116,7 @@ class LLTracker
 
 	void stopTrackingAll(BOOL clear_ui = FALSE);
 	void stopTrackingAvatar(BOOL clear_ui = FALSE);
-	void stopTrackingLocation(BOOL clear_ui = FALSE);
+	void stopTrackingLocation(BOOL clear_ui = FALSE, BOOL dest_reached = FALSE);
 	void stopTrackingLandmark(BOOL clear_ui = FALSE);
 
 	void drawMarker(const LLVector3d& pos_global, const LLColor4& color);
diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp
index f0dafec24061c1f6498728e009eb7b553cc7b48c..497ff4d2bfe95f068ea371388c6da7eee54c7488 100644
--- a/indra/newview/llviewerassetupload.cpp
+++ b/indra/newview/llviewerassetupload.cpp
@@ -837,5 +837,12 @@ void LLViewerAssetUpload::HandleUploadError(LLCore::HttpStatus status, LLSD &res
         }
     }
 
+    // Let the Snapshot floater know we have failed uploading.
+    LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot");
+    if (uploadInfo->getAssetType() == LLAssetType::AT_TEXTURE && floater_snapshot)
+    {
+        floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", false).with("msg", "inventory")));
+    }
+
 }
 
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 99a9ed1d75a2d7fbd93be5fa0f443167d6de1246..f5b06fbd19519da7d340d73c6231acb8e417eea9 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6986,20 +6986,25 @@ class LLAvatarCall : public view_listener_t
 
 namespace
 {
-	struct QueueObjects : public LLSelectedObjectFunctor
+	struct QueueObjects : public LLSelectedNodeFunctor
 	{
 		BOOL scripted;
 		BOOL modifiable;
 		LLFloaterScriptQueue* mQueue;
 		QueueObjects(LLFloaterScriptQueue* q) : mQueue(q), scripted(FALSE), modifiable(FALSE) {}
-		virtual bool apply(LLViewerObject* obj)
+		virtual bool apply(LLSelectNode* node)
 		{
+			LLViewerObject* obj = node->getObject();
+			if (!obj)
+			{
+				return true;
+			}
 			scripted = obj->flagScripted();
 			modifiable = obj->permModify();
 
 			if( scripted && modifiable )
 			{
-				mQueue->addObject(obj->getID());
+				mQueue->addObject(obj->getID(), node->mName);
 				return false;
 			}
 			else
@@ -7015,7 +7020,7 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
 	QueueObjects func(q);
 	LLSelectMgr *mgr = LLSelectMgr::getInstance();
 	LLObjectSelectionHandle selectHandle = mgr->getSelection();
-	bool fail = selectHandle->applyToObjects(&func);
+	bool fail = selectHandle->applyToNodes(&func);
 	if(fail)
 	{
 		if ( !func.scripted )
diff --git a/indra/newview/llviewerpartsource.cpp b/indra/newview/llviewerpartsource.cpp
index 7efa821bbfd856ee3cf2924ba05e0591efcfda04..814060f4f24d846069e6279972555181930ef0b5 100644
--- a/indra/newview/llviewerpartsource.cpp
+++ b/indra/newview/llviewerpartsource.cpp
@@ -441,10 +441,20 @@ LLPointer<LLViewerPartSourceScript> LLViewerPartSourceScript::unpackPSS(LLViewer
 			return NULL;
 		}
 
+		F32 prev_max_age = pssp->mPartSysData.mMaxAge;
+		F32 prev_start_age = pssp->mPartSysData.mStartAge;
 		if (!pssp->mPartSysData.unpackBlock(block_num))
 		{
 			return NULL;
 		}
+		else if (pssp->mPartSysData.mMaxAge
+				 && (prev_max_age != pssp->mPartSysData.mMaxAge || prev_start_age != pssp->mPartSysData.mStartAge))
+		{
+			// reusing existing pss, so reset time to allow particles to start again
+			pssp->mLastUpdateTime = 0.f;
+			pssp->mLastPartTime = 0.f;
+		}
+
 		if (pssp->mPartSysData.mTargetUUID.notNull())
 		{
 			LLViewerObject *target_objp = gObjectList.findObject(pssp->mPartSysData.mTargetUUID);
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index cac2ed8585c5d291b480677578e64ad919d22465..899ab3a3717efe7984672cdb251f9a46fc256e06 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -264,17 +264,18 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle)
         }
 
         S32 id = ++mHttpResponderID;
-        ++mSeedCapAttempts;
 
         LLSD capabilityNames = LLSD::emptyArray();
         buildCapabilityNames(capabilityNames);
 
         LL_INFOS("AppInit", "Capabilities") << "Requesting seed from " << url 
-            << " (attempt #" << mSeedCapAttempts << ")" << LL_ENDL;
+            << " (attempt #" << mSeedCapAttempts + 1 << ")" << LL_ENDL;
 
         regionp = NULL;
         result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames);
 
+        ++mSeedCapAttempts;
+
         regionp = LLWorld::getInstance()->getRegionFromHandle(regionHandle);
         if (!regionp) //region was removed
         {
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index db4b555eca950969240ba29f045462d2ce263af4..ed719ae41827b8127bc55ec813f1c541eb6a4164 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1875,7 +1875,8 @@ bool LLViewerFetchedTexture::updateFetch()
 	static LLCachedControl<bool> textures_decode_disabled(gSavedSettings,"TextureDecodeDisabled", false);
 	static LLCachedControl<F32>  sCameraMotionThreshold(gSavedSettings,"TextureCameraMotionThreshold", 0.2);
 	static LLCachedControl<S32>  sCameraMotionBoost(gSavedSettings,"TextureCameraMotionBoost", 3);
-	if(textures_decode_disabled)
+	if(textures_decode_disabled ||
+	   (gUseWireframe && mBoostLevel < LLGLTexture::BOOST_AVATAR_BAKED_SELF)) // don't fetch the surface textures in wireframe mode
 	{
 		return false;
 	}
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 08f6143861675cf6437d36e2c3d063fa8b36a5ba..d7080051dabdfd007643cabff951e9c19b9bb19c 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -171,13 +171,27 @@ void LLViewerTextureList::doPreloadImages()
 		mImagePreloads.insert(image);
 	}
 	image = LLViewerTextureManager::getFetchedTextureFromFile("transparent.j2c", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE,
-		0,0,LLUUID("8dcd4a48-2d37-4909-9f78-f7a9eb4ef903"));
+		0, 0, IMG_TRANSPARENT);
 	if (image) 
 	{
 		image->setAddressMode(LLTexUnit::TAM_WRAP);
 		mImagePreloads.insert(image);
 	}
-	
+	image = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient.tga", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE,
+		GL_ALPHA8, GL_ALPHA, IMG_ALPHA_GRAD);
+	if (image)
+	{
+		image->setAddressMode(LLTexUnit::TAM_CLAMP);
+		mImagePreloads.insert(image);
+	}
+	image = LLViewerTextureManager::getFetchedTextureFromFile("alpha_gradient_2d.j2c", FTT_LOCAL_FILE, MIPMAP_YES, LLViewerFetchedTexture::BOOST_UI, LLViewerTexture::FETCHED_TEXTURE,
+		GL_ALPHA8, GL_ALPHA, IMG_ALPHA_GRAD_2D);
+	if (image)
+	{
+		image->setAddressMode(LLTexUnit::TAM_CLAMP);
+		mImagePreloads.insert(image);
+	}
+
 	LLPointer<LLImageRaw> img_blak_square_tex(new LLImageRaw(2, 2, 3));
 	memset(img_blak_square_tex->getData(), 0, img_blak_square_tex->getDataSize());
 	LLPointer<LLViewerFetchedTexture> img_blak_square(new LLViewerFetchedTexture(img_blak_square_tex, FTT_DEFAULT, FALSE));
@@ -188,7 +202,7 @@ void LLViewerTextureList::doPreloadImages()
 
 static std::string get_texture_list_name()
 {
-	return gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "texture_list_" + gSavedSettings.getString("LoginLocation") + ".xml");
+	return gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "texture_list_" + gSavedSettings.getString("LoginLocation") + "." + gDirUtilp->getUserName() + ".xml");
 }
 
 void LLViewerTextureList::doPrefetchImages()
@@ -293,7 +307,7 @@ void LLViewerTextureList::shutdown()
 			break;
 	}
 	
-	if (count > 0 && !gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "").empty())
+	if (count > 0 && !gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "").empty())
 	{
 		std::string filename = get_texture_list_name();
 		llofstream file;
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b9dd43f0617aa7b0345362b8d25e5fc2684b0d95..cdc7e20c2c968789166ac505c606908a00e0d3cb 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7313,7 +7313,6 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32
 //-----------------------------------------------------------------------------
 void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 {
-    static S32 largestSelfCOFSeen(LLViewerInventoryCategory::VERSION_UNKNOWN);
 	LL_DEBUGS("Avatar") << "starts" << LL_ENDL;
 	
 	bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage");
@@ -7348,43 +7347,34 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 		return;
 	}
 
-	S32 this_update_cof_version = contents.mCOFVersion;
-	S32 last_update_request_cof_version = mLastUpdateRequestCOFVersion;
+    S32 thisAppearanceVersion(contents.mCOFVersion);
+    if (isSelf())
+    {   // In the past this was considered to be the canonical COF version, 
+        // that is no longer the case.  The canonical version is maintained 
+        // by the AIS code and should match the COF version there. Even so,
+        // we must prevent rolling this one backwards backwards or processing 
+        // stale versions.
 
-	if( isSelf() )
-	{
-		LL_DEBUGS("Avatar") << "this_update_cof_version " << this_update_cof_version
-				<< " last_update_request_cof_version " << last_update_request_cof_version
-				<<  " my_cof_version " << LLAppearanceMgr::instance().getCOFVersion() << LL_ENDL;
+        S32 aisCOFVersion(LLAppearanceMgr::instance().getCOFVersion());
+
+        LL_DEBUGS("Avatar") << "handling self appearance message #" << thisAppearanceVersion <<
+            " (highest seen #" << mLastUpdateReceivedCOFVersion <<
+            ") (AISCOF=#" << aisCOFVersion << ")" << LL_ENDL;
 
-        if (largestSelfCOFSeen > this_update_cof_version)
+        if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
         {
-            LL_WARNS("Avatar") << "Already processed appearance for COF version " <<
-                largestSelfCOFSeen << ", discarding appearance with COF " << this_update_cof_version << LL_ENDL;
+            LL_WARNS("Avatar") << "Stale appearance received #" << thisAppearanceVersion <<
+                " attempt to roll back from #" << mLastUpdateReceivedCOFVersion <<
+                "... dropping." << LL_ENDL;
+            return;
+        }
+        if (isEditingAppearance())
+        {
+            LL_DEBUGS("Avatar") << "Editing appearance.  Dropping appearance update." << LL_ENDL;
             return;
         }
-        largestSelfCOFSeen = this_update_cof_version;
-
-	}
-	else
-	{
-		LL_DEBUGS("Avatar") << "appearance message received" << LL_ENDL;
-	}
-
-	// Check for stale update.
-	if (isSelf()
-		&& (this_update_cof_version < last_update_request_cof_version))
-	{
-		LL_WARNS() << "Stale appearance update, wanted version " << last_update_request_cof_version
-				<< ", got " << this_update_cof_version << LL_ENDL;
-		return;
-	}
 
-	if (isSelf() && isEditingAppearance())
-	{
-		LL_DEBUGS("Avatar") << "ignoring appearance message while in appearance edit" << LL_ENDL;
-		return;
-	}
+    }
 
 	// SUNSHINE CLEANUP - is this case OK now?
 	S32 num_params = contents.mParamWeights.size();
@@ -7399,13 +7389,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 	}
 
 	// No backsies zone - if we get here, the message should be valid and usable, will be processed.
-    LL_INFOS("Avatar") << "Processing appearance message version " << this_update_cof_version << LL_ENDL;
+    LL_INFOS("Avatar") << "Processing appearance message version " << thisAppearanceVersion << LL_ENDL;
 
-	// Note:
-	// RequestAgentUpdateAppearanceResponder::onRequestRequested()
-	// assumes that cof version is only updated with server-bake
-	// appearance messages.
-	mLastUpdateReceivedCOFVersion = this_update_cof_version;
+    if (isSelf())
+    {
+        // Note:
+        // locally the COF is maintained via LLInventoryModel::accountForUpdate
+        // which is called from various places.  This should match the simhost's 
+        // idea of what the COF version is.  AIS however maintains its own version
+        // of the COF that should be considered canonical. 
+        mLastUpdateReceivedCOFVersion = thisAppearanceVersion;
+    }
 		
     if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))
     {
@@ -7528,7 +7522,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 		// Got an update for some other avatar
 		// Ignore updates for self, because we have a more authoritative value in the preferences.
 		setHoverOffset(contents.mHoverOffset);
-		LL_INFOS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;
+		LL_DEBUGS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;
 	}
 
 	if (!contents.mHoverOffsetWasSet && !isSelf())
@@ -8151,6 +8145,7 @@ U32 LLVOAvatar::getPartitionType() const
 //static
 void LLVOAvatar::updateImpostors()
 {
+	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
 	LLCharacter::sAllowInstancesChange = FALSE;
 
 	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 07427e0377d249cfe88f3204215b74fedeb82993..189ed5499318e75c343643e26286df235fccf863 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -427,7 +427,7 @@ void LLVivoxVoiceClient::connectorCreate()
 
 void LLVivoxVoiceClient::connectorShutdown()
 {
-	if(!mConnectorEstablished)
+	if(mConnectorEstablished)
 	{
 		std::ostringstream stream;
 		stream
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 8f0b233f01544b91e90845204f38c1fbef2a1736..e69a8d1d1d121bd137753571bd8ad6830d41a9cc 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -3627,10 +3627,8 @@ F32 LLVOVolume::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_v
 	F32 radius = getScale().length()*0.5f;
 
 	if (isMesh())
-	{	
-		LLSD& header = gMeshRepo.getMeshHeader(getVolume()->getParams().getSculptID());
-
-		return LLMeshRepository::getStreamingCost(header, radius, bytes, visible_bytes, mLOD, unscaled_value);
+	{
+		return gMeshRepo.getStreamingCost(getVolume()->getParams().getSculptID(), radius, bytes, visible_bytes, mLOD, unscaled_value);
 	}
 	else
 	{
diff --git a/indra/newview/skins/default/xui/en/floater_script_queue.xml b/indra/newview/skins/default/xui/en/floater_script_queue.xml
index f4aca7bb3dd3339743154385ffc690b13e19ed9b..0982683a7f51769eb10a02c997425f99003053a5 100644
--- a/indra/newview/skins/default/xui/en/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_queue.xml
@@ -29,6 +29,14 @@
      name="NotRunning">
         Not running
     </floater.string>
+    <floater.string
+     name="Timeout">
+        Timeout: [OBJECT_NAME]
+    </floater.string>
+    <floater.string
+     name="LoadingObjInv">
+        Loading inventory for: [OBJECT_NAME]
+    </floater.string>
     <button
      follows="right|bottom"
      height="24"
diff --git a/indra/newview/skins/default/xui/en/fonts.xml b/indra/newview/skins/default/xui/en/fonts.xml
index 170b7177fbf74a9488eabded651409aa8bdbb7b7..5d05ecf12738f30803807e3c8aaca4bcabdefdfb 100644
--- a/indra/newview/skins/default/xui/en/fonts.xml
+++ b/indra/newview/skins/default/xui/en/fonts.xml
@@ -12,6 +12,7 @@
     <os name="Mac">
       <file>ヒラギノ角ゴ Pro W3.otf</file>
       <file>ヒラギノ角ゴ ProN W3.otf</file>
+      <file>ヒラギノ明朝 ProN W3.ttc</file>
       <file>AppleGothic.dfont</file>
       <file>AppleGothic.ttf</file>
       <file>AppleSDGothicNeo-Regular.otf</file>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 4576111db1366eaed3cc8ee38a249000ac8b7da3..a39ee5fddd8d2a9f6fdd37adb2230ed472f91c29 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -140,13 +140,6 @@
              function="Advanced.ShowDebugSettings"
              parameter="all" />
         </menu_item_call>
-        <menu_item_call
-         label="UI/Color Settings"
-         name="UI/Color Settings">
-            <menu_item_call.on_click
-             function="Advanced.ShowDebugSettings"
-             parameter="skin" />
-        </menu_item_call>
         <menu_item_separator />
         <menu_item_call
          label="XUI Preview Tool"
diff --git a/indra/newview/skins/default/xui/en/menu_object_icon.xml b/indra/newview/skins/default/xui/en/menu_object_icon.xml
index 2d4f1792c29892eb818a0639629d7790b2dff46d..5137aea72ac4825746608ab8c3f0fb8811e04f36 100644
--- a/indra/newview/skins/default/xui/en/menu_object_icon.xml
+++ b/indra/newview/skins/default/xui/en/menu_object_icon.xml
@@ -23,6 +23,20 @@
         <menu_item_call.on_click
          function="ObjectIcon.Action"
          parameter="block" />
+        <menu_item_call.on_visible
+         function="ObjectIcon.Visible"
+         parameter="not_blocked" />
+    </menu_item_call>
+    <menu_item_call
+     label="Unblock"
+     layout="topleft"
+     name="Unblock">
+        <menu_item_call.on_click
+         function="ObjectIcon.Action"
+         parameter="unblock" />
+        <menu_item_call.on_visible
+         function="ObjectIcon.Visible"
+         parameter="is_blocked" />
     </menu_item_call>
     <menu_item_separator
      layout="topleft" />
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view.xml
index 8790fde7c5574c05437cd4c736d8dcca1cf38c7c..b5a4b87acd1bda66124856aaaf4f2d70fa8a3a6a 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view.xml
@@ -40,6 +40,14 @@
      function="CheckControl"
      parameter="FriendsListShowPermissions" />
   </menu_item_check>
+  <menu_item_check name="view_usernames" label="Hide usernames">
+    <menu_item_check.on_click
+     function="People.Friends.ViewSort.Action"
+     parameter="view_usernames" />
+    <menu_item_check.on_check
+     function="CheckControl"
+     parameter="FriendsListHideUsernames" />
+  </menu_item_check>
   <menu_item_check name="view_conversation" label="View Conversation Log...">
     <menu_item_check.on_check
      function="Floater.Visible"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index f12226ebeb48964ce71848a398bcecbd2e42394a..c1500d4e7c8920fcf1fa8824fc4d85571c47ae50 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -143,4 +143,20 @@
          function="Avatar.EnableItem"
          parameter="can_block" />
     </menu_item_check>
+    <menu_item_call
+         label="Freeze"
+         name="freeze">
+        <menu_item_call.on_click
+         function="Avatar.Freeze" />
+        <menu_item_call.on_visible
+         function="Avatar.EnableFreezeEject"/>
+    </menu_item_call>
+    <menu_item_call
+         label="Eject"
+         name="eject">
+        <menu_item_call.on_click
+         function="Avatar.Eject" />
+        <menu_item_call.on_visible
+         function="Avatar.EnableFreezeEject"/>
+    </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
index da88ca9f4d53ecd24f8591b8d0bef29cda153540..a9f6b8045dd4552b6ccb65cbd1ccc3227dea0e1b 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view.xml
@@ -50,4 +50,12 @@
          function="ToggleControl"
          parameter="NearbyListShowMap" />
     </menu_item_check>
+    <menu_item_check name="view_usernames" label="Hide usernames">
+        <menu_item_check.on_click
+         function="People.Nearby.ViewSort.Action"
+         parameter="view_usernames" />
+        <menu_item_check.on_check
+         function="CheckControl"
+         parameter="NearbyListHideUsernames" />
+    </menu_item_check>
 </toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_objectim.xml b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
index b9d003b8419c244edfc95f9c391d0dfd001af118..41d40b389a6a65e4fbae62606569f702ffecff82 100644
--- a/indra/newview/skins/default/xui/en/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_objectim.xml
@@ -16,6 +16,13 @@
         <menu_item_call.on_click
          function="Url.Block" />
     </menu_item_call>
+    <menu_item_call
+     label="Unblock"
+     layout="topleft"
+     name="unblock_object">
+        <menu_item_call.on_click
+         function="Url.Unblock" />
+    </menu_item_call>
     <menu_item_separator
      layout="topleft" />
     <menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 82488cd88d31ffffc52f783c22d2e867953776e1..8a649a57d1874fd14afddf1e09b8427fc085b3a8 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -806,7 +806,7 @@
             <menu_item_check.on_click
              function="Build.Toggle" />
             <menu_item_check.on_enable
-             function="Build.Enabled" />
+             function="Build.EnabledOrActive" />
        </menu_item_check>
        <menu
           create_jump_keys="true"
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
index 2d54e6960139d5115a6db9dc011874ad0c3cc2b4..44b2727671c609f2dee6b5eb40dd9c62493a6b1a 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_tab.xml
@@ -27,4 +27,11 @@
         <on_click
          function="Wearing.Edit" />
     </menu_item_call>
+    <menu_item_call
+     label="Show Original"
+     layout="topleft"
+     name="show_original">
+        <on_click
+         function="Wearing.ShowOriginal" />
+    </menu_item_call>
 </context_menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 492d96365358902da40464e8613e75b43d654134..dfde38bc5f2b4b9727c55f6b2fd14ac2bcc78fc0 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1148,6 +1148,22 @@ Error encoding snapshot.
   <tag>fail</tag>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="ErrorPhotoCannotAfford"
+   type="alertmodal">
+    You need L$[COST] to save a photo to your inventory. You may either buy L$ or save the photo to your computer instead.
+    <tag>fail</tag>
+  </notification>
+  
+  <notification
+   icon="alertmodal.tga"
+   name="ErrorTextureCannotAfford"
+   type="alertmodal">
+    You need L$[COST] to save a texture to your inventory. You may either buy L$ or save the photo to your computer instead.
+    <tag>fail</tag>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="ErrorUploadingPostcard"
@@ -3521,6 +3537,19 @@ Teleport all Residents in this region home?
      yestext="OK"/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="ChangeObjectBonusFactor"
+   type="alertmodal">
+    Lowering the object bonus after builds have been established in a region may cause objects to be returned or deleted. Are you sure you want to change object bonus?
+    <tag>confirm</tag>
+    <usetemplate
+     ignoretext="Confirm changing object bonus factor"
+     name="okcancelignore"
+     notext="Cancel"
+     yestext="OK"/>
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="EstateObjectReturn"
@@ -6880,6 +6909,19 @@ This area has building disabled. You can&apos;t build or rez objects here.
     The region has pending pathfinding changes.  If you have build rights, you may rebake the region by clicking on the “Rebake region” button.
   </notification>
 
+  <notification
+   icon="notify.tga"
+   name="PathfindingDirtyRebake"
+   persist="true"
+   type="notify">
+   <unique/>
+   The region has pending pathfinding changes.  If you have build rights, you may rebake the region by clicking on the “Rebake region” button.
+   <usetemplate
+     name="okbutton"
+     yestext="Rebake region"
+   />
+  </notification>
+
   <notification
      icon="notify.tga"
      name="DynamicPathfindingDisabled"
@@ -8272,8 +8314,18 @@ Appearance has been saved to XML to [PATH]
     <notification icon="notifytip.tga"
 		name="AppearanceToXMLFailed" type="notifytip">
 Failed to save appearance to XML.
+  </notification>
+
+  <notification
+    icon="notifytip.tga"
+    name="PresetNotSaved"
+    type="notifytip">
+Error saving preset [NAME].
+  </notification>
+
+  <notification
     icon="notifytip.tga"
-	name="PresetNotDeleted"
+    name="PresetNotDeleted"
     type="notifytip">
 Error deleting preset [NAME].
   </notification>
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 183ae2e824f18fb664b95c6e699a81812383d767..ded814bbebc1c39e87c20ea238c6cb6f7b5aefbb 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -67,7 +67,7 @@
     follows="left|top"
     height="32"
     left_pad="-11"
-    max_length_bytes="16"
+    max_length_chars="16"
     text_pad_left="8"
     name="password_edit"
     label="Password"
diff --git a/indra/newview/skins/default/xui/en/panel_login_first.xml b/indra/newview/skins/default/xui/en/panel_login_first.xml
index d1416ece82aa385ff03ae029e9101148d7cf8b38..35b80c56abe7cc0f2837fa2905b1065e0d6699fa 100644
--- a/indra/newview/skins/default/xui/en/panel_login_first.xml
+++ b/indra/newview/skins/default/xui/en/panel_login_first.xml
@@ -124,7 +124,7 @@
             width="200"
             height="32"
             left="220"
-            max_length_bytes="16"
+            max_length_chars="16"
             name="password_edit"
             label="Password"
             text_pad_left="8"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 3e96160834550f0f0af53720ad75904342b71a6a..4a5117adacf766635e572422a73f4f594d53ca98 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -138,7 +138,7 @@
    initial_value="1"
    layout="topleft"
    left_pad="0"
-   max_val="1.5"
+   max_val="2.0"
    min_val="0.75"
    name="ui_scale_slider"
    top_pad="-14"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 3be74218a260259c7fe27540d1d214237398baa0..0a17c202c38efce1c6fb10d8c9d3bf83d74fb1e4 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -55,6 +55,7 @@ LibVLC Version: [LIBVLC_VERSION]
 Voice Server Version: [VOICE_VERSION]
 	</string>
 	<string name="AboutTraffic">Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)</string>
+	<string name="AboutTime">[month, datetime, slt] [day, datetime, slt] [year, datetime, slt] [hour, datetime, slt]:[min, datetime, slt]:[second,datetime,slt]</string>
 	<string name="ErrorFetchingServerReleaseNotesURL">Error fetching server release notes URL.</string>
 	<string name="BuildConfiguration">Build Configuration</string>
 	
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 04cc4774e4b234a4c920adde5610081d33f1588f..66d730d1aca8d0391944147c6328ed9e5ecc2513 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -30,6 +30,7 @@
 import os.path
 import shutil
 import errno
+import json
 import re
 import tarfile
 import time
@@ -181,9 +182,16 @@ def construct(self):
                 self.path("*.tga")
                 self.end_prefix("local_assets")
 
-            # Files in the newview/ directory
+            # File in the newview/ directory
             self.path("gpu_table.txt")
-            # The summary.json file gets left in the build directory by newview/CMakeLists.txt.
+
+            #summary.json.  Standard with exception handling is fine.  If we can't open a new file for writing, we have worse problems
+            summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']),"Channel":self.channel_with_pkg_suffix()}
+            with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle:
+                json.dump(summary_dict,summary_handle)
+
+            #we likely no longer need the test, since we will throw an exception above, but belt and suspenders and we get the
+            #return code for free.
             if not self.path2basename(os.pardir, "summary.json"):
                 print "No summary.json file"