diff --git a/.hgignore b/.hgignore
index 4d98acf5d974d722bab5b39ecb8d9400a519a8d5..886af2b00794f61e6c660b47c4bf91fefb153d23 100644
--- a/.hgignore
+++ b/.hgignore
@@ -13,6 +13,7 @@ LICENSES
 indra/.distcc
 indra/build-darwin-*
 indra/build-vc[0-9]*
+indra/CMakeFiles
 indra/lib/mono/1.0/*.dll
 indra/lib/mono/indra/*.dll
 indra/lib/mono/indra/*.exe
@@ -31,6 +32,7 @@ indra/newview/mozilla-universal-darwin.tgz
 indra/newview/res-sdl
 indra/newview/vivox-runtime
 indra/server-linux-*
+indra/temp
 indra/test/linden_file.dat
 indra/test_apps/llmediatest/dependencies/i686-win32
 indra/test_apps/terrain_mule/*.dll
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index af407d52def482d7512d3d173512714824863c8e..bbf31f92972b1c8f4c8664f0a69b70964882fc2e 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -209,7 +209,7 @@ elseif(LINUX)
         libapr-1.so.0
         libaprutil-1.so.0
         libatk-1.0.so
-        libcrypto.so
+        libcrypto.so.0.9.7
         libdb-4.2.so
         libexpat.so
         libgmock_main.so
diff --git a/indra/llcommon/llclickaction.h b/indra/llcommon/llclickaction.h
index 80487245757e82585100a19477687562020e4d39..d4ffbf8634541f9351d31cddb3621b2fe1522f5d 100644
--- a/indra/llcommon/llclickaction.h
+++ b/indra/llcommon/llclickaction.h
@@ -33,7 +33,7 @@
 
 #ifndef LL_LLCLICKACTION_H
 #define LL_LLCLICKACTION_H
-
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
 const U8 CLICK_ACTION_NONE = 0;
 const U8 CLICK_ACTION_TOUCH = 0;
 const U8 CLICK_ACTION_SIT = 1;
@@ -42,5 +42,6 @@ const U8 CLICK_ACTION_PAY = 3;
 const U8 CLICK_ACTION_OPEN = 4;
 const U8 CLICK_ACTION_PLAY = 5;
 const U8 CLICK_ACTION_OPEN_MEDIA = 6;
-
+const U8 CLICK_ACTION_ZOOM = 7;
+// DO NOT CHANGE THE SEQUENCE OF THIS LIST!!
 #endif
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 3652eeba729a282be83c6561fc7edbd9a42aae7a..cba8cf85b02fbfa5e5ec328ab4d91da264cb3099 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -76,6 +76,75 @@ extern int errno;
 static const S32 CPUINFO_BUFFER_SIZE = 16383;
 LLCPUInfo gSysCPU;
 
+#if LL_WINDOWS
+#ifndef DLLVERSIONINFO
+typedef struct _DllVersionInfo
+{
+    DWORD cbSize;
+    DWORD dwMajorVersion;
+    DWORD dwMinorVersion;
+    DWORD dwBuildNumber;
+    DWORD dwPlatformID;
+}DLLVERSIONINFO;
+#endif
+
+#ifndef DLLGETVERSIONPROC
+typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
+#endif
+
+bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
+{
+	bool result = false;
+	const U32 BUFF_SIZE = 32767;
+	WCHAR tempBuf[BUFF_SIZE];
+	if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
+	{
+		
+		std::basic_string<WCHAR> shell32_path(tempBuf);
+
+		// Shell32.dll contains the DLLGetVersion function. 
+		// according to msdn its not part of the API
+		// so you have to go in and get it.
+		// http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
+		shell32_path += TEXT("\\shell32.dll");
+
+		HMODULE hDllInst = LoadLibrary(shell32_path.c_str());   //load the DLL
+		if(hDllInst) 
+		{  // Could successfully load the DLL
+			DLLGETVERSIONPROC pDllGetVersion;
+			/*
+			You must get this function explicitly because earlier versions of the DLL
+			don't implement this function. That makes the lack of implementation of the
+			function a version marker in itself.
+			*/
+			pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, 
+																"DllGetVersion");
+
+			if(pDllGetVersion) 
+			{    
+				// DLL supports version retrieval function
+				DLLVERSIONINFO    dvi;
+
+				ZeroMemory(&dvi, sizeof(dvi));
+				dvi.cbSize = sizeof(dvi);
+				HRESULT hr = (*pDllGetVersion)(&dvi);
+
+				if(SUCCEEDED(hr)) 
+				{ // Finally, the version is at our hands
+					major = dvi.dwMajorVersion;
+					minor = dvi.dwMinorVersion;
+					build_number = dvi.dwBuildNumber;
+					result = true;
+				} 
+			} 
+
+			FreeLibrary(hDllInst);  // Release DLL
+		} 
+	}
+	return result;
+}
+#endif // LL_WINDOWS
+
 LLOSInfo::LLOSInfo() :
 	mMajorVer(0), mMinorVer(0), mBuild(0)
 {
@@ -98,6 +167,11 @@ LLOSInfo::LLOSInfo() :
 	mMinorVer = osvi.dwMinorVersion;
 	mBuild = osvi.dwBuildNumber;
 
+	DWORD shell32_major, shell32_minor, shell32_build;
+	bool got_shell32_version = get_shell32_dll_version(shell32_major, 
+													   shell32_minor, 
+													   shell32_build);
+
 	switch(osvi.dwPlatformId)
 	{
 	case VER_PLATFORM_WIN32_NT:
@@ -122,8 +196,22 @@ LLOSInfo::LLOSInfo() :
 				 else
 					 mOSStringSimple = "Microsoft Windows Server 2003 ";
 			}
-			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0)
+			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion <= 1)
 			{
+				if(osvi.dwMinorVersion == 0)
+				{
+					mOSStringSimple = "Microsoft Windows Vista ";
+				}
+				else if(osvi.dwMinorVersion == 1)
+				{
+					mOSStringSimple = "Microsoft Windows 7 ";
+				}
+
+				if(osvi.wProductType != VER_NT_WORKSTATION)
+				{
+					mOSStringSimple += "Server ";
+				}
+
 				///get native system info if available..
 				typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); ///function pointer for loading GetNativeSystemInfo
 				SYSTEM_INFO si; //System Info object file contains architecture info
@@ -141,32 +229,13 @@ LLOSInfo::LLOSInfo() :
 				//of windows than this code does (in case it is needed for the future)
 				if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) //check for 64 bit
 				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista 64-bit ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server 64-bit ";
+					mOSStringSimple += "64-bit ";
 				}
 				else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
 				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista 32-bit ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server 32-bit ";
-				}
-				else // PROCESSOR_ARCHITECTURE_IA64 || PROCESSOR_ARCHITECTURE_UNKNOWN not checked
-				{
-					 if(osvi.wProductType == VER_NT_WORKSTATION)
-						mOSStringSimple = "Microsoft Windows Vista ";
-					 else 
-						mOSStringSimple = "Microsoft Windows Vista Server ";
+					mOSStringSimple += "32-bit ";
 				}
 			}
-			else if(osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1)
-			{
-				 if(osvi.wProductType == VER_NT_WORKSTATION)
-					mOSStringSimple = "Microsoft Windows 7 ";
-				 else mOSStringSimple = "Microsoft Windows 7 Server ";
-			}
 			else   // Use the registry on early versions of Windows NT.
 			{
 				mOSStringSimple = "Microsoft Windows (unrecognized) ";
@@ -211,6 +280,7 @@ LLOSInfo::LLOSInfo() :
 								  csdversion.c_str(),
 								  (osvi.dwBuildNumber & 0xffff));
 			}
+
 			mOSString = mOSStringSimple + tmpstr;
 		}
 		break;
@@ -240,6 +310,21 @@ LLOSInfo::LLOSInfo() :
 		mOSString = mOSStringSimple;
 		break;
 	}
+
+	std::string compatibility_mode;
+	if(got_shell32_version)
+	{
+		if(osvi.dwMajorVersion != shell32_major 
+			|| osvi.dwMinorVersion != shell32_minor)
+		{
+			compatibility_mode = llformat(" compatibility mode. real ver: %d.%d (Build %d)", 
+											shell32_major,
+											shell32_minor,
+											shell32_build);
+		}
+	}
+	mOSString += compatibility_mode;
+
 #else
 	struct utsname un;
 	if(uname(&un) != -1)
diff --git a/indra/llcommon/llthread.cpp b/indra/llcommon/llthread.cpp
index 920d8c09777d0b0c148150e01216b5db443b7a41..37370e44e785c8f44f7265673e66b99d2806de08 100644
--- a/indra/llcommon/llthread.cpp
+++ b/indra/llcommon/llthread.cpp
@@ -291,8 +291,8 @@ LLMutex::LLMutex(apr_pool_t *poolp) :
 
 LLMutex::~LLMutex()
 {
-#if _DEBUG
-	llassert(!isLocked()); // better not be locked!
+#if MUTEX_DEBUG
+	llassert_always(!isLocked()); // better not be locked!
 #endif
 	apr_thread_mutex_destroy(mAPRMutexp);
 	mAPRMutexp = NULL;
@@ -306,10 +306,24 @@ LLMutex::~LLMutex()
 void LLMutex::lock()
 {
 	apr_thread_mutex_lock(mAPRMutexp);
+#if MUTEX_DEBUG
+	// Have to have the lock before we can access the debug info
+	U32 id = LLThread::currentID();
+	if (mIsLocked[id] != FALSE)
+		llerrs << "Already locked in Thread: " << id << llendl;
+	mIsLocked[id] = TRUE;
+#endif
 }
 
 void LLMutex::unlock()
 {
+#if MUTEX_DEBUG
+	// Access the debug info while we have the lock
+	U32 id = LLThread::currentID();
+	if (mIsLocked[id] != TRUE)
+		llerrs << "Not locked in Thread: " << id << llendl;	
+	mIsLocked[id] = FALSE;
+#endif
 	apr_thread_mutex_unlock(mAPRMutexp);
 }
 
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index 932d96d9406b8e3bdd1ee97eacaf1b78430e6011..d8aa90de2e8a1e876de3719893431968e3ee003c 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -128,6 +128,8 @@ class LL_COMMON_API LLThread
 
 //============================================================================
 
+#define MUTEX_DEBUG (LL_DEBUG || LL_RELEASE_WITH_DEBUG_INFO)
+
 class LL_COMMON_API LLMutex
 {
 public:
@@ -142,6 +144,9 @@ class LL_COMMON_API LLMutex
 	apr_thread_mutex_t *mAPRMutexp;
 	apr_pool_t			*mAPRPoolp;
 	BOOL				mIsLocalPool;
+#if MUTEX_DEBUG
+	std::map<U32, BOOL> mIsLocked;
+#endif
 };
 
 // Actually a condition/mutex pair (since each condition needs to be associated with a mutex).
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index a403c44b71f92c9cea4887c796993977bb4b3d6f..3078d80552b19fca1df4074f932c8340f6465aa1 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -189,6 +189,7 @@ typedef std::set<LLUUID>					AskQueue;
 typedef std::list<PendingReply*>			ReplyQueue;
 typedef std::map<LLUUID,U32>				PendingQueue;
 typedef std::map<LLUUID, LLCacheNameEntry*> Cache;
+typedef std::map<std::string, LLUUID> 		ReverseCache;
 
 class LLCacheName::Impl
 {
@@ -198,7 +199,9 @@ class LLCacheName::Impl
 
 	Cache				mCache;
 		// the map of UUIDs to names
-
+	ReverseCache   	  	mReverseCache;
+		// map of names to UUIDs
+	
 	AskQueue			mAskNameQueue;
 	AskQueue			mAskGroupQueue;
 		// UUIDs to ask our upstream host about
@@ -371,7 +374,9 @@ void LLCacheName::importFile(LLFILE* fp)
 		entry->mFirstName = firstname;
 		entry->mLastName = lastname;
 		impl.mCache[id] = entry;
-
+		std::string fullname = entry->mFirstName + " " + entry->mLastName;
+		impl.mReverseCache[fullname] = id;
+		
 		count++;
 	}
 
@@ -407,6 +412,8 @@ bool LLCacheName::importFile(std::istream& istr)
 		entry->mFirstName = agent[FIRST].asString();
 		entry->mLastName = agent[LAST].asString();
 		impl.mCache[id] = entry;
+		std::string fullname = entry->mFirstName + " " + entry->mLastName;
+		impl.mReverseCache[fullname] = id;
 
 		++count;
 	}
@@ -428,6 +435,7 @@ bool LLCacheName::importFile(std::istream& istr)
 		entry->mCreateTime = ctime;
 		entry->mGroupName = group[NAME].asString();
 		impl.mCache[id] = entry;
+		impl.mReverseCache[entry->mGroupName] = id;
 		++count;
 	}
 	llinfos << "LLCacheName loaded " << count << " group names" << llendl;
@@ -548,6 +556,27 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
 		return FALSE;
 	}
 }
+
+BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id)
+{
+	std::string fullname = first + " " + last;
+	return getUUID(fullname, id);
+}
+
+BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id)
+{
+	ReverseCache::iterator iter = impl.mReverseCache.find(fullname);
+	if (iter != impl.mReverseCache.end())
+	{
+		id = iter->second;
+		return TRUE;
+	}
+	else
+	{
+		return FALSE;
+	}
+}
+
 // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer.
 //  The reason it is a slot is so that the legacy get() function below can bind an old callback
 //  and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior
@@ -897,10 +926,13 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup)
 		if (!isGroup)
 		{
 			mSignal(id, entry->mFirstName, entry->mLastName, FALSE);
+			std::string fullname = entry->mFirstName + " " + entry->mLastName;
+			mReverseCache[fullname] = id;
 		}
 		else
 		{
 			mSignal(id, entry->mGroupName, "", TRUE);
+			mReverseCache[entry->mGroupName] = id;
 		}
 	}
 }
diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h
index 8641437d86216317cdb7ff1fd04924c9a48f0d45..111cc8b650a8367549a19db146b05188fd60aae1 100644
--- a/indra/llmessage/llcachename.h
+++ b/indra/llmessage/llcachename.h
@@ -86,6 +86,10 @@ class LLCacheName
 	BOOL getName(const LLUUID& id, std::string& first, std::string& last);
 	BOOL getFullName(const LLUUID& id, std::string& fullname);
 	
+	// Reverse lookup of UUID from name
+	BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id);
+	BOOL getUUID(const std::string& fullname, LLUUID& id);
+	
 	// If available, this method copies the group name into the string
 	// provided. The caller must allocate at least
 	// DB_GROUP_NAME_BUF_SIZE characters. If not available, this
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index 2f8e8fdd234b29f3ef163827ed40f13b9c050785..b14e66b91500dcbf698c98f226e29b8a358e4452 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -107,6 +107,7 @@ class LLCheckBoxCtrl
 	std::string			getLabel() const;
 
 	void				setFont( const LLFontGL* font ) { mFont = font; }
+	const LLFontGL*		getFont() { return mFont; }
 	
 	virtual void		setControlName(const std::string& control_name, LLView* context);
 
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 19f203b80c91aefc0ca1a1b6a37144204cfba76d..8de3a8a96f6089dd3a5367ba201aad061efbb4c0 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -94,6 +94,9 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
 	item->setMouseDownCallback(boost::bind(&LLFlatListView::onItemMouseClick, this, new_pair, _4));
 	item->setRightMouseDownCallback(boost::bind(&LLFlatListView::onItemRightMouseClick, this, new_pair, _4));
 
+	// Children don't accept the focus
+	item->setTabStop(false);
+
 	rearrangeItems();
 	notifyParentItemsRectChanged();
 	return true;
@@ -282,6 +285,9 @@ void LLFlatListView::resetSelection(bool no_commit_on_deselection /*= false*/)
 	{
 		onCommit();
 	}
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
 }
 
 void LLFlatListView::setNoItemsCommentText(const std::string& comment_text)
@@ -381,8 +387,34 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
 	//we don't need to stretch in vertical direction on reshaping by a parent
 	//no bottom following!
 	mItemsPanel->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
+
+	LLViewBorder::Params params;
+	params.name("scroll border");
+	params.rect(getSelectedItemsRect());
+	params.visible(false);
+	params.bevel_style(LLViewBorder::BEVEL_IN);
+	mSelectedItemsBorder = LLUICtrlFactory::create<LLViewBorder> (params);
+	mItemsPanel->addChild( mSelectedItemsBorder );
 };
 
+// virtual
+void LLFlatListView::draw()
+{
+	// Highlight border if a child of this container has keyboard focus
+	if( mSelectedItemsBorder->getVisible() )
+	{
+		mSelectedItemsBorder->setKeyboardFocusHighlight( hasFocus() );
+	}
+	LLScrollContainer::draw();
+}
+
+// virtual
+BOOL LLFlatListView::postBuild()
+{
+	setTabStop(true);
+	return LLScrollContainer::postBuild();
+}
+
 void LLFlatListView::rearrangeItems()
 {
 	static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
@@ -444,6 +476,9 @@ void LLFlatListView::rearrangeItems()
 		// move top for next item in list
 		item_new_top -= (rc.getHeight() + mItemPad);
 	}
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
 }
 
 void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
@@ -473,6 +508,64 @@ void LLFlatListView::onItemRightMouseClick(item_pair_t* item_pair, MASK mask)
 	onItemMouseClick(item_pair, mask);
 }
 
+BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
+{
+	BOOL reset_selection = (mask != MASK_SHIFT);
+	BOOL handled = FALSE;
+	switch (key)
+	{
+		case KEY_RETURN:
+		{
+			if (mSelectedItemPairs.size() && mask == MASK_NONE)
+			{
+				mOnReturnSignal(this, getValue());
+				handled = TRUE;
+			}
+			break;
+		}
+		case KEY_UP:
+		{
+			if ( !selectNextItemPair(true, reset_selection) && reset_selection)
+			{
+				// If case we are in accordion tab notify parent to go to the previous accordion
+				notifyParent(LLSD().insert("action","select_prev"));
+			}
+			break;
+		}
+		case KEY_DOWN:
+		{
+			if ( !selectNextItemPair(false, reset_selection) && reset_selection)
+			{
+				// If case we are in accordion tab notify parent to go to the next accordion
+				notifyParent(LLSD().insert("action","select_next"));
+			}
+			break;
+		}
+		case 'A':
+		{
+			if(MASK_CONTROL & mask)
+			{
+				selectAll();
+				handled = TRUE;
+			}
+			break;
+		}
+		default:
+			break;
+	}
+
+	if ( key == KEY_UP || key == KEY_DOWN )
+	{
+		LLRect selcted_rect = getLastSelectedItemRect().stretch(1);
+		LLRect visible_rect = getVisibleContentRect();
+		if ( !visible_rect.contains (selcted_rect) )
+			scrollToShowRect(selcted_rect);
+		handled = TRUE;
+	}
+
+	return handled ? handled : LLScrollContainer::handleKeyHere(key, mask);
+}
+
 LLFlatListView::item_pair_t* LLFlatListView::getItemPair(LLPanel* item) const
 {
 	llassert(item);
@@ -552,6 +645,143 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
 		onCommit();
 	}
 
+	setFocus(TRUE);
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
+
+	return true;
+}
+
+LLRect LLFlatListView::getLastSelectedItemRect()
+{
+	if (!mSelectedItemPairs.size())
+	{
+		return LLRect::null;
+	}
+
+	return mSelectedItemPairs.back()->first->getRect();
+}
+
+LLRect LLFlatListView::getSelectedItemsRect()
+{
+	if (!mSelectedItemPairs.size())
+	{
+		return LLRect::null;
+	}
+	LLRect rc = getLastSelectedItemRect();
+	for ( pairs_const_iterator_t
+			  it = mSelectedItemPairs.begin(),
+			  it_end = mSelectedItemPairs.end();
+		  it != it_end; ++it )
+	{
+		rc.unionWith((*it)->first->getRect());
+	}
+	return rc;
+}
+
+// virtual
+bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection)
+{
+	// No items - no actions!
+	if ( !mItemPairs.size() )
+		return false;
+
+	item_pair_t* cur_sel_pair = NULL;
+	item_pair_t* to_sel_pair = NULL;
+
+	if ( mSelectedItemPairs.size() )
+	{
+		// Take the last selected pair
+		cur_sel_pair = mSelectedItemPairs.back();
+	}
+	else
+	{
+		// If there weren't selected items then choose the first one bases on given direction
+		cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
+		// Force selection to first item
+		to_sel_pair = cur_sel_pair;
+	}
+
+	// Bases on given direction choose next item to select
+	if ( is_up_direction )
+	{
+		// Find current selected item position in mItemPairs list
+		pairs_list_t::reverse_iterator sel_it = std::find(mItemPairs.rbegin(), mItemPairs.rend(), cur_sel_pair);
+
+		for (;++sel_it != mItemPairs.rend();)
+		{
+			// skip invisible items
+			if ( (*sel_it)->first->getVisible() )
+			{
+				to_sel_pair = *sel_it;
+				break;
+			}
+		}
+	}
+	else
+	{
+		// Find current selected item position in mItemPairs list
+		pairs_list_t::iterator sel_it = std::find(mItemPairs.begin(), mItemPairs.end(), cur_sel_pair);
+
+		for (;++sel_it != mItemPairs.end();)
+		{
+			// skip invisible items
+			if ( (*sel_it)->first->getVisible() )
+			{
+				to_sel_pair = *sel_it;
+				break;
+			}
+		}
+	}
+
+	if ( to_sel_pair )
+	{
+		bool select = true;
+
+		if ( reset_selection )
+		{
+			// Reset current selection if we were asked about it
+			resetSelection();
+		}
+		else
+		{
+			// If item already selected and no reset request than we should deselect last selected item.
+			select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair));
+		}
+
+		// Select/Deselect next item
+		selectItemPair(select ? to_sel_pair : cur_sel_pair, select);
+
+		return true;
+	}
+	return false;
+}
+
+bool LLFlatListView::selectAll()
+{
+	if (!mAllowSelection)
+		return false;
+
+	mSelectedItemPairs.clear();
+
+	for (pairs_const_iterator_t it= mItemPairs.begin(); it != mItemPairs.end(); ++it)
+	{
+		item_pair_t* item_pair = *it;
+		mSelectedItemPairs.push_back(item_pair);
+		//a way of notifying panel of selection state changes
+		LLPanel* item = item_pair->first;
+		item->setValue(SELECTED_EVENT);
+	}
+
+	if (mCommitOnSelectionChange)
+	{
+		onCommit();
+	}
+
+	// Stretch selected items rect to ensure it won't be clipped
+	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
+
 	return true;
 }
 
@@ -670,4 +900,15 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const
 	}
 }
 
+// virtual
+void LLFlatListView::onFocusReceived()
+{
+	mSelectedItemsBorder->setVisible(TRUE);
+}
+// virtual
+void LLFlatListView::onFocusLost()
+{
+	mSelectedItemsBorder->setVisible(FALSE);
+}
+
 //EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 97772bc677b454962f4feba0977aacf28083ed04..eac947a0d763adad5b753bb57913d82059c595de 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -113,6 +113,10 @@ class LLFlatListView : public LLScrollContainer
 	
 	virtual ~LLFlatListView() { clear(); };
 
+	/**
+	 * Connects callback to signal called when Return key is pressed.
+	 */
+	boost::signals2::connection setReturnCallback( const commit_signal_t::slot_type& cb ) { return mOnReturnSignal.connect(cb); }
 
 	/** Overridden LLPanel's reshape, height is ignored, the list sets its height to accommodate all items */
 	virtual void reshape(S32 width, S32 height, BOOL called_from_parent  = TRUE);
@@ -318,6 +322,10 @@ class LLFlatListView : public LLScrollContainer
 
 	virtual bool selectItemPair(item_pair_t* item_pair, bool select);
 
+	virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
+
+	virtual bool selectAll();
+
 	virtual bool isSelected(item_pair_t* item_pair) const;
 
 	virtual bool removeItemPair(item_pair_t* item_pair);
@@ -331,6 +339,19 @@ class LLFlatListView : public LLScrollContainer
 	 */
 	void notifyParentItemsRectChanged();
 
+	virtual BOOL handleKeyHere(KEY key, MASK mask);
+
+	virtual BOOL postBuild();
+
+	virtual void onFocusReceived();
+
+	virtual void onFocusLost();
+
+	virtual void draw();
+
+	LLRect getLastSelectedItemRect();
+
+	LLRect getSelectedItemsRect();
 
 private:
 
@@ -381,6 +402,10 @@ class LLFlatListView : public LLScrollContainer
 	LLRect mPrevNotifyParentRect;
 
 	LLTextBox* mNoItemsCommentTextbox;
+
+	LLViewBorder* mSelectedItemsBorder;
+
+	commit_signal_t	mOnReturnSignal;
 };
 
 #endif
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 2a0dcaf333655e367d1c300914ac44b76f78bd7f..bf965e8e28e6760693cced9fe41cdb1af0917548 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2526,8 +2526,12 @@ void LLFloaterView::pushVisibleAll(BOOL visible, const skip_list_t& skip_list)
 
 void LLFloaterView::popVisibleAll(const skip_list_t& skip_list)
 {
-	for (child_list_const_iter_t child_iter = getChildList()->begin();
-		 child_iter != getChildList()->end(); ++child_iter)
+	// make a copy of the list since some floaters change their
+	// order in the childList when changing visibility.
+	child_list_t child_list_copy = *getChildList();
+
+	for (child_list_const_iter_t child_iter = child_list_copy.begin();
+		 child_iter != child_list_copy.end(); ++child_iter)
 	{
 		LLView *view = *child_iter;
 		if (skip_list.find(view) == skip_list.end())
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 304ac64f312347aee7103a4d047891efa5546015..a7cf9be277a778eb660237a094d33b7a65f6898a 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -143,6 +143,12 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
 		
 		if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
 		{
+			// undock floater when user resize it
+			if (((LLFloater*)getParent())->isDocked())
+			{
+				((LLFloater*)getParent())->setDocked(false, false);
+			}
+
 			// Resize the parent
 			LLRect orig_rect = mResizingView->getRect();
 			LLRect scaled_rect = orig_rect;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index cd795282f91207c18eec85ffb8ed5eacd0c4578d..e210667764bbabc96a54128c33727a7792202f5c 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1505,6 +1505,7 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
 
 			LLStyle::Params link_params = style_params;
 			link_params.color = match.getColor();
+			link_params.readonly_color =  match.getColor();
 			// apply font name from requested style_params
 			std::string font_name = LLFontGL::nameFromFont(style_params.font());
 			std::string font_size = LLFontGL::sizeFromFont(style_params.font());
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 96e5a1b7ca24c707934a4b2c4693c1321d8c1260..af9a30cb257b3d93a4b332be11e75b468a6aaa1f 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -522,7 +522,6 @@ BOOL LLWindowMacOSX::createContext(int x, int y, int width, int height, int bits
 		if (mTSMDocument)
 		{
 			ActivateTSMDocument(mTSMDocument);
-			UseInputWindow(mTSMDocument, FALSE);
 			allowLanguageTextInput(NULL, FALSE);
 		}
 	}
@@ -3317,6 +3316,8 @@ void LLWindowMacOSX::allowLanguageTextInput(LLPreeditor *preeditor, BOOL b)
 		return;
 	}
 
+	UseInputWindow(mTSMDocument, !b);
+	
 	// Take care of old and new preeditors.
 	if (preeditor != mPreeditor || !b)
 	{
diff --git a/indra/lscript/lscript_compile/indra.l b/indra/lscript/lscript_compile/indra.l
index 8c891b3e8ff911fe1f3b6d592b338ac247aee7d0..8fe9f5ed29c1f9752addde37f2b8f3fd5c2c4d42 100644
--- a/indra/lscript/lscript_compile/indra.l
+++ b/indra/lscript/lscript_compile/indra.l
@@ -613,6 +613,7 @@ extern "C" { int yyerror(const char *fmt, ...); }
 "CLICK_ACTION_OPEN"       { count(); yylval.ival = CLICK_ACTION_OPEN; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_PLAY"       { count(); yylval.ival = CLICK_ACTION_PLAY; return(INTEGER_CONSTANT); }
 "CLICK_ACTION_OPEN_MEDIA" { count(); yylval.ival = CLICK_ACTION_OPEN_MEDIA; return(INTEGER_CONSTANT); }
+"CLICK_ACTION_ZOOM"       { count(); yylval.ival = CLICK_ACTION_ZOOM; return(INTEGER_CONSTANT); }
 
 "TEXTURE_BLANK"           { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "5748decc-f629-461c-9a36-a35a221fe21f"); return(STRING_CONSTANT); }
 "TEXTURE_DEFAULT"         { yylval.sval = new char[UUID_STR_LENGTH]; strcpy(yylval.sval, "89556747-24cb-43ed-920b-47caed15465f"); return(STRING_CONSTANT); }
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e7458529beeca75a64f2d9014d5884c0a4826e2f..611875a1e2dd32f26eb5214c06eccf244a001af6 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -239,6 +239,7 @@ set(viewer_SOURCE_FILES
     llhudtext.cpp
     llhudview.cpp
     llimfloater.cpp
+    llimfloatercontainer.cpp
     llimhandler.cpp
     llimpanel.cpp
     llimview.cpp
@@ -364,6 +365,7 @@ set(viewer_SOURCE_FILES
     llremoteparcelrequest.cpp
     llsavedsettingsglue.cpp
     llscreenchannel.cpp
+    llscriptfloater.cpp
     llscrollingpanelparam.cpp
     llsearchcombobox.cpp
     llsearchhistory.cpp
@@ -737,6 +739,7 @@ set(viewer_HEADER_FILES
     llhudtext.h
     llhudview.h
     llimfloater.h
+    llimfloatercontainer.h
     llimpanel.h
     llimview.h
     llinspect.h
@@ -860,6 +863,7 @@ set(viewer_HEADER_FILES
     llrootview.h
     llsavedsettingsglue.h
     llscreenchannel.h
+    llscriptfloater.h
     llscrollingpanelparam.h
     llsearchcombobox.h
     llsearchhistory.h
@@ -1376,7 +1380,7 @@ if (WINDOWS)
     # sets the 'working directory' for debugging from visual studio.
     if (NOT UNATTENDED)
         add_custom_command(
-            TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
+            TARGET ${VIEWER_BINARY_NAME} POST_BUILD
             COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
             ARGS
               --solution 
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 5f6fd6e4a735564967a27766decc543bd1f58a50..14025c8061ce00d9f349904ceb9d9411abc1f4b3 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -510,6 +510,7 @@ CLICK_ACTION_PAY        Used with llSetClickAction to set pay as the default act
 CLICK_ACTION_OPEN       Used with llSetClickAction to set open as the default action when object is clicked
 CLICK_ACTION_PLAY       Used with llSetClickAction to set play as the default action when object is clicked
 CLICK_ACTION_OPEN_MEDIA Used with llSetClickAction to set open-media as the default action when object is clicked
+CLICK_ACTION_ZOOM       Used with llSetClickAction to set zoom in as the default action when object is clicked
 
 TOUCH_INVALID_TEXCOORD  Value returned by llDetectedTouchUV() and llDetectedTouchST() when the touch position is not valid.
 TOUCH_INVALID_VECTOR    Value returned by llDetectedTouchPos(), llDetectedTouchNormal(), and llDetectedTouchBinormal() when the touch position is not valid.
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7279a2e333e2e063f286261e89c5a304a7460b2..994e546bd03e0a86d4c7cb7fbc0542b203dab185 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -3585,7 +3585,7 @@
       <key>Type</key>
       <string>String</string>
       <key>Value</key>
-      <string>http://docs.lindenlab.com/help/helpfloater.php?topic=[TOPIC]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;os=[OS]&amp;language=[LANGUAGE]&amp;version_major=[VERSION_MAJOR]&amp;version_minor=[VERSION_MINOR]&amp;version_patch=[VERSION_PATCH]&amp;version_build=[VERSION_BUILD]</string>
+      <string>http://viewer-help.secondlife.com/[LANGUAGE]/[CHANNEL]/[VERSION]/[TOPIC]</string>
     </map>
     <key>HighResSnapshot</key>
     <map>
@@ -5371,6 +5371,19 @@
       <key>Value</key>
       <real>1.0</real>
     </map>
+    
+   <key>PlainTextChatHistory</key>
+    <map>
+      <key>Comment</key>
+      <string>Enable/Disable plain text chat history style</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
+    
     <key>PluginInstancesLow</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 9b3e97e8d8e8e78cc4104abbb95685fd9049b0db..e28795869703a40e335a571b47d4dda5d927f33a 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -2814,7 +2814,11 @@ void LLAgent::endAnimationUpdateUI()
 			LLFloaterReg::restoreVisibleInstances();
 #else // Use this for now
 			LLFloaterView::skip_list_t skip_list;
-			skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+			if (LLFloaterReg::findInstance("mini_map"))
+			{
+				skip_list.insert(LLFloaterReg::findInstance("mini_map"));
+			}
+		
 			gFloaterView->popVisibleAll(skip_list);
 #endif
 			mViewsPushed = FALSE;
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index bdb3c6e24e450529e5ac97a125e39dc5e443d355..6288088210f3a3988980a1008be25b7408f40cd7 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -363,6 +363,35 @@ LLUUID LLAppearanceManager::getCOF()
 	return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
 }
 
+
+const LLViewerInventoryItem* LLAppearanceManager::getCurrentOutfitLink()
+{
+	const LLUUID& current_outfit_cat = getCOF();
+	LLInventoryModel::cat_array_t cat_array;
+	LLInventoryModel::item_array_t item_array;
+	// Can't search on FT_OUTFIT since links to categories return FT_CATEGORY for type since they don't
+	// return preferred type.
+	LLIsType is_category( LLAssetType::AT_CATEGORY ); 
+	gInventory.collectDescendentsIf(current_outfit_cat,
+									cat_array,
+									item_array,
+									false,
+									is_category,
+									false);
+	for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
+		 iter != item_array.end();
+		 iter++)
+	{
+		const LLViewerInventoryItem *item = (*iter);
+		const LLViewerInventoryCategory *cat = item->getLinkedCategory();
+		if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
+		{
+			return item;
+		}
+	}
+	return NULL;
+}
+
 // Update appearance from outfit folder.
 void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
 {
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 5daa6d067b633012ae36d4e5bc1b6fd70831d661..7038d1a35b7a35c627c4b5df4d73c7230093faad 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -61,6 +61,9 @@ class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
 	// Find the Current Outfit folder.
 	LLUUID getCOF();
 
+	// Finds the folder link to the currently worn outfit
+	const LLViewerInventoryItem *getCurrentOutfitLink();
+
 	void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
 
 	// For debugging - could be moved elsewhere.
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index af17286c9c664b9378bafcd249633376c98a52be..7dd3c2ffd40066171642b2578ed9fd8ba0dd60ff 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -985,7 +985,8 @@ bool LLAppViewer::mainLoop()
 			
 #endif
 			//memory leaking simulation
-			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+			LLFloaterMemLeak* mem_leak_instance =
+				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->idle() ;				
@@ -1171,7 +1172,8 @@ bool LLAppViewer::mainLoop()
 		catch(std::bad_alloc)
 		{			
 			//stop memory leaking simulation
-			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+			LLFloaterMemLeak* mem_leak_instance =
+				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->stop() ;				
@@ -1199,7 +1201,8 @@ bool LLAppViewer::mainLoop()
 			llwarns << "Bad memory allocation when saveFinalSnapshot() is called!" << llendl ;
 
 			//stop memory leaking simulation
-			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::getTypedInstance<LLFloaterMemLeak>("mem_leaking");
+			LLFloaterMemLeak* mem_leak_instance =
+				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking");
 			if(mem_leak_instance)
 			{
 				mem_leak_instance->stop() ;				
@@ -1357,19 +1360,25 @@ bool LLAppViewer::cleanup()
 		llinfos << "Waiting for pending IO to finish: " << pending << llendflush;
 		ms_sleep(100);
 	}
-	llinfos << "Shutting down." << llendflush;
+	llinfos << "Shutting down Views" << llendflush;
 
 	// Destroy the UI
 	if( gViewerWindow)
 		gViewerWindow->shutdownViews();
+
+	llinfos << "Cleaning up Inevntory" << llendflush;
 	
 	// Cleanup Inventory after the UI since it will delete any remaining observers
 	// (Deleted observers should have already removed themselves)
 	gInventory.cleanupInventory();
+
+	llinfos << "Cleaning up Selections" << llendflush;
 	
 	// Clean up selection managers after UI is destroyed, as UI may be observing them.
 	// Clean up before GL is shut down because we might be holding on to objects with texture references
 	LLSelectMgr::cleanupGlobals();
+	
+	llinfos << "Shutting down OpenGL" << llendflush;
 
 	// Shut down OpenGL
 	if( gViewerWindow)
@@ -1383,11 +1392,18 @@ bool LLAppViewer::cleanup()
 		gViewerWindow = NULL;
 		llinfos << "ViewerWindow deleted" << llendflush;
 	}
+
+	llinfos << "Cleaning up Keyboard & Joystick" << llendflush;
 	
 	// viewer UI relies on keyboard so keep it aound until viewer UI isa gone
 	delete gKeyboard;
 	gKeyboard = NULL;
 
+	// Turn off Space Navigator and similar devices
+	LLViewerJoystick::getInstance()->terminate();
+	
+	llinfos << "Cleaning up Objects" << llendflush;
+	
 	LLViewerObject::cleanupVOClasses();
 
 	LLWaterParamManager::cleanupClass();
@@ -1410,6 +1426,8 @@ bool LLAppViewer::cleanup()
 	}
 	LLPrimitive::cleanupVolumeManager();
 
+	llinfos << "Additional Cleanup..." << llendflush;	
+	
 	LLViewerParcelMgr::cleanupGlobals();
 
 	// *Note: this is where gViewerStats used to be deleted.
@@ -1429,9 +1447,11 @@ bool LLAppViewer::cleanup()
 	// Also after shutting down the messaging system since it has VFS dependencies
 
 	//
+	llinfos << "Cleaning up VFS" << llendflush;
 	LLVFile::cleanupClass();
-	llinfos << "VFS cleaned up" << llendflush;
 
+	llinfos << "Saving Data" << llendflush;
+	
 	// Quitting with "Remember Password" turned off should always stomp your
 	// saved password, whether or not you successfully logged in.  JC
 	if (!gSavedSettings.getBOOL("RememberPassword"))
@@ -1473,13 +1493,16 @@ bool LLAppViewer::cleanup()
 		gDirUtilp->deleteFilesInDir(gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""),mask);
 	}
 
-	// Turn off Space Navigator and similar devices
-	LLViewerJoystick::getInstance()->terminate();
-
 	removeMarkerFile(); // Any crashes from here on we'll just have to ignore
 	
 	writeDebugInfo();
 
+	LLLocationHistory::getInstance()->save();
+
+	LLAvatarIconIDCache::getInstance()->save();
+
+	llinfos << "Shutting down Threads" << llendflush;
+	
 	// Let threads finish
 	LLTimer idleTimer;
 	idleTimer.reset();
@@ -1512,14 +1535,9 @@ bool LLAppViewer::cleanup()
     sTextureFetch = NULL;
 	delete sImageDecodeThread;
     sImageDecodeThread = NULL;
-
-	LLLocationHistory::getInstance()->save();
-
-	LLAvatarIconIDCache::getInstance()->save();
-
 	delete mFastTimerLogThread;
 	mFastTimerLogThread = NULL;
-
+	
 	if (LLFastTimerView::sAnalyzePerformance)
 	{
 		llinfos << "Analyzing performance" << llendl;
@@ -1541,6 +1559,8 @@ bool LLAppViewer::cleanup()
 	}
 	LLMetricPerformanceTester::cleanClass() ;
 
+	llinfos << "Cleaning up Media and Textures" << llendflush;
+
 	//Note:
 	//LLViewerMedia::cleanupClass() has to be put before gTextureList.shutdown()
 	//because some new image might be generated during cleaning up media. --bao
@@ -1554,13 +1574,13 @@ bool LLAppViewer::cleanup()
 	LLVFSThread::cleanupClass();
 	LLLFSThread::cleanupClass();
 
-	llinfos << "VFS Thread finished" << llendflush;
-
 #ifndef LL_RELEASE_FOR_DOWNLOAD
 	llinfos << "Auditing VFS" << llendl;
 	gVFS->audit();
 #endif
 
+	llinfos << "Misc Cleanup" << llendflush;
+	
 	// For safety, the LLVFS has to be deleted *after* LLVFSThread. This should be cleaned up.
 	// (LLVFS doesn't know about LLVFSThread so can't kill pending requests) -Steve
 	delete gStaticVFS;
@@ -1574,12 +1594,11 @@ bool LLAppViewer::cleanup()
 
 	LLWatchdog::getInstance()->cleanup();
 
+	llinfos << "Shutting down message system" << llendflush;
 	end_messaging_system();
-	llinfos << "Message system deleted." << llendflush;
 
 	// *NOTE:Mani - The following call is not thread safe. 
 	LLCurl::cleanupClass();
-	llinfos << "LLCurl cleaned up." << llendflush;
 
 	// If we're exiting to launch an URL, do that here so the screen
 	// is at the right resolution before we launch IE.
@@ -1600,7 +1619,7 @@ bool LLAppViewer::cleanup()
 
 	ll_close_fail_log();
 
-    llinfos << "Goodbye" << llendflush;
+    llinfos << "Goodbye!" << llendflush;
 
 	// return 0;
 	return true;
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 89a774fd2bd3f41f70762c20096aaa55e07ed732..eb8f069345923b3378437a48b8a8dd661debf19f 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -368,9 +368,9 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
 	LLFloaterGroupPicker* widget = LLFloaterReg::showTypedInstance<LLFloaterGroupPicker>("group_picker", LLSD(id));
 	if (widget)
 	{
-		widget->removeNoneOption();
 		widget->center();
 		widget->setPowersMask(GP_MEMBER_INVITE);
+		widget->removeNoneOption();
 		widget->setSelectGroupCallback(boost::bind(callback_invite_to_group, _1, id));
 	}
 }
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 7985ccc2a1d0a549e3e552dee366e39fc36081e4..c4f0fa53a79c21f8ccea2a8cbcadb154983dde40 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -48,6 +48,7 @@
 LLBottomTray::LLBottomTray(const LLSD&)
 :	mChicletPanel(NULL),
 	mSysWell(NULL),
+	mSpeakPanel(NULL),
 	mSpeakBtn(NULL),
 	mNearbyChatBar(NULL),
 	mToolbarStack(NULL)
@@ -304,6 +305,7 @@ BOOL LLBottomTray::postBuild()
 	mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
 	setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
 
+	mSpeakPanel = getChild<LLPanel>("speak_panel");
 	mSpeakBtn = getChild<LLSpeakButton>("talk");
 
 	// Speak button should be initially disabled because
@@ -320,6 +322,7 @@ BOOL LLBottomTray::postBuild()
 	mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
 	mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
 	mObjectDefaultWidthMap[RS_BUTTON_CAMERA]   = mCamPanel->getRect().getWidth();
+	mObjectDefaultWidthMap[RS_BUTTON_SPEAK]	   = mSpeakPanel->getRect().getWidth();
 
 	return TRUE;
 }
@@ -476,7 +479,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
 	S32 buttons_freed_width = 0;
 	if (still_should_be_processed)
 	{
-		processShrinkButtons(&delta_width);
+		processShrinkButtons(&delta_width, &buttons_freed_width);
 
 		if (delta_width < 0)
 		{
@@ -532,38 +535,43 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
 
 	// how many room we have to show hidden buttons
-	S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
-	S32 buttons_required_width = 0; //How many room will take shown buttons
+	S32 total_available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
 
+	lldebugs << "Processing extending, available width:"
+		<< ", chatbar - " << chatbar_available_shrink_width
+		<< ", chiclets - " << available_width_chiclet
+		<< ", total - " << total_available_width
+		<< llendl;
+
+	S32 available_width = total_available_width;
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
-		processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_GESTURES, &available_width);
 	}
 
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl;
-		processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_MOVEMENT, &available_width);
 	}
 
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl;
-		processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_CAMERA, &available_width);
 	}
 
 	if (available_width > 0)
 	{
-		lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl;
-		processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
+		processShowButton(RS_BUTTON_SNAPSHOT, &available_width);
 	}
 
-	// if we have to show some buttons but width increasing is not enough...
-	if (buttons_required_width > 0 && delta_width < buttons_required_width)
+	processExtendButtons(&available_width);
+
+	// if we have to show/extend some buttons but resized delta width is not enough...
+	S32 processed_width = total_available_width - available_width;
+	if (processed_width > delta_width)
 	{
 		// ... let's shrink nearby chat & chiclet panels
-		S32 required_to_process_width = buttons_required_width;
+		S32 required_to_process_width = processed_width;
 
 		// 1. use delta width of resizing
 		required_to_process_width -= delta_width;
@@ -593,9 +601,8 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	}
 
 	// shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
-	delta_width -= buttons_required_width;
+	delta_width -= processed_width;
 
-	processExtendButtons(&delta_width);
 
 	// how many space can nearby chatbar take?
 	S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
@@ -603,13 +610,21 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
 	{
 		S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
 		S32 delta_panel = llmin(delta_width, delta_panel_max);
+		lldebugs << "Unprocesed delta width: " << delta_width
+			<< ", can be applied to chatbar: " << delta_panel_max
+			<< ", will be applied: " << delta_panel
+			<< llendl;
+
 		delta_width -= delta_panel_max;
 		mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
+		log(mNearbyChatBar, "applied unprocessed delta width");
 	}
 }
 
-bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width)
+bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width)
 {
+	lldebugs << "Trying to show object type: " << shown_object_type << llendl;
+
 	LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
 	if (NULL == panel)
 	{
@@ -625,12 +640,11 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 		if (can_be_shown)
 		{
 			*available_width -= required_width;
-			*buttons_required_width += required_width;
 
 			setTrayButtonVisible(shown_object_type, true);
 
-			lldebugs << "processing object type: " << shown_object_type
-				<< ", buttons_required_width: " << *buttons_required_width
+			lldebugs << "processed object type: " << shown_object_type
+				<< ", rest available width: " << *available_width
 				<< llendl;
 			mResizeState &= ~shown_object_type;
 		}
@@ -640,6 +654,8 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
 
 void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
 {
+	lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
+
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
 	{
@@ -666,7 +682,7 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re
 	}
 }
 
-void LLBottomTray::processShrinkButtons(S32* required_width)
+void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_width)
 {
 	processShrinkButton(RS_BUTTON_CAMERA, required_width);
 
@@ -678,9 +694,44 @@ void LLBottomTray::processShrinkButtons(S32* required_width)
 	{
 		processShrinkButton(RS_BUTTON_GESTURES, required_width);
 	}
+	if (*required_width < 0)
+	{
+
+		S32 panel_min_width = 0;
+		std::string panel_name = mSpeakPanel->getName();
+		bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL);
+		if (!success)
+		{
+			lldebugs << "Panel was not found to get its min width: " << panel_name << llendl;
+		}
+		else
+		{
+			//
+			mSpeakBtn->setLabelVisible(false);
+			S32 panel_width = mSpeakPanel->getRect().getWidth();
+			S32 possible_shrink_width = panel_width - panel_min_width;
+
+			if (possible_shrink_width > 0)
+			{
+				mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
+
+				*required_width += possible_shrink_width;
+
+				if (*required_width > 0)
+				{
+					*buttons_freed_width += *required_width;
+				}
+
+				lldebugs << "Shrunk panel: " << panel_name
+					<< ", shrunk width: " << possible_shrink_width
+					<< ", rest width to process: " << *required_width
+					<< llendl;
+			}
+		}
+	}
 }
 
-void LLBottomTray::processShrinkButton(EResizeState processed_object_type, /*const std::string& panel_name, */S32* required_width)
+void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width)
 {
 	LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
 	if (NULL == panel)
@@ -729,6 +780,9 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, /*con
 
 void LLBottomTray::processExtendButtons(S32* available_width)
 {
+	// do not allow extending any buttons if we have some buttons hidden
+	if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return;
+
 	processExtendButton(RS_BUTTON_GESTURES, available_width);
 
 	if (*available_width > 0)
@@ -739,6 +793,25 @@ void LLBottomTray::processExtendButtons(S32* available_width)
 	{
 		processExtendButton(RS_BUTTON_MOVEMENT, available_width);
 	}
+	if (*available_width > 0)
+	{
+		S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
+		S32 panel_width = mSpeakPanel->getRect().getWidth();
+		S32 possible_extend_width = panel_max_width - panel_width;
+		if (possible_extend_width > 0 && possible_extend_width <= *available_width)
+		{
+			mSpeakBtn->setLabelVisible(true);
+			mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
+			log(mSpeakBtn, "speak button is extended");
+
+			*available_width -= possible_extend_width;
+
+			lldebugs << "Extending panel: " << mSpeakPanel->getName()
+				<< ", extended width: " << possible_extend_width
+				<< ", rest width to process: " << *available_width
+				<< llendl;
+		}
+	}
 }
 
 void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 97bcc23403a2493793df2b3a543e326f1dee20c5..7640cdcf9d57d0ea2451b8d16a2ab56983f96968 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -98,12 +98,18 @@ class LLBottomTray
 		, RS_BUTTON_MOVEMENT	= 0x0010
 		, RS_BUTTON_GESTURES	= 0x0020
 		, RS_BUTTON_SPEAK		= 0x0040
+
+		/**
+		 * Specifies buttons which can be hidden when bottom tray is shrunk.
+		 * They are: Gestures, Movement (Move), Camera (View), Snapshot
+		 */
+		, RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
 	}EResizeState;
 
 	S32 processWidthDecreased(S32 delta_width);
 	void processWidthIncreased(S32 delta_width);
 	void log(LLView* panel, const std::string& descr);
-	bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
+	bool processShowButton(EResizeState shown_object_type, S32* available_width);
 	void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
 
 	/**
@@ -112,7 +118,7 @@ class LLBottomTray
 	 * @param - required_width - width which buttons can use to be shrunk. It is a negative value.
 	 * It is increased on the value processed by buttons.
 	 */
-	void processShrinkButtons(S32* required_width);
+	void processShrinkButtons(S32* required_width, S32* buttons_freed_width);
 	void processShrinkButton(EResizeState processed_object_type, S32* required_width);
 
 	/**
@@ -175,6 +181,7 @@ class LLBottomTray
 
 	LLChicletPanel* 	mChicletPanel;
 	LLNotificationChiclet* 	mSysWell;
+	LLPanel*			mSpeakPanel;
 	LLSpeakButton* 		mSpeakBtn;
 	LLNearbyChatBar*	mNearbyChatBar;
 	LLLayoutStack*		mToolbarStack;
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 4ce3b50ed58122a0b9a80f87f3b0cdebdc2b01f2..422aae3c2597db70009f78359a6a50019c8f4a57 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -334,20 +334,14 @@ LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style
 	return header;
 }
 
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params)
+void LLChatHistory::clear()
 {
-	LLView* view = NULL;
-	std::string view_text = "\n[" + chat.mTimeStr + "] ";
-	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
-		view_text += chat.mFromName + ": ";
-
-
-	LLInlineViewSegment::Params p;
-	p.force_newline = true;
-	p.left_pad = mLeftWidgetPad;
-	p.right_pad = mRightWidgetPad;
+	mLastFromName.clear();
+	LLTextEditor::clear();
+}
 
-	
+void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_chat_history, const LLStyle::Params& input_append_params)
+{
 	LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
 	LLViewerChat::getChatColor(chat,txt_color);
 	LLFontGL* fontp = LLViewerChat::getChatFont();	
@@ -360,39 +354,63 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, const LLStyle::Param
 	style_params.font.size(font_size);	
 	style_params.font.style(input_append_params.font.style);
 	
-
+	std::string header_text = "[" + chat.mTimeStr + "] ";
+	if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+		header_text += chat.mFromName + ": ";
 	
-	if (mLastFromName == chat.mFromName)
+	if (use_plain_text_chat_history)
 	{
-		view = getSeparator();
-		p.top_pad = mTopSeparatorPad;
-		p.bottom_pad = mBottomSeparatorPad;
+		appendText(header_text, getText().size() != 0, style_params);
 	}
 	else
 	{
-		view = getHeader(chat,style_params);
-		if (getText().size() == 0)
-			p.top_pad = 0;
+		LLView* view = NULL;
+		LLInlineViewSegment::Params p;
+		p.force_newline = true;
+		p.left_pad = mLeftWidgetPad;
+		p.right_pad = mRightWidgetPad;
+
+		if (mLastFromName == chat.mFromName)
+		{
+			view = getSeparator();
+			p.top_pad = mTopSeparatorPad;
+			p.bottom_pad = mBottomSeparatorPad;
+		}
 		else
-			p.top_pad = mTopHeaderPad;
-		p.bottom_pad = mBottomHeaderPad;
-		
+		{
+			view = getHeader(chat, style_params);
+			if (getText().size() == 0)
+				p.top_pad = 0;
+			else
+				p.top_pad = mTopHeaderPad;
+			p.bottom_pad = mBottomHeaderPad;
+			
+		}
+		p.view = view;
+
+		//Prepare the rect for the view
+		LLRect target_rect = getDocumentView()->getRect();
+		// squeeze down the widget by subtracting padding off left and right
+		target_rect.mLeft += mLeftWidgetPad + mHPad;
+		target_rect.mRight -= mRightWidgetPad;
+		view->reshape(target_rect.getWidth(), view->getRect().getHeight());
+		view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
+
+		appendWidget(p, header_text, false);
+		mLastFromName = chat.mFromName;
 	}
-	p.view = view;
-
-	//Prepare the rect for the view
-	LLRect target_rect = getDocumentView()->getRect();
-	// squeeze down the widget by subtracting padding off left and right
-	target_rect.mLeft += mLeftWidgetPad + mHPad;
-	target_rect.mRight -= mRightWidgetPad;
-	view->reshape(target_rect.getWidth(), view->getRect().getHeight());
-	view->setOrigin(target_rect.mLeft, view->getRect().mBottom);
-
-	appendWidget(p, view_text, false);
-
-	//Append the text message
-	appendText(chat.mText, FALSE, style_params);
+	//Handle IRC styled /me messages.
+	std::string prefix = chat.mText.substr(0, 4);
+	if (prefix == "/me " || prefix == "/me'")
+	{
+		style_params.font.style = "ITALIC";
 
-	mLastFromName = chat.mFromName;
+		if (chat.mFromName.size() > 0)
+			appendText(chat.mFromName + " ", TRUE, style_params);
+		appendText(chat.mText.substr(4), FALSE, style_params);
+	}
+	else
+		appendText(chat.mText, FALSE, style_params);
 	blockUndo();
 }
+
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index c89d4b4ec67a877ca7dc5800ba71ef95985b788c..ef5839ff2f7a480140e2ba928824eb9de8b0ac2c 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -106,10 +106,11 @@ class LLChatHistory : public LLTextEditor
 		 * If last user appended message, concurs with current user,
 		 * separator is added before the message, otherwise header is added.
 		 * @param chat - base chat message.
-		 * @param time time of a message.
-		 * @param message message itself.
+		 * @param use_plain_text_chat_history  - whether to add message as plain text.
+		 * @param input_append_params - font style.
 		 */
-		void appendWidgetMessage(const LLChat& chat, const LLStyle::Params& input_append_params = LLStyle::Params());
+		void appendMessage(const LLChat& chat, const bool use_plain_text_chat_history = false, const LLStyle::Params& input_append_params = LLStyle::Params());
+		/*virtual*/ void clear();
 
 	private:
 		std::string mLastFromName;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 9845664c7495919ef46ed9a1b3819382772cc672..433f70700c77a2943cce5d78a1ed1a17d16b5000 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -1,34 +1,34 @@
 /** 
-* @file llchiclet.cpp
-* @brief LLChiclet class implementation
-*
-* $LicenseInfo:firstyear=2002&license=viewergpl$
-* 
-* Copyright (c) 2002-2009, Linden Research, Inc.
-* 
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab.  Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-* 
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-* 
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-* 
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * @file llchiclet.cpp
+ * @brief LLChiclet class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
 
 #include "llviewerprecompiledheaders.h" // must be first include
 #include "llchiclet.h"
@@ -43,6 +43,7 @@
 #include "lllocalcliprect.h"
 #include "llmenugl.h"
 #include "lloutputmonitorctrl.h"
+#include "llscriptfloater.h"
 #include "lltextbox.h"
 #include "llvoiceclient.h"
 #include "llvoicecontrolpanel.h"
@@ -55,6 +56,7 @@ static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notif
 static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
 static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
 static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
+static LLDefaultChildRegistry::Register<LLScriptChiclet> t6("chiclet_script");
 
 static const LLRect CHICLET_RECT(0, 25, 25, 0);
 static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
@@ -922,34 +924,45 @@ void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
 	s_previous_active_voice_session_id = session_id;
 }
 
-S32 LLChicletPanel::calcChickletPanleWidth()
-{
-	S32 res = 0;
-
-	for (chiclet_list_t::iterator it = mChicletList.begin(); it
-			!= mChicletList.end(); it++)
-	{
-		res = (*it)->getRect().getWidth() + getChicletPadding();
-	}
-	return res;
-}
-
 bool LLChicletPanel::addChiclet(LLChiclet* chiclet, S32 index)
 {
 	if(mScrollArea->addChild(chiclet))
 	{
-		// chicklets should be aligned to right edge of scroll panel
-		S32 offset = 0;
+		// chiclets should be aligned to right edge of scroll panel
+		S32 left_shift = 0;
 
 		if (!canScrollLeft())
 		{
-			offset = mScrollArea->getRect().getWidth()
-					- chiclet->getRect().getWidth() - calcChickletPanleWidth();
+			// init left shift for the first chiclet in the list...
+			if (mChicletList.empty())
+			{
+				// ...start from the right border of the scroll area for the first added chiclet 
+				left_shift = mScrollArea->getRect().getWidth();
+			}
+			else
+			{
+				// ... start from the left border of the first chiclet minus padding
+				left_shift = getChiclet(0)->getRect().mLeft - getChicletPadding();
+			}
+
+			// take into account width of the being added chiclet
+			left_shift -= chiclet->getRequiredRect().getWidth();
+
+			// if we overflow the scroll area we do not need to shift chiclets
+			if (left_shift < 0)
+			{
+				left_shift = 0;
+			}
 		}
 
 		mChicletList.insert(mChicletList.begin() + index, chiclet);
 
-		getChiclet(0)->translate(offset, 0);
+		// shift first chiclet to place it in correct position. 
+		// rest ones will be placed in arrange()
+		if (!canScrollLeft())
+		{
+			getChiclet(0)->translate(left_shift - getChiclet(0)->getRect().mLeft, 0);
+		}
 
 		chiclet->setLeftButtonClickCallback(boost::bind(&LLChicletPanel::onChicletClick, this, _1, _2));
 		chiclet->setChicletSizeChangedCallback(boost::bind(&LLChicletPanel::onChicletSizeChanged, this, _1, index));
@@ -1400,3 +1413,51 @@ LLChicletSpeakerCtrl::LLChicletSpeakerCtrl(const Params&p)
  : LLOutputMonitorCtrl(p)
 {
 }
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptChiclet::Params::Params()
+ : icon("icon")
+{
+	// *TODO Vadim: Get rid of hardcoded values.
+ 	rect(CHICLET_RECT);
+	icon.rect(CHICLET_ICON_RECT);
+}
+
+LLScriptChiclet::LLScriptChiclet(const Params&p)
+ : LLIMChiclet(p)
+ , mChicletIconCtrl(NULL)
+{
+	LLIconCtrl::Params icon_params = p.icon;
+	mChicletIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+	// Let "new message" icon be on top, else it will be hidden behind chiclet icon.
+	addChildInBack(mChicletIconCtrl);
+}
+
+void LLScriptChiclet::setSessionId(const LLUUID& session_id)
+{
+	setShowNewMessagesIcon( getSessionId() != session_id );
+
+	LLIMChiclet::setSessionId(session_id);
+	LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+	if(notification)
+	{
+		setToolTip(notification->getSubstitutions()["TITLE"].asString());
+	}
+}
+
+void LLScriptChiclet::onMouseDown()
+{
+	LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
+}
+
+BOOL LLScriptChiclet::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+	onMouseDown();
+	return LLChiclet::handleMouseDown(x, y, mask);
+}
+
+// EOF
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index bb5dc1e5500526769371351271175c0f8398b24e..1ea141e6c4766d16faf3a990d0c0e54877c59323 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -1,34 +1,34 @@
 /** 
-* @file llchiclet.h
-* @brief LLChiclet class header file
-*
-* $LicenseInfo:firstyear=2002&license=viewergpl$
-* 
-* Copyright (c) 2002-2009, Linden Research, Inc.
-* 
-* Second Life Viewer Source Code
-* The source code in this file ("Source Code") is provided by Linden Lab
-* to you under the terms of the GNU General Public License, version 2.0
-* ("GPL"), unless you have obtained a separate licensing agreement
-* ("Other License"), formally executed by you and Linden Lab.  Terms of
-* the GPL can be found in doc/GPL-license.txt in this distribution, or
-* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
-* 
-* There are special exceptions to the terms and conditions of the GPL as
-* it is applied to this Source Code. View the full text of the exception
-* in the file doc/FLOSS-exception.txt in this software distribution, or
-* online at
-* http://secondlifegrid.net/programs/open_source/licensing/flossexception
-* 
-* By copying, modifying or distributing this software, you acknowledge
-* that you have read and understood your obligations described above,
-* and agree to abide by those obligations.
-* 
-* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
-* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
-* COMPLETENESS OR PERFORMANCE.
-* $/LicenseInfo$
-*/
+ * @file llchiclet.h
+ * @brief LLChiclet class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ * 
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ *  the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
 
 #ifndef LL_LLCHICLET_H
 #define LL_LLCHICLET_H
@@ -44,9 +44,9 @@ class LLVoiceControlPanel;
 class LLMenuGL;
 class LLIMFloater;
 
-/*
+/**
  * Class for displaying amount of messages/notifications(unread).
-*/
+ */
 class LLChicletNotificationCounterCtrl : public LLTextBox
 {
 public:
@@ -57,30 +57,30 @@ class LLChicletNotificationCounterCtrl : public LLTextBox
 		{};
 	};
 
-	/*
+	/**
 	 * Sets number of notifications
-	*/
+	 */
 	virtual void setCounter(S32 counter);
 
-	/*
+	/**
 	 * Returns number of notifications
-	*/
+	 */
 	virtual S32 getCounter() const { return mCounter; }
 
-	/*
+	/**
 	 * Returns width, required to display amount of notifications in text form.
 	 * Width is the only valid value.
-	*/
+	 */
 	/*virtual*/ LLRect getRequiredRect();
 
-	/*
+	/**
 	 * Sets number of notifications using LLSD
-	*/
+	 */
 	/*virtual*/ void setValue(const LLSD& value);
 
-	/*
+	/**
 	 * Returns number of notifications wrapped in LLSD
-	*/
+	 */
 	/*virtual*/ LLSD getValue() const;
 
 protected:
@@ -94,9 +94,9 @@ class LLChicletNotificationCounterCtrl : public LLTextBox
 	S32 mInitialWidth;
 };
 
-/*
+/**
  * Class for displaying avatar's icon in P2P chiclet.
-*/
+ */
 class LLChicletAvatarIconCtrl : public LLAvatarIconCtrl
 {
 public:
@@ -147,9 +147,9 @@ class LLChicletGroupIconCtrl : public LLIconCtrl
 	std::string mDefaultIcon;
 };
 
-/*
+/**
  * Class for displaying of speaker's voice indicator 
-*/
+ */
 class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
 {
 public:
@@ -164,7 +164,7 @@ class LLChicletSpeakerCtrl : public LLOutputMonitorCtrl
 	friend class LLUICtrlFactory;
 };
 
-/*
+/**
  * Base class for all chiclets.
  */
 class LLChiclet : public LLUICtrl
@@ -180,59 +180,59 @@ class LLChiclet : public LLUICtrl
 
 	/*virtual*/ ~LLChiclet();
 
-	/*
+	/**
 	 * Associates chat session id with chiclet.
-	*/
+	 */
 	virtual void setSessionId(const LLUUID& session_id) { mSessionId = session_id; }
 
-	/*
+	/**
 	 * Returns associated chat session.
-	*/
+	 */
 	virtual const LLUUID& getSessionId() const { return mSessionId; }
 
-	/*
+	/**
 	 * Sets number of unread notifications.
-	*/
+	 */
 	virtual void setCounter(S32 counter) = 0;
 
-	/*
+	/**
 	 * Returns number of unread notifications.
-	*/
+	 */
 	virtual S32 getCounter() = 0;
 
-	/*
+	/**
 	 * Sets show counter state.
-	*/
+	 */
 	virtual void setShowCounter(bool show) { mShowCounter = show; }
 
-	/*
+	/**
 	 * Returns show counter state.
-	*/
+	 */
 	virtual bool getShowCounter() {return mShowCounter;};
 
-	/*
+	/**
 	 * Connects chiclet clicked event with callback.
-	*/
+	 */
 	/*virtual*/ boost::signals2::connection setLeftButtonClickCallback(
 		const commit_callback_t& cb);
 
 	typedef boost::function<void (LLChiclet* ctrl, const LLSD& param)> 
 		chiclet_size_changed_callback_t;
 
-	/*
+	/**
 	 * Connects chiclets size changed event with callback.
-	*/
+	 */
 	virtual boost::signals2::connection setChicletSizeChangedCallback(
 		const chiclet_size_changed_callback_t& cb);
 
-	/*
+	/**
 	 * Sets IM Session id using LLSD
-	*/
+	 */
 	/*virtual*/ LLSD getValue() const;
 
-	/*
+	/**
 	 * Returns IM Session id using LLSD
-	*/
+	 */
 	/*virtual*/ void setValue(const LLSD& value);
 
 protected:
@@ -240,14 +240,14 @@ class LLChiclet : public LLUICtrl
 	friend class LLUICtrlFactory;
 	LLChiclet(const Params& p);
 
-	/*
+	/**
 	 * Notifies subscribers about click on chiclet.
-	*/
+	 */
 	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
 
-	/*
+	/**
 	 * Notifies subscribers about chiclet size changed event.
-	*/
+	 */
 	virtual void onChicletSizeChanged();
 
 private:
@@ -263,11 +263,11 @@ class LLChiclet : public LLUICtrl
 };
 
 
-/*
-* Base class for Instant Message chiclets.
-* IMChiclet displays icon, number of unread messages(optional)
-* and voice chat status(optional).
-*/
+/**
+ * Base class for Instant Message chiclets.
+ * IMChiclet displays icon, number of unread messages(optional)
+ * and voice chat status(optional).
+ */
 class LLIMChiclet : public LLChiclet
 {
 public:
@@ -288,50 +288,50 @@ class LLIMChiclet : public LLChiclet
 	
 	/*virtual*/ ~LLIMChiclet() {};
 
-	/*
+	/**
 	 * Sets IM session name. This name will be displayed in chiclet tooltip.
-	*/
+	 */
 	virtual void setIMSessionName(const std::string& name) { setToolTip(name); }
 
-	/*
+	/**
 	 * Sets id of person/group user is chatting with.
 	 * Session id should be set before calling this
-	*/
+	 */
 	virtual void setOtherParticipantId(const LLUUID& other_participant_id) { mOtherParticipantId = other_participant_id; }
 
-	/*
+	/**
 	 * Gets id of person/group user is chatting with.
 	 */
 	virtual LLUUID getOtherParticipantId() { return mOtherParticipantId; }
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	virtual void initSpeakerControl();
 
-	/*
+	/**
 	 * set status (Shows/Hide) for voice control.
-	*/
+	 */
 	virtual void setShowSpeaker(bool show);
 
-	/*
+	/**
 	 * Returns voice chat status control visibility.
-	*/
+	 */
 	virtual bool getShowSpeaker() {return mShowSpeaker;};
 
-	/*
-	* Shows/Hides for voice control for a chiclet.
-	*/
+	/**
+	 * Shows/Hides for voice control for a chiclet.
+	 */
 	virtual void toggleSpeakerControl();
 
-	/*
-	* Shows/hides overlay icon concerning new unread messages.
-	*/
+	/**
+	 * Shows/hides overlay icon concerning new unread messages.
+	 */
 	virtual void setShowNewMessagesIcon(bool show);
 
-	/*
-	* Returns visibility of overlay icon concerning new unread messages.
-	*/
+	/**
+	 * Returns visibility of overlay icon concerning new unread messages.
+	 */
 	virtual bool getShowNewMessagesIcon();
 
 	virtual void draw();
@@ -418,45 +418,45 @@ class LLIMP2PChiclet : public LLIMChiclet
 
 	/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
 
-	/*
-	* Sets number of unread messages. Will update chiclet's width if number text 
-	* exceeds size of counter and notify it's parent about size change.
-	*/
+	/**
+	 * Sets number of unread messages. Will update chiclet's width if number text 
+	 * exceeds size of counter and notify it's parent about size change.
+	 */
 	/*virtual*/ void setCounter(S32);
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	/*virtual*/ void initSpeakerControl();
 
-	/*
-	* Returns number of unread messages.
-	*/
+	/**
+	 * Returns number of unread messages.
+	 */
 	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 protected:
 	LLIMP2PChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
-	/*
-	* Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
-	* based on other participant's id.
-	*/
+	/**
+	 * Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
+	 * based on other participant's id.
+	 */
 	virtual void createPopupMenu();
 
-	/*
-	* Processes clicks on chiclet popup menu.
-	*/
+	/**
+	 * Processes clicks on chiclet popup menu.
+	 */
 	virtual void onMenuItemClicked(const LLSD& user_data);
 
-	/*
-	* Displays popup menu.
-	*/
+	/**
+	 * Displays popup menu.
+	 */
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
-	/* 
-	* Enables/disables menus based on relationship with other participant.
-	*/
+	/** 
+	 * Enables/disables menus based on relationship with other participant.
+	 */
 	virtual void updateMenuItems();
 
 private:
@@ -492,39 +492,39 @@ class LLAdHocChiclet : public LLIMChiclet
 	 */
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	/*
-	* Sets number of unread messages. Will update chiclet's width if number text 
-	* exceeds size of counter and notify it's parent about size change.
-	*/
+	/**
+	 * Sets number of unread messages. Will update chiclet's width if number text 
+	 * exceeds size of counter and notify it's parent about size change.
+	 */
 	/*virtual*/ void setCounter(S32);
 
-	/*
-	* Keep Speaker Control with actual speaker's ID
-	*/
+	/**
+	 * Keep Speaker Control with actual speaker's ID
+	 */
 	/*virtual*/ void draw();
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	/*virtual*/ void initSpeakerControl();
 
-	/*
-	* Returns number of unread messages.
-	*/
+	/**
+	 * Returns number of unread messages.
+	 */
 	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 protected:
 	LLAdHocChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
-	/*
-	* Displays popup menu.
-	*/
+	/**
+	 * Displays popup menu.
+	 */
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
-	/*
-	* Finds a current speaker and resets the SpeakerControl with speaker's ID
-	*/
+	/**
+	 * Finds a current speaker and resets the SpeakerControl with speaker's ID
+	 */
 	/*virtual*/ void switchToCurrentSpeaker();
 
 private:
@@ -533,6 +533,46 @@ class LLAdHocChiclet : public LLIMChiclet
 	LLMenuGL* mPopupMenu;
 };
 
+/**
+ * Chiclet for script floaters.
+ */
+class LLScriptChiclet : public LLIMChiclet
+{
+public:
+
+	struct Params : public LLInitParam::Block<Params, LLIMChiclet::Params>
+	{
+		Optional<LLIconCtrl::Params> icon;
+
+		Params();
+	};
+
+	/*virtual*/ void setSessionId(const LLUUID& session_id);
+
+	/*virtual*/ void setCounter(S32 counter){}
+
+	/*virtual*/ S32 getCounter() { return 0; }
+
+	/**
+	 * Toggle script floater
+	 */
+	/*virtual*/ void onMouseDown();
+
+	/**
+	 * Override default handler
+	 */
+	/*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
+protected:
+
+	LLScriptChiclet(const Params&);
+	friend class LLUICtrlFactory;
+
+private:
+
+	LLIconCtrl* mChicletIconCtrl;
+};
+
 /**
  * Implements Group chat chiclet.
  */
@@ -559,9 +599,9 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	 */
 	/*virtual*/ void setSessionId(const LLUUID& session_id);
 
-	/*
-	* Keep Speaker Control with actual speaker's ID
-	*/
+	/**
+	 * Keep Speaker Control with actual speaker's ID
+	 */
 	/*virtual*/ void draw();
 
 	/**
@@ -570,20 +610,20 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	 */
 	/*virtual*/ void changed(LLGroupChange gc);
 
-	/*
-	* Sets number of unread messages. Will update chiclet's width if number text 
-	* exceeds size of counter and notify it's parent about size change.
-	*/
+	/**
+	 * Sets number of unread messages. Will update chiclet's width if number text 
+	 * exceeds size of counter and notify it's parent about size change.
+	 */
 	/*virtual*/ void setCounter(S32);
 
-	/*
-	* Init Speaker Control with speaker's ID
-	*/
+	/**
+	 * Init Speaker Control with speaker's ID
+	 */
 	/*virtual*/ void initSpeakerControl();
 
-	/*
-	* Returns number of unread messages.
-	*/
+	/**
+	 * Returns number of unread messages.
+	 */
 	/*virtual*/ S32 getCounter() { return mCounterCtrl->getCounter(); }
 
 	~LLIMGroupChiclet();
@@ -592,25 +632,25 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	LLIMGroupChiclet(const Params& p);
 	friend class LLUICtrlFactory;
 
-	/*
-	* Finds a current speaker and resets the SpeakerControl with speaker's ID
-	*/
+	/**
+	 * Finds a current speaker and resets the SpeakerControl with speaker's ID
+	 */
 	/*virtual*/ void switchToCurrentSpeaker();
 
-	/*
-	* Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
-	* based on other participant's id.
-	*/
+	/**
+	 * Creates chiclet popup menu. Will create P2P or Group IM Chat menu 
+	 * based on other participant's id.
+	 */
 	virtual void createPopupMenu();
 
-	/*
-	* Processes clicks on chiclet popup menu.
-	*/
+	/**
+	 * Processes clicks on chiclet popup menu.
+	 */
 	virtual void onMenuItemClicked(const LLSD& user_data);
 
-	/*
-	* Displays popup menu.
-	*/
+	/**
+	 * Displays popup menu.
+	 */
 	/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
 private:
@@ -619,10 +659,10 @@ class LLIMGroupChiclet : public LLIMChiclet, public LLGroupMgrObserver
 	LLMenuGL* mPopupMenu;
 };
 
-/*
+/**
  * Implements notification chiclet. Used to display total amount of unread messages 
  * across all IM sessions, total amount of system notifications.
-*/
+ */
 class LLNotificationChiclet : public LLChiclet
 {
 public:
@@ -666,10 +706,10 @@ class LLNotificationChiclet : public LLChiclet
 	S32 mCounter;
 };
 
-/*
+/**
  * Storage class for all IM chiclets. Provides mechanism to display, 
  * scroll, create, remove chiclets.
-*/
+ */
 class LLChicletPanel : public LLPanel
 {
 public:
@@ -686,62 +726,62 @@ class LLChicletPanel : public LLPanel
 
 	virtual ~LLChicletPanel();
 
-	/*
+	/**
 	 * Creates chiclet and adds it to chiclet list at specified index.
-	*/
+	 */
 	template<class T> T* createChiclet(const LLUUID& session_id, S32 index);
 
-	/*
+	/**
 	 * Creates chiclet and adds it to chiclet list at right.
-	*/
+	 */
 	template<class T> T* createChiclet(const LLUUID& session_id);
 
-	/*
+	/**
 	 * Returns pointer to chiclet of specified type at specified index.
-	*/
+	 */
 	template<class T> T* getChiclet(S32 index);
 
-	/*
+	/**
 	 * Returns pointer to LLChiclet at specified index.
-	*/
+	 */
 	LLChiclet* getChiclet(S32 index) { return getChiclet<LLChiclet>(index); }
 
-	/*
+	/**
 	 * Searches a chiclet using IM session id.
-	*/
+	 */
 	template<class T> T* findChiclet(const LLUUID& im_session_id);
 
-	/*
+	/**
 	 * Returns number of hosted chiclets.
-	*/
+	 */
 	S32 getChicletCount() {return mChicletList.size();};
 
-	/*
+	/**
 	 * Returns index of chiclet in list.
-	*/
+	 */
 	S32 getChicletIndex(const LLChiclet* chiclet);
 
-	/*
+	/**
 	 * Removes chiclet by index.
-	*/
+	 */
 	void removeChiclet(S32 index);
 
-	/*
+	/**
 	 * Removes chiclet by pointer.
-	*/
+	 */
 	void removeChiclet(LLChiclet* chiclet);
 
-	/*
+	/**
 	 * Removes chiclet by IM session id.
-	*/
+	 */
 	void removeChiclet(const LLUUID& im_session_id);
 
-	/*
+	/**
 	 * Removes all chiclets.
-	*/
+	 */
 	void removeAll();
 
-	/*
+	/**
 	 * Scrolls the panel to the specified chiclet
 	 */
 	void scrollToChiclet(const LLChiclet* chiclet);
@@ -751,14 +791,14 @@ class LLChicletPanel : public LLPanel
 
 	/*virtual*/ BOOL postBuild();
 
-	/*
-	* Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
-	*/
+	/**
+	 * Handler for the Voice Client's signal. Finds a corresponding chiclet and toggles its SpeakerControl
+	 */
 	void onCurrentVoiceChannelChanged(const LLUUID& session_id);
 
-	/*
+	/**
 	 * Reshapes controls and rearranges chiclets if needed.
-	*/
+	 */
 	/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE );
 
 	/*virtual*/ void draw();
@@ -769,100 +809,107 @@ class LLChicletPanel : public LLPanel
 	LLChicletPanel(const Params&p);
 	friend class LLUICtrlFactory;
 
-	S32 calcChickletPanleWidth();
-
-	/*
-	 * Adds chiclet to list and rearranges all chiclets.
-	*/
+	/**
+	 * Adds chiclet to list and rearranges all chiclets. 
+	 * They should be right aligned, most recent right. See EXT-1293
+	 *
+	 * It calculates position of the first chiclet in the list. Other chiclets are placed in arrange().
+	 *
+	 * @see arrange()
+	 */
 	bool addChiclet(LLChiclet*, S32 index);
 
-	/*
-	 * Arranges chiclets.
-	*/
+	/**
+	 * Arranges chiclets to have them in correct positions.
+	 *
+	 * Method bases on assumption that first chiclet has correct rect and starts from the its position.
+	 *
+	 * @see addChiclet()
+	 */
 	void arrange();
 
-	/*
+	/**
 	 * Returns true if chiclets can be scrolled right.
-	*/
+	 */
 	bool canScrollRight();
 
-	/*
-	* Returns true if chiclets can be scrolled left.
-	*/
+	/**
+	 * Returns true if chiclets can be scrolled left.
+	 */
 	bool canScrollLeft();
 
-	/*
-	* Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
-	*/
+	/**
+	 * Shows or hides chiclet scroll buttons if chiclets can or can not be scrolled.
+	 */
 	void showScrollButtonsIfNeeded();
 
-	/*
+	/**
 	 * Shifts chiclets left or right.
-	*/
+	 */
 	void shiftChiclets(S32 offset, S32 start_index = 0);
 
-	/*
+	/**
 	 * Removes gaps between first chiclet and scroll area left side,
 	 * last chiclet and scroll area right side.
-	*/
+	 */
 	void trimChiclets();
 
-	/*
+	/**
 	 * Scrolls chiclets to right or left.
-	*/
+	 */
 	void scroll(S32 offset);
 
-	/*
+	/**
 	 * Verifies that chiclets can be scrolled left, then calls scroll()
-	*/
+	 */
 	void scrollLeft();
 
-	/*
+	/**
 	 * Verifies that chiclets can be scrolled right, then calls scroll()
-	*/
+	 */
 	void scrollRight();
 
-	/*
+	/**
 	 * Callback for left scroll button clicked
-	*/
+	 */
 	void onLeftScrollClick();
 
-	/*
-	* Callback for right scroll button clicked
-	*/
+	/**
+	 * Callback for right scroll button clicked
+	 */
 	void onRightScrollClick();
 
-	/*
-	* Callback for right scroll button held down event
-	*/
+	/**
+	 * Callback for right scroll button held down event
+	 */
 	void onLeftScrollHeldDown();
 
-	/*
+	/**
 	 * Callback for left scroll button held down event
 	 */
 	void onRightScrollHeldDown();
 
-	/*
+	/**
 	 * Callback for mouse wheel scrolled, calls scrollRight() or scrollLeft()
-	*/
+	 */
 	BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
 
-	/*
+	/**
 	 * Notifies subscribers about click on chiclet.
 	 * Do not place any code here, instead subscribe on event (see setChicletClickedCallback).
-	*/
+	 */
 	void onChicletClick(LLUICtrl*ctrl,const LLSD&param);
 
-	/*
+	/**
 	 * Callback for chiclet size changed event, rearranges chiclets.
-	*/
+	 */
 	void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
 
 	typedef std::vector<LLChiclet*> chiclet_list_t;
 
-	/*
+	/**
 	 * Removes chiclet from scroll area and chiclet list.
-	*/
+	 */
 	void removeChiclet(chiclet_list_t::iterator it);
 
 	S32 getChicletPadding() { return mChicletPadding; }
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index 040fad3c4a21618b03f1f4dea21d3b6ddec5caa2..10b7935caf00ab6937ff54bfe8098bd26cfa73c5 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -37,52 +37,70 @@
 #include "lltrans.h"
 #include "llui.h"
 
-static S32 age_days_from_date(const std::string& date_string,
-							  const LLDate& now)
-{
-	// Convert string date to malleable representation
-	S32 month, day, year;
-	S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &month, &day, &year);
-	if (matched != 3) return S32_MIN;
-
-	// Create ISO-8601 date string
-	std::string iso8601_date_string =
-		llformat("%04d-%02d-%02dT00:00:00Z", year, month, day);
-	LLDate date(iso8601_date_string);
-
-	// Correct for the fact that account creation dates are in Pacific time,
-	// == UTC - 8
-	F64 date_secs_since_epoch = date.secondsSinceEpoch();
-	date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+static S32 DAYS_PER_MONTH_NOLEAP[] =
+	{ 31, 28, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static S32 DAYS_PER_MONTH_LEAP[] =
+	{ 31, 29, 21, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
-	// Convert seconds from epoch to seconds from now
-	F64 now_secs_since_epoch = now.secondsSinceEpoch();
-	F64 age_secs = now_secs_since_epoch - date_secs_since_epoch;
-
-	// We don't care about sub-day times
-	const F64 SEC_PER_DAY = 24.0 * 60.0 * 60.0;
-	S32 age_days = lltrunc(age_secs / SEC_PER_DAY);
-
-	return age_days;
+static S32 days_from_month(S32 year, S32 month)
+{
+	if (year % 4 == 0 
+		&& year % 100 != 0)
+	{
+		// leap year
+		return DAYS_PER_MONTH_LEAP[month];
+	}
+	else
+	{
+		return DAYS_PER_MONTH_NOLEAP[month];
+	}
 }
 
 std::string LLDateUtil::ageFromDate(const std::string& date_string,
 									const LLDate& now)
 {
-	S32 age_days = age_days_from_date(date_string, now);
-	if (age_days == S32_MIN) return "???";
+	S32 born_month, born_day, born_year;
+	S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year);
+	if (matched != 3) return "???";
+	LLDate born_date;
+	born_date.fromYMDHMS(born_year, born_month, born_day);
+	F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch();
+	// Correct for the fact that account creation dates are in Pacific time,
+	// == UTC - 8
+	born_date_secs_since_epoch += 8.0 * 60.0 * 60.0;
+	born_date.secondsSinceEpoch(born_date_secs_since_epoch);
+	// explode out to month/day/year again
+	born_date.split(&born_year, &born_month, &born_day);
+
+	S32 now_year, now_month, now_day;
+	now.split(&now_year, &now_month, &now_day);
+
+	// Do grade-school subtraction, from right-to-left, borrowing from the left
+	// when things go negative
+	S32 age_days = (now_day - born_day);
+	if (age_days < 0)
+	{
+		now_month -= 1;
+		if (now_month == 0)
+		{
+			now_year -= 1;
+			now_month = 12;
+		}
+		age_days += days_from_month(now_year, now_month);
+	}
+	S32 age_months = (now_month - born_month);
+	if (age_months < 0)
+	{
+		now_year -= 1;
+		age_months += 12;
+	}
+	S32 age_years = (now_year - born_year);
 
 	// Noun pluralization depends on language
 	std::string lang = LLUI::getLanguage();
 
 	// Try for age in round number of years
 	LLStringUtil::format_map_t args;
-	S32 age_years = age_days / 365;
-	age_days = age_days % 365;
-	// *NOTE: This is wrong.  Not all months have 30 days, but we don't have a library
-	// for relative date arithmetic. :-(  JC
-	S32 age_months = age_days / 30;
-	age_days = age_days % 30;
 
 	if (age_months > 0 || age_years > 0)
 	{
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index 8ac7f3fd7e1f952ccaafca6c1fb7059edc0a2b8d..07bb6f832bf2d2f1d5d5cd36c40c6964a863d858 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -42,6 +42,7 @@
 #include "llworld.h"
 
 // Linden libraries
+#include "llbutton.h"
 #include "lllineeditor.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
@@ -56,7 +57,8 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
 												   BOOL closeOnSelect)
 {
 	// *TODO: Use a key to allow this not to be an effective singleton
-	LLFloaterAvatarPicker* floater = LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
+	LLFloaterAvatarPicker* floater = 
+		LLFloaterReg::showTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
 	
 	floater->mCallback = callback;
 	floater->mCallbackUserdata = userdata;
@@ -64,6 +66,15 @@ LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(callback_t callback,
 	floater->mNearMeListComplete = FALSE;
 	floater->mCloseOnSelect = closeOnSelect;
 	
+	if (!closeOnSelect)
+	{
+		// Use Select/Close
+		std::string select_string = floater->getString("Select");
+		std::string close_string = floater->getString("Close");
+		floater->getChild<LLButton>("ok_btn")->setLabel(select_string);
+		floater->getChild<LLButton>("cancel_btn")->setLabel(close_string);
+	}
+
 	return floater;
 }
 
@@ -102,10 +113,9 @@ BOOL LLFloaterAvatarPicker::postBuild()
 	friends->setDoubleClickCallback(onBtnSelect, this);
 	childSetCommitCallback("Friends", onList, this);
 
-	childSetAction("Select", onBtnSelect, this);
-	childDisable("Select");
-
-	childSetAction("Cancel", onBtnClose, this);
+	childSetAction("ok_btn", onBtnSelect, this);
+	childDisable("ok_btn");
+	childSetAction("cancel_btn", onBtnClose, this);
 
 	childSetFocus("Edit");
 
@@ -132,7 +142,7 @@ BOOL LLFloaterAvatarPicker::postBuild()
 
 void LLFloaterAvatarPicker::onTabChanged()
 {
-	childSetEnabled("Select", visibleItemsSelected());
+	childSetEnabled("ok_btn", visibleItemsSelected());
 }
 
 // Destroys the object
@@ -234,7 +244,7 @@ void LLFloaterAvatarPicker::onList(LLUICtrl* ctrl, void* userdata)
 	LLFloaterAvatarPicker* self = (LLFloaterAvatarPicker*)userdata;
 	if (self)
 	{
-		self->childSetEnabled("Select", self->visibleItemsSelected());
+		self->childSetEnabled("ok_btn", self->visibleItemsSelected());
 	}
 }
 
@@ -270,13 +280,13 @@ void LLFloaterAvatarPicker::populateNearMe()
 	if (empty)
 	{
 		childDisable("NearMe");
-		childDisable("Select");
+		childDisable("ok_btn");
 		near_me_scroller->setCommentText(getString("no_one_near"));
 	}
 	else 
 	{
 		childEnable("NearMe");
-		childEnable("Select");
+		childEnable("ok_btn");
 		near_me_scroller->selectFirstItem();
 		onList(near_me_scroller, this);
 		near_me_scroller->setFocus(TRUE);
@@ -357,7 +367,7 @@ void LLFloaterAvatarPicker::find()
 	getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems();
 	getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching"));
 	
-	childSetEnabled("Select", FALSE);
+	childSetEnabled("ok_btn", FALSE);
 	mNumResultsReturned = 0;
 }
 
@@ -414,7 +424,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
 			map["[TEXT]"] = floater->childGetText("Edit");
 			avatar_name = floater->getString("not_found", map);
 			search_results->setEnabled(FALSE);
-			floater->childDisable("Select");
+			floater->childDisable("ok_btn");
 		}
 		else
 		{
@@ -430,7 +440,7 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
 
 	if (found_one)
 	{
-		floater->childEnable("Select");
+		floater->childEnable("ok_btn");
 		search_results->selectFirstItem();
 		floater->onList(search_results, floater);
 		search_results->setFocus(TRUE);
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index af86274472a7a3afd511f27016f3452d1c4e8cc9..0f8e4c10d78f6e04a614afd8d5db9814068dd584 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -34,32 +34,24 @@
 
 #include "llfloatergesture.h"
 
-#include "lldir.h"
 #include "llinventory.h"
-#include "llmultigesture.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "llinventoryclipboard.h"
 
 #include "llagent.h"
-#include "llviewerwindow.h"
-#include "llbutton.h"
-#include "llcombobox.h"
+#include "llappearancemgr.h"
+#include "llclipboard.h"
 #include "llgesturemgr.h"
-#include "llinventorymodel.h"
-#include "llinventorypanel.h"
-#include "llfloaterinventory.h"
 #include "llkeyboard.h"
-#include "lllineeditor.h"
+#include "llmenugl.h"
+#include "llmultigesture.h"
 #include "llpreviewgesture.h"
-#include "llresizehandle.h"
-#include "llscrollbar.h"
-#include "llscrollcontainer.h"
 #include "llscrolllistctrl.h"
-#include "lltextbox.h"
 #include "lltrans.h"
-#include "lluictrlfactory.h"
 #include "llviewergesture.h"
-#include "llviewertexturelist.h"
+#include "llviewermenu.h" 
 #include "llviewerinventory.h"
-#include "llvoavatar.h"
 #include "llviewercontrol.h"
 
 BOOL item_name_precedes( LLInventoryItem* a, LLInventoryItem* b )
@@ -77,6 +69,35 @@ class LLFloaterGestureObserver : public LLGestureManagerObserver
 private:
 	LLFloaterGesture* mFloater;
 };
+//-----------------------------
+// GestureCallback
+//-----------------------------
+
+class GestureShowCallback : public LLInventoryCallback
+{
+public:
+	void fire(const LLUUID &inv_item)
+	{
+		LLPreviewGesture::show(inv_item, LLUUID::null);
+	}
+};
+
+class GestureCopiedCallback : public LLInventoryCallback
+{
+private:
+	LLFloaterGesture* mFloater;
+	
+public:
+	GestureCopiedCallback(LLFloaterGesture* floater): mFloater(floater)
+	{}
+	void fire(const LLUUID &inv_item)
+	{
+		if(mFloater)
+		{
+			mFloater->addGesture(inv_item,NULL,mFloater->getChild<LLScrollListCtrl>("gesture_list"));
+		}
+	}
+};
 
 //---------------------------------------------------------------------------
 // LLFloaterGesture
@@ -86,7 +107,13 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
 {
 	mObserver = new LLFloaterGestureObserver(this);
 	LLGestureManager::instance().addObserver(mObserver);
-	//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");
+
+	mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
+	mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this));
+	mCommitCallbackRegistrar.add("Gesture.Action.CopyPast", boost::bind(&LLFloaterGesture::onCopyPastAction, this, _2));
+	mCommitCallbackRegistrar.add("Gesture.Action.SaveToCOF", boost::bind(&LLFloaterGesture::addToCurrentOutFit, this));
+
+	mEnableCallbackRegistrar.add("Gesture.EnableAction", boost::bind(&LLFloaterGesture::isActionEnabled, this, _2));
 }
 
 void LLFloaterGesture::done()
@@ -151,19 +178,18 @@ BOOL LLFloaterGesture::postBuild()
 	label = getTitle();
 	
 	setTitle(label);
-
-	getChild<LLUICtrl>("gesture_list")->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this));
-	getChild<LLScrollListCtrl>("gesture_list")->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
-
-	getChild<LLUICtrl>("inventory_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickInventory, this));
+	mGestureList = getChild<LLScrollListCtrl>("gesture_list");
+	mGestureList->setCommitCallback(boost::bind(&LLFloaterGesture::onCommitList, this));
+	mGestureList->setDoubleClickCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 
 	getChild<LLUICtrl>("edit_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickEdit, this));
 
 	getChild<LLUICtrl>("play_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 	getChild<LLUICtrl>("stop_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickPlay, this));
 	getChild<LLButton>("activate_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
-
+	
 	getChild<LLUICtrl>("new_gesture_btn")->setCommitCallback(boost::bind(&LLFloaterGesture::onClickNew, this));
+	getChild<LLButton>("del_btn")->setClickedCallback(boost::bind(&LLFloaterGesture::onDeleteSelected, this));
 
 	childSetVisible("play_btn", true);
 	childSetVisible("stop_btn", false);
@@ -178,14 +204,13 @@ BOOL LLFloaterGesture::postBuild()
 
 	buildGestureList();
 	
-	childSetFocus("gesture_list");
+	mGestureList->setFocus(TRUE);
 
-	LLCtrlListInterface *list = getGestureList();
-	if (list)
+	if (mGestureList)
 	{
 		const BOOL ascending = TRUE;
-		list->sortByColumn(std::string("name"), ascending);
-		list->selectFirstItem();
+		mGestureList->sortByColumn(std::string("name"), ascending);
+		mGestureList->selectFirstItem();
 	}
 	
 	// Update button labels
@@ -199,18 +224,17 @@ void LLFloaterGesture::refreshAll()
 {
 	buildGestureList();
 
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
+	if (!mGestureList) return;
 
 	if (mSelectedID.isNull())
 	{
-		list->selectFirstItem();
+		mGestureList->selectFirstItem();
 	}
 	else
 	{
-		if (! list->setCurrentByID(mSelectedID))
+		if (! mGestureList->setCurrentByID(mSelectedID))
 		{
-			list->selectFirstItem();
+			mGestureList->selectFirstItem();
 		}
 	}
 
@@ -220,20 +244,16 @@ void LLFloaterGesture::refreshAll()
 
 void LLFloaterGesture::buildGestureList()
 {
-	LLCtrlListInterface *list = getGestureList();
-	LLCtrlScrollInterface *scroll = childGetScrollInterface("gesture_list");
-
-	if (! (list && scroll)) return;
-
-	LLUUID selected_item = list->getCurrentID();
+	std::vector<LLUUID> selected_items;
+	getSelectedIds(selected_items);
 	LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
-	list->operateOnAll(LLCtrlListInterface::OP_DELETE);
+	mGestureList->deleteAllItems();
 
 	LLGestureManager::item_map_t::const_iterator it;
 	const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
 	for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
 	{
-		addGesture(it->first,it->second, list);
+		addGesture(it->first,it->second, mGestureList);
 	}
 	if (gInventory.isCategoryComplete(mGestureFolderID))
 	{
@@ -249,16 +269,17 @@ void LLFloaterGesture::buildGestureList()
 			if (active_gestures.find(item->getUUID()) == active_gestures.end())
 			{
 				// if gesture wasn't loaded yet, we can display only name
-				addGesture(item->getUUID(), NULL, list);
+				addGesture(item->getUUID(), NULL, mGestureList);
 			}
 		}
 	}
 	// attempt to preserve scroll position through re-builds
 	// since we do re-build any time anything dirties
-	if(list->selectByValue(LLSD(selected_item)))
+	for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++)
 	{
-		scroll->scrollToShowSelected();
+		mGestureList->selectByID(*it);
 	}
+	mGestureList->scrollToShowSelected();
 }
 
 void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
@@ -346,33 +367,59 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
 	list->addElement(element, ADD_BOTTOM);
 }
 
-void LLFloaterGesture::onClickInventory()
+void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids)
+{
+	std::vector<LLScrollListItem*> items = mGestureList->getAllSelected();
+	for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++)
+	{
+		ids.push_back((*it)->getUUID());
+	}
+}
+
+bool LLFloaterGesture::isActionEnabled(const LLSD& command)
 {
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
-	const LLUUID& item_id = list->getCurrentID();
+	// paste copy_uuid edit_gesture
+	std::string command_name = command.asString();
+	if("paste" == command_name)
+	{
+		if(!LLInventoryClipboard::instance().hasContents())
+			return false;
 
-	LLFloaterInventory* inv = LLFloaterInventory::showAgentInventory();
-	if (!inv) return;
-	inv->getPanel()->setSelection(item_id, TRUE);
+		LLDynamicArray<LLUUID> ids;
+		LLInventoryClipboard::instance().retrieve(ids);
+		for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			LLInventoryItem* item = gInventory.getItem(*it);
+			
+			if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+			{
+				return true;
+			}
+		}
+		return false;
+	}
+	else if("copy_uuid" == command_name || "edit_gesture" == command_name 
+			|| "inspect" == command_name)
+	{
+		return	mGestureList->getAllSelected().size() == 1;
+	}
+	return true;
 }
 
 void LLFloaterGesture::onClickPlay()
 {
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
-	const LLUUID& item_id = list->getCurrentID();
+	const LLUUID& item_id = mGestureList->getCurrentID();
 	if(item_id.isNull()) return;
 
 	LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
 	if(!LLGestureManager::instance().isGestureActive(item_id))
 	{
-		// we need to inform server about gesture activating to be consistent with LLPreviewGesture.
+		// we need to inform server about gesture activating to be consistent with LLPreviewGesture and  LLGestureComboBox.
 		BOOL inform_server = TRUE;
 		BOOL deactivate_similar = FALSE;
+		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
 		LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
 		LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
-		LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
 	}
 	else
 	{
@@ -380,15 +427,6 @@ void LLFloaterGesture::onClickPlay()
 	}
 }
 
-class GestureShowCallback : public LLInventoryCallback
-{
-public:
-	void fire(const LLUUID &inv_item)
-	{
-		LLPreviewGesture::show(inv_item, LLUUID::null);
-	}
-};
-
 void LLFloaterGesture::onClickNew()
 {
 	LLPointer<LLInventoryCallback> cb = new GestureShowCallback();
@@ -399,27 +437,96 @@ void LLFloaterGesture::onClickNew()
 
 void LLFloaterGesture::onActivateBtnClick()
 {
-	LLCtrlListInterface* list = getGestureList();
-	
-	LLUUID gesture_inv_id = list->getSelectedValue();
+	std::vector<LLUUID> ids;
+	getSelectedIds(ids);
+	if(ids.empty())
+		return;
+
 	LLGestureManager* gm = LLGestureManager::getInstance();
-	
-	if(gm->isGestureActive(gesture_inv_id))
+	std::vector<LLUUID>::const_iterator it = ids.begin();
+	BOOL first_gesture_state = gm->isGestureActive(*it);
+	BOOL is_mixed = FALSE;
+	while( ++it != ids.end() )
 	{
-		gm->deactivateGesture(gesture_inv_id);
+		if(first_gesture_state != gm->isGestureActive(*it))
+		{
+			is_mixed = TRUE;
+			break;
+		}
 	}
-	else
+	for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
 	{
-		gm->activateGesture(gesture_inv_id);
+		if(is_mixed)
+		{
+			gm->activateGesture(*it);
+		}
+		else
+		{
+			if(first_gesture_state)
+			{
+				gm->deactivateGesture(*it);
+			}
+			else
+			{
+				gm->activateGesture(*it);
+			}
+		}
 	}
 }
 
+void LLFloaterGesture::onCopyPastAction(const LLSD& command)
+{
+	std::string command_name  = command.asString();
+	// since we select this comman inventory item had  already arrived .
+	if("copy_gesture" == command_name)
+	{
+		std::vector<LLUUID> ids;
+		getSelectedIds(ids);
+		// make sure that clopboard is empty
+		LLInventoryClipboard::instance().reset();
+		for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			LLInventoryItem* item = gInventory.getItem(*it);
+			if(item  && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+			{
+				LLInventoryClipboard::instance().add(item->getUUID());
+			}
+		}
+	}
+	else if ("paste" == command_name)
+	{
+		LLInventoryClipboard& clipbord = LLInventoryClipboard::instance();
+		LLDynamicArray<LLUUID> ids;
+		clipbord.retrieve(ids);
+		if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
+			return;
+		LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
+		LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
+
+		for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+		{
+			LLInventoryItem* item = gInventory.getItem(*it);
+			LLStringUtil::format_map_t string_args;
+			string_args["[COPY_NAME]"] = item->getName();
+			if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+			{
+				LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << "  "<< item->getUUID() << " into "
+										<< gesture_dir->getName() << "  "<< gesture_dir->getUUID() << LL_ENDL;
+				copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), 
+						gesture_dir->getUUID(), getString("copy_name", string_args), cb);
+			}
+		}
+		clipbord.reset();
+	}
+	else if ("copy_uuid" == command_name)
+	{
+		gClipboard.copyFromString(utf8str_to_wstring(mGestureList->getCurrentID().asString()), mGestureList->getCurrentID());
+	}
+}
 
 void LLFloaterGesture::onClickEdit()
 {
-	LLCtrlListInterface *list = getGestureList();
-	if (!list) return;
-	const LLUUID& item_id = list->getCurrentID();
+	const LLUUID& item_id = mGestureList->getCurrentID();
 
 	LLInventoryItem* item = gInventory.getItem(item_id);
 	if (!item) return;
@@ -433,7 +540,7 @@ void LLFloaterGesture::onClickEdit()
 
 void LLFloaterGesture::onCommitList()
 {
-	const LLUUID& item_id = childGetValue("gesture_list").asUUID();
+	const LLUUID& item_id = mGestureList->getCurrentID();
 
 	mSelectedID = item_id;
 	if (LLGestureManager::instance().isGesturePlaying(item_id))
@@ -447,8 +554,60 @@ void LLFloaterGesture::onCommitList()
 		childSetVisible("stop_btn", false);
 	}
 }
+
+void LLFloaterGesture::onDeleteSelected()
+{
+	std::vector<LLUUID> ids;
+	getSelectedIds(ids);
+	if(ids.empty())
+		return;
+
+	const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+	LLGestureManager* gm = LLGestureManager::getInstance();
+	for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+	{
+		const LLUUID& selected_item = *it;
+		LLInventoryItem* inv_item = gInventory.getItem(selected_item);
+		if (inv_item && inv_item->getInventoryType() == LLInventoryType::IT_GESTURE)
+		{
+			if(gm->isGestureActive(selected_item))
+			{
+				gm->deactivateGesture(selected_item);
+			}
+			LLInventoryModel::update_list_t update;
+			LLInventoryModel::LLCategoryUpdate old_folder(inv_item->getParentUUID(), -1);
+			update.push_back(old_folder);
+			LLInventoryModel::LLCategoryUpdate new_folder(trash_id, 1);
+			update.push_back(new_folder);
+			gInventory.accountForUpdate(update);
+
+			LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(inv_item);
+			new_item->setParent(trash_id);
+			// no need to restamp it though it's a move into trash because
+			// it's a brand new item already.
+			new_item->updateParentOnServer(FALSE);
+			gInventory.updateItem(new_item);
+		}
+	}
+	gInventory.notifyObservers();
+	buildGestureList();
+}
+
+void LLFloaterGesture::addToCurrentOutFit()
+{
+	std::vector<LLUUID> ids;
+	getSelectedIds(ids);
+	LLAppearanceManager* am = LLAppearanceManager::getInstance();
+	for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+	{
+		am->addCOFItemLink(*it);
+	}
+}
+
 void LLFloaterGesture::playGesture(LLUUID item_id)
 {
+	LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL;
+
 	if (LLGestureManager::instance().isGesturePlaying(item_id))
 	{
 		LLGestureManager::instance().stopGesture(item_id);
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 50bef818daa587fbeda99edf2a9d42c7071239eb..14e132900df59d184a6c736efa0021bf6a1446c9 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -36,11 +36,10 @@
 
 #ifndef LL_LLFLOATERGESTURE_H
 #define LL_LLFLOATERGESTURE_H
+#include <vector> 
 
 #include "llfloater.h"
-#include "llinventorymodel.h"
 #include "llinventoryobserver.h"
-#include "lldarray.h"
 
 class LLScrollContainer;
 class LLView;
@@ -53,6 +52,7 @@ class LLScrollListCtrl;
 class LLFloaterGestureObserver;
 class LLFloaterGestureInventoryObserver;
 class LLMultiGesture;
+class LLMenuGL;
 
 class LLFloaterGesture
 :	public LLFloater, LLInventoryFetchDescendentsObserver
@@ -65,26 +65,46 @@ class LLFloaterGesture
 	virtual BOOL postBuild();
 	virtual void done ();
 	void refreshAll();
+	/**
+	 * @brief Add new scrolllistitem into gesture_list.
+	 * @param  item_id inventory id of gesture
+	 * @param  gesture can be NULL , if item was not loaded yet
+	 */
+	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
 
 protected:
 	// Reads from the gesture manager's list of active gestures
 	// and puts them in this list.
 	void buildGestureList();
-	void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
-	void onClickInventory();
+	void playGesture(LLUUID item_id);
+private:
+	void addToCurrentOutFit();
+	/**
+	 * @brief  This method is using to collect selected items. 
+	 * In some places gesture_list can be rebuilt by gestureObservers during  iterating data from LLScrollListCtrl::getAllSelected().
+	 * Therefore we have to copy these items to avoid viewer crash.
+	 * @see LLFloaterGesture::onActivateBtnClick
+	 */
+	void getSelectedIds(std::vector<LLUUID>& ids);
+	bool isActionEnabled(const LLSD& command);
+	/**
+	 * @brief Activation rules:
+	 *  According to Gesture Spec:
+	 *  1. If all selected gestures are active: set to inactive
+	 *  2. If all selected gestures are inactive: set to active
+	 *  3. If selected gestures are in a mixed state: set all to active
+	 */
+	void onActivateBtnClick();
 	void onClickEdit();
 	void onClickPlay();
 	void onClickNew();
 	void onCommitList();
-	void playGesture(LLUUID item_id);
-	LLCtrlListInterface* getGestureList() const 
-	{
-		return childGetListInterface("gesture_list");
-	}
-	void onActivateBtnClick();
-protected:
+	void onCopyPastAction(const LLSD& command);
+	void onDeleteSelected();
+
 	LLUUID mSelectedID;
 	LLUUID mGestureFolderID;
+	LLScrollListCtrl* mGestureList;
 
 	LLFloaterGestureObserver* mObserver;
 };
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index 92778510e70fb13fc47bcf49e8f566261ab88025..db38fc0fb34f65ec715caef1f09b9598df13e635 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -64,10 +64,7 @@ BOOL LLFloaterInventory::postBuild()
 
 void LLFloaterInventory::draw()
 {
- 	if (LLInventoryModel::isEverythingFetched())
-	{
-		updateTitle();
-	}
+	updateTitle();
 	LLFloater::draw();
 }
 
@@ -85,10 +82,14 @@ void LLFloaterInventory::updateTitle()
 	{
 		setTitle(getString("TitleFetching", string_args));
 	}
-	else
+	else if (LLInventoryModel::isEverythingFetched())
 	{
 		setTitle(getString("TitleCompleted", string_args));
 	}
+	else
+	{
+		setTitle(getString("Title"));
+	}
 }
 
 void LLFloaterInventory::changed(U32 mask)
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 7fc207d3950a8bbae1c437ff114b17c7daf0a469..e20249a737a2abe034af34e42dffd655c497c233 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -56,6 +56,7 @@
 #include "llfloaterabout.h"
 #include "llfloaterhardwaresettings.h"
 #include "llfloatervoicedevicesettings.h"
+#include "llimfloater.h"
 #include "llkeyboard.h"
 #include "llmodaldialog.h"
 #include "llnavigationbar.h"
@@ -164,7 +165,6 @@ BOOL LLVoiceSetKeyDialog::handleKeyHere(KEY key, MASK mask)
 	{
 		mParent->setKey(key);
 	}
-	
 	closeFloater();
 	return result;
 }
@@ -310,7 +310,8 @@ F32 LLFloaterPreference::sAspectRatio = 0.0;
 LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 	: LLFloater(key),
 	mGotPersonalInfo(false),
-	mOriginalIMViaEmail(false)
+	mOriginalIMViaEmail(false),
+	mCancelOnClose(true)
 {
 	//Build Floater is now Called from 	LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
 	
@@ -357,6 +358,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
 
 BOOL LLFloaterPreference::postBuild()
 {
+	gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
+
 	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
 	if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
 		tabcontainer->selectFirstTab();
@@ -390,6 +393,20 @@ void LLFloaterPreference::draw()
 	LLFloater::draw();
 }
 
+void LLFloaterPreference::saveSettings()
+{
+	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
+	child_list_t::const_iterator iter = tabcontainer->getChildList()->begin();
+	child_list_t::const_iterator end = tabcontainer->getChildList()->end();
+	for ( ; iter != end; ++iter)
+	{
+		LLView* view = *iter;
+		LLPanelPreference* panel = dynamic_cast<LLPanelPreference*>(view);
+		if (panel)
+			panel->saveSettings();
+	}
+}	
+
 void LLFloaterPreference::apply()
 {
 	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
@@ -444,6 +461,8 @@ void LLFloaterPreference::apply()
 	
 //	LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString());
 //	LLWStringUtil::replaceTabsWithSpaces(busy_response, 4);
+
+	gSavedSettings.setBOOL("PlainTextChatHistory", childGetValue("plain_text_chat_history").asBoolean());
 	
 	if(mGotPersonalInfo)
 	{ 
@@ -551,6 +570,11 @@ void LLFloaterPreference::onOpen(const LLSD& key)
 	
 	LLPanelLogin::setAlwaysRefresh(true);
 	refresh();
+	
+	// Make sure the current state of prefs are saved away when
+	// when the floater is opened.  That will make cancel do its
+	// job
+	saveSettings();
 }
 
 void LLFloaterPreference::onVertexShaderEnable()
@@ -569,7 +593,7 @@ void LLFloaterPreference::onClose(bool app_quitting)
 {
 	gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
 	LLPanelLogin::setAlwaysRefresh(false);
-	cancel(); // will be a no-op if OK or apply was performed just prior.
+	if (mCancelOnClose) cancel();
 }
 
 void LLFloaterPreference::onOpenHardwareSettings()
@@ -592,7 +616,11 @@ void LLFloaterPreference::onBtnOK()
 	if (canClose())
 	{
 		apply();
+		// Here we do not want to cancel on close, so we do this funny thing
+		// that prevents cancel from undoing our changes when we hit OK
+		mCancelOnClose = false;
 		closeFloater(false);
+		mCancelOnClose = true;
 		gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
 		LLUIColorTable::instance().saveUserSettings();
 		std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
@@ -620,6 +648,7 @@ void LLFloaterPreference::onBtnApply( )
 		}
 	}
 	apply();
+	saveSettings();
 
 	LLPanelLogin::refreshLocation( false );
 }
@@ -636,7 +665,8 @@ void LLFloaterPreference::onBtnCancel()
 		}
 		refresh();
 	}
-	closeFloater(); // side effect will also cancel any unsaved changes.
+	cancel();
+	closeFloater();
 }
 
 // static 
@@ -1161,6 +1191,8 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im
 	childSetLabelArg("online_visibility", "[DIR_VIS]", mDirectoryVisibility);
 	childEnable("send_im_to_email");
 	childSetValue("send_im_to_email", im_via_email);
+	childEnable("plain_text_chat_history");
+	childSetValue("plain_text_chat_history", gSavedSettings.getBOOL("PlainTextChatHistory"));
 	childEnable("log_instant_messages");
 //	childEnable("log_chat");
 //	childEnable("busy_response");
@@ -1492,6 +1524,11 @@ BOOL LLPanelPreference::postBuild()
 }
 
 void LLPanelPreference::apply()
+{
+	// no-op
+}
+
+void LLPanelPreference::saveSettings()
 {
 	// Save the value of all controls in the hierarchy
 	mSavedValues.clear();
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 41c8bb71247a064997dcada43a6890046558e9fe..a30422564aec1cc9c455a5d82f82a62d51a1f6c7 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -97,6 +97,10 @@ class LLFloaterPreference : public LLFloater
 	// callback for when client turns on shaders
 	void onVertexShaderEnable();
 	
+	// This function squirrels away the current values of the controls so that
+	// cancel() can restore them.	
+	void saveSettings();
+		
 
 public:
 
@@ -145,6 +149,7 @@ class LLFloaterPreference : public LLFloater
 	static std::string sSkin;
 	bool mGotPersonalInfo;
 	bool mOriginalIMViaEmail;
+	bool mCancelOnClose;
 	
 	bool mOriginalHideOnlineStatus;
 	std::string mDirectoryVisibility;
@@ -161,6 +166,10 @@ class LLPanelPreference : public LLPanel
 	virtual void cancel();
 	void setControlFalse(const LLSD& user_data);
 
+	// This function squirrels away the current values of the controls so that
+	// cancel() can restore them.
+	virtual void saveSettings();
+	
 private:
 	typedef std::map<LLControlVariable*, LLSD> control_values_map_t;
 	control_values_map_t mSavedValues;
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index b4d248bc40b98e08882f3f3a18d61fe771cdaae0..dbd36437423ef852bf3c073f20a86fd886efe09f 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -43,6 +43,7 @@
 #include "llcheckboxctrl.h"
 #include "llcombobox.h"
 #include "lldraghandle.h"
+#include "llerror.h"
 #include "llfloaterbuildoptions.h"
 #include "llfloatermediasettings.h"
 #include "llfloateropenobject.h"
@@ -1109,7 +1110,8 @@ void LLFloaterTools::getMediaState()
 		childSetEnabled("edit_media", FALSE);
 		childSetEnabled("media_info", FALSE);
 		media_info->setEnabled(FALSE);
-		media_info->clear();*/	
+		media_info->clear();*/
+		LL_WARNS("LLFloaterTools: media") << "Media not enabled (no capability) in this region!" << LL_ENDL;
 		clearMediaSettings();
 		return;
 	}
@@ -1128,11 +1130,27 @@ void LLFloaterTools::getMediaState()
 			LLVOVolume* object = dynamic_cast<LLVOVolume*>(node->getObject());
 			if (NULL != object)
 			{
-				if (!object->permModify() || object->isMediaDataBeingFetched())
+				if (!object->permModify())
 				{
+					LL_INFOS("LLFloaterTools: media")
+						<< "Selection not editable due to lack of modify permissions on object id "
+						<< object->getID() << LL_ENDL;
+					
 					editable = false;
 					break;
 				}
+				// XXX DISABLE this for now, because when the fetch finally 
+				// does come in, the state of this floater doesn't properly
+				// update.  This needs more thought.
+//				if (object->isMediaDataBeingFetched())
+//				{
+//					LL_INFOS("LLFloaterTools: media")
+//						<< "Selection not editable due to media data being fetched for object id "
+//						<< object->getID() << LL_ENDL;
+//						
+//					editable = false;
+//					break;
+//				}
 			}
 		}
 	}
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 420dba07fe98fda492ffe961f13d4083a8c23b2e..63511301b316d0f0766d7e61ff94bf9957345f83 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -2516,11 +2516,13 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
 	{
 
 		static const LLUUID& favorites_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
+		static const LLUUID& landmarks_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
 
 		LLUUID a_uuid = a->getParentFolder()->getListener()->getUUID();
 		LLUUID b_uuid = b->getParentFolder()->getListener()->getUUID();
 
-		if (a_uuid == favorites_folder_id && b_uuid == favorites_folder_id)
+		if ((a_uuid == favorites_folder_id && b_uuid == favorites_folder_id) ||
+			(a_uuid == landmarks_folder_id && b_uuid == landmarks_folder_id))
 		{
 			// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem
 			// or to LLInvFVBridge
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 4a487bd5a7c84a2903a71263358d12b64156aa6f..795770d3dbc14d34cc70a308a65dc1efbbf662d0 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -53,6 +53,10 @@
 #include "lltransientfloatermgr.h"
 #include "llinventorymodel.h"
 
+#ifdef USE_IM_CONTAINER
+	#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
+#endif
+
 
 
 LLIMFloater::LLIMFloater(const LLUUID& session_id)
@@ -106,10 +110,10 @@ void LLIMFloater::onFocusReceived()
 // virtual
 void LLIMFloater::onClose(bool app_quitting)
 {
+	if (!gIMMgr->hasSession(mSessionID)) return;
+	
 	setTyping(false);
-	// SJB: We want the close button to hide the session window, not end it
-	// *NOTE: Yhis is functional, but not ideal - it's still closing the floater; we really want to change the behavior of the X button instead.
-	//gIMMgr->leaveSession(mSessionID);
+	gIMMgr->leaveSession(mSessionID);
 }
 
 /* static */
@@ -257,7 +261,11 @@ BOOL LLIMFloater::postBuild()
 	//*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla"
 	//see LLFloaterIMPanel for how it is done (IB)
 
+#ifdef USE_IM_CONTAINER
+	return LLFloater::postBuild();
+#else
 	return LLDockableFloater::postBuild();
+#endif
 }
 
 // virtual
@@ -318,6 +326,11 @@ void LLIMFloater::onSlide()
 //static
 LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 {
+#ifdef USE_IM_CONTAINER
+	LLIMFloater* target_floater = findInstance(session_id);
+	bool not_existed = NULL == target_floater;
+
+#else
 	//hide all
 	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
 	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
@@ -329,12 +342,25 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 			floater->setVisible(false);
 		}
 	}
+#endif
 
 	LLIMFloater* floater = LLFloaterReg::showTypedInstance<LLIMFloater>("impanel", session_id);
 
 	floater->updateMessages();
 	floater->mInputEditor->setFocus(TRUE);
 
+#ifdef USE_IM_CONTAINER
+	// do not add existed floaters to avoid adding torn off instances
+	if (not_existed)
+	{
+		//		LLTabContainer::eInsertionPoint i_pt = user_initiated ? LLTabContainer::RIGHT_OF_CURRENT : LLTabContainer::END;
+		// TODO: mantipov: use LLTabContainer::RIGHT_OF_CURRENT if it exists
+		LLTabContainer::eInsertionPoint i_pt = LLTabContainer::END;
+
+		LLIMFloaterContainer* floater_container = LLFloaterReg::showTypedInstance<LLIMFloaterContainer>("im_container");
+		floater_container->addFloater(floater, TRUE, i_pt);
+	}
+#else
 	if (floater->getDockControl() == NULL)
 	{
 		LLChiclet* chiclet =
@@ -352,13 +378,14 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
 		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
 				LLDockControl::TOP,  boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
 	}
+#endif
 
 	return floater;
 }
 
 void LLIMFloater::getAllowedRect(LLRect& rect)
 {
-	rect = gViewerWindow->getWorldViewRectScaled();
+	rect = gViewerWindow->getWorldViewRectRaw();
 }
 
 void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
@@ -368,7 +395,9 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
 		(LLNotificationsUI::LLChannelManager::getInstance()->
 											findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
 	
+#ifndef USE_IM_CONTAINER
 	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+#endif
 
 	// update notification channel state
 	if(channel)
@@ -394,6 +423,7 @@ void LLIMFloater::setVisible(BOOL visible)
 //static
 bool LLIMFloater::toggle(const LLUUID& session_id)
 {
+#ifndef USE_IM_CONTAINER
 	LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
 	if (floater && floater->getVisible() && floater->isDocked())
 	{
@@ -409,6 +439,7 @@ bool LLIMFloater::toggle(const LLUUID& session_id)
 		return true;
 	}
 	else
+#endif
 	{
 		// ensure the list of messages is updated when floater is made visible
 		show(session_id);
@@ -451,6 +482,8 @@ void LLIMFloater::sessionInitReplyReceived(const LLUUID& im_session_id)
 
 void LLIMFloater::updateMessages()
 {
+	bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
+
 	std::list<LLSD> messages;
 	LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
 
@@ -476,39 +509,7 @@ void LLIMFloater::updateMessages()
 			chat.mText = message;
 			chat.mTimeStr = time;
 			
-			//Handle IRC styled /me messages.
-			std::string prefix = message.substr(0, 4);
-			if (prefix == "/me " || prefix == "/me'")
-			{
-				
-				LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
-				LLViewerChat::getChatColor(chat,txt_color);
-				LLFontGL* fontp = LLViewerChat::getChatFont();
-				std::string font_name = LLFontGL::nameFromFont(fontp);
-				std::string font_size = LLFontGL::sizeFromFont(fontp);
-				LLStyle::Params append_style_params;
-				append_style_params.color(txt_color);
-				append_style_params.readonly_color(txt_color);
-				append_style_params.font.name(font_name);
-				append_style_params.font.size(font_size);
-				
-				if (from.size() > 0)
-				{
-					append_style_params.font.style = "ITALIC";
-					chat.mText = from;
-					mChatHistory->appendWidgetMessage(chat, append_style_params);
-				}
-				
-				message = message.substr(3);
-				append_style_params.font.style = "ITALIC";
-				mChatHistory->appendText(message, FALSE, append_style_params);
-			}
-			else
-			{
-				chat.mText = message;
-				mChatHistory->appendWidgetMessage(chat);
-			}
-
+			mChatHistory->appendMessage(chat, use_plain_text_chat_history);
 			mLastMessageIndex = msg["index"].asInteger();
 		}
 	}
@@ -639,6 +640,28 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
 	}
 }
 
+void LLIMFloater::updateChatHistoryStyle()
+{
+	mChatHistory->clear();
+	mLastMessageIndex = -1;
+	updateMessages();
+}
+
+void LLIMFloater::processChatHistoryStyleUpdate(const LLSD& newvalue)
+{
+	LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("impanel");
+	for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin();
+		 iter != inst_list.end(); ++iter)
+	{
+		LLIMFloater* floater = dynamic_cast<LLIMFloater*>(*iter);
+		if (floater)
+		{
+			floater->updateChatHistoryStyle();
+		}
+	}
+
+}
+
 void LLIMFloater::processSessionUpdate(const LLSD& session_update)
 {
 	// *TODO : verify following code when moderated mode will be implemented
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index e2d500d821e1d7d68e322543368a05c444b9eb19..9e1330ff497ea4112b9cc0b72b18c697e9858862 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -33,6 +33,11 @@
 #ifndef LL_IMFLOATER_H
 #define LL_IMFLOATER_H
 
+// This variable is used to show floaters related to chiclets in a Multi Floater Container
+// So, this functionality does not require to have IM Floaters as Dockable & Transient
+// See EXT-2640.
+#define USE_IM_CONTAINER
+
 #include "lltransientdockablefloater.h"
 #include "lllogchat.h"
 #include "lltooldraganddrop.h"
@@ -92,6 +97,9 @@ class LLIMFloater : public LLTransientDockableFloater
 	void processAgentListUpdates(const LLSD& body);
 	void processSessionUpdate(const LLSD& session_update);
 
+	void updateChatHistoryStyle();
+	static void processChatHistoryStyleUpdate(const LLSD& newvalue);
+
 	BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
 							   BOOL drop, EDragAndDropType cargo_type,
 							   void *cargo_data, EAcceptance *accept,
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6e4b3ae2140b4595f1d42ba6c1b81a2d97872190
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -0,0 +1,96 @@
+/** 
+ * @file llimfloatercontainer.cpp
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llimfloatercontainer.h"
+
+//
+// LLIMFloaterContainer
+//
+LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
+:	LLMultiFloater(seed),
+	mActiveVoiceFloater(NULL)
+{
+	mAutoResize = FALSE;
+}
+
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+}
+
+BOOL LLIMFloaterContainer::postBuild()
+{
+	// Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
+	// mTabContainer will be initialized in LLMultiFloater::addChild()
+	return TRUE;
+}
+
+void LLIMFloaterContainer::onOpen(const LLSD& key)
+{
+	LLMultiFloater::onOpen(key);
+/*
+	if (key.isDefined())
+	{
+		LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
+		if (im_floater)
+		{
+			im_floater->openFloater();
+		}
+	}
+*/
+}
+
+void LLIMFloaterContainer::addFloater(LLFloater* floaterp, 
+									BOOL select_added_floater, 
+									LLTabContainer::eInsertionPoint insertion_point)
+{
+	if(!floaterp) return;
+
+	// already here
+	if (floaterp->getHost() == this)
+	{
+		openFloater(floaterp->getKey());
+		return;
+	}
+
+	LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
+
+	// make sure active voice icon shows up for new tab
+	if (floaterp == mActiveVoiceFloater)
+	{
+		mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");	
+	}
+}
+
+// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
new file mode 100644
index 0000000000000000000000000000000000000000..10cde56c6eeaae34b8759001df31e14ccb3b8f6e
--- /dev/null
+++ b/indra/newview/llimfloatercontainer.h
@@ -0,0 +1,61 @@
+/** 
+ * @file llimfloatercontainer.h
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLIMFLOATERCONTAINER_H
+#define LL_LLIMFLOATERCONTAINER_H
+
+#include "llfloater.h"
+#include "llmultifloater.h"
+
+class LLTabContainer;
+
+class LLIMFloaterContainer : public LLMultiFloater
+{
+public:
+	LLIMFloaterContainer(const LLSD& seed);
+	virtual ~LLIMFloaterContainer();
+	
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
+	/*virtual*/ void addFloater(LLFloater* floaterp, 
+								BOOL select_added_floater, 
+								LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
+
+	static LLFloater* getCurrentVoiceFloater();
+	
+protected:
+	
+	LLFloater* mActiveVoiceFloater;
+};
+
+#endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index baddd90d460e00b7d3fce14b7cb9b7ca39a0410e..866669f326ec8f4b40842865a3c281f979a7ca43 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -39,6 +39,7 @@
 #include "llavataractions.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llcallingcard.h"
+#include "lldateutil.h"
 #include "llfloaterreporter.h"
 #include "llfloaterworldmap.h"
 #include "llinspect.h"
@@ -351,7 +352,7 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data)
 {
 	LLStringUtil::format_map_t args;
 	args["[BORN_ON]"] = data->born_on;
-	args["[AGE]"] = data->born_on;
+	args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now());
 	args["[SL_PROFILE]"] = data->about_text;
 	args["[RW_PROFILE"] = data->fl_about_text;
 	args["[ACCTTYPE]"] = LLAvatarPropertiesProcessor::accountType(data);
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index 003afafa87abfa3a43fb218cb13c9611f7e7b98c..d50b68b624071dd0028eeb60fa711e7f67607677 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -374,22 +374,34 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal
 
 bool LLLandmarkActions::getLandmarkGlobalPos(const LLUUID& landmarkInventoryItemID, LLVector3d& posGlobal)
 {
-	LLLandmark* landmark = LLLandmarkActions::getLandmark(landmarkInventoryItemID);
+	LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
+	if (NULL == item)
+		return false;
+
+	const LLUUID& asset_id = item->getAssetUUID();
 
+	LLLandmark* landmark = gLandmarkList.getAsset(asset_id, NULL);
 	if (NULL == landmark)
 		return false;
 
 	return landmark->getGlobalPos(posGlobal);
 }
 
-LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID)
+LLLandmark* LLLandmarkActions::getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb)
 {
 	LLViewerInventoryItem* item = gInventory.getItem(landmarkInventoryItemID);
 	if (NULL == item)
 		return NULL;
 
 	const LLUUID& asset_id = item->getAssetUUID();
-	return gLandmarkList.getAsset(asset_id, NULL);
+
+	LLLandmark* landmark = gLandmarkList.getAsset(asset_id, cb);
+	if (landmark)
+	{
+		return landmark;
+	}
+
+	return NULL;
 }
 
 void LLLandmarkActions::copySLURLtoClipboard(const LLUUID& landmarkInventoryItemID)
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index c65b831f3e62017c7f4d253d039d2c57ed2364da..987caf0936df9658aba308880851d5496677936f 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -35,7 +35,10 @@
 
 #include "llinventorymodel.h"
 
+#include "lllandmarklist.h"
+
 class LLLandmark;
+
 /**
  * @brief Provides helper functions to manage landmarks
  */
@@ -112,10 +115,11 @@ class LLLandmarkActions
 
     /**
      * @brief Retrieve a landmark from gLandmarkList by inventory item's id
+     * If a landmark is not currently in the gLandmarkList a callback "cb" is called when it is loaded.
      * 
      * @return pointer to loaded landmark from gLandmarkList or NULL if landmark does not exist or wasn't loaded.
      */
-    static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID);
+    static LLLandmark* getLandmark(const LLUUID& landmarkInventoryItemID, LLLandmarkList::loaded_callback_t cb = NULL);
 
     /**
      * @brief  Performs standard action of copying of SLURL from landmark to user's clipboard.
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 7e35cfa04c201aad03cdf4dc007fe74d46ee8eec..9aefbcbbb0346733706d3335d2bc281a67c18243 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -188,7 +188,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	params.rect(text_entry_rect);
 	params.default_text(LLStringUtil::null);
 	params.max_length_bytes(p.max_chars);
-	params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2));
 	params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1));
 	params.handle_edit_keys_directly(true);
 	params.commit_on_focus_lost(false);
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 986c14acff7b3e1384fe9c0a94983324a913a82c..badef4c7ae8039213a6777fc5f6a3eb622f31bc3 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -371,67 +371,87 @@ BOOL LLMediaDataClient::QueueTimer::tick()
 	}
 	
 	LLMediaDataClient::PriorityQueue &queue = *(mMDC->pRequestQueue);
-	
-	if (queue.empty())
+
+	if(!queue.empty())
 	{
-		LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL;
-		return TRUE;
+		LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is:	  " << queue << LL_ENDL;
 	}
 
-	LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is:	  " << queue << LL_ENDL;
-
-	// Peel one off of the items from the queue, and execute request
-	request_ptr_t request = queue.top();
-	llassert(!request.isNull());
-	const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
-	bool performed_request = false;
-	bool error = false;
-	llassert(NULL != object);
-	if (NULL != object && object->hasMedia())
+	// quick retry loop for cases where we shouldn't wait for the next timer tick
+	while(true)
 	{
-		std::string url = request->getCapability();
-		if (!url.empty())
+		if (queue.empty())
 		{
-			const LLSD &sd_payload = request->getPayload();
-			LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL;
-
-			// Call the subclass for creating the responder
-			LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request));
-			performed_request = true;
+			LL_DEBUGS("LLMediaDataClient") << "queue empty: " << queue << LL_ENDL;
+			return TRUE;
 		}
-		else {
-			LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL;
-		}
-	}
-	else {
-		if (request.isNull()) 
+	
+		// Peel one off of the items from the queue, and execute request
+		request_ptr_t request = queue.top();
+		llassert(!request.isNull());
+		const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
+		bool performed_request = false;
+		bool error = false;
+		llassert(NULL != object);
+
+		if(object->isDead())
 		{
-			LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL;
+			// This object has been marked dead.  Pop it and move on to the next item in the queue immediately.
+			LL_INFOS("LLMediaDataClient") << "Skipping " << *request << ": object is dead!" << LL_ENDL;
+			queue.pop();
+			continue;	// jump back to the start of the quick retry loop
 		}
-		else if (NULL == object) 
+
+		if (NULL != object && object->hasMedia())
 		{
-			LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL;
+			std::string url = request->getCapability();
+			if (!url.empty())
+			{
+				const LLSD &sd_payload = request->getPayload();
+				LL_INFOS("LLMediaDataClient") << "Sending request for " << *request << LL_ENDL;
+
+				// Call the subclass for creating the responder
+				LLHTTPClient::post(url, sd_payload, mMDC->createResponder(request));
+				performed_request = true;
+			}
+			else {
+				LL_INFOS("LLMediaDataClient") << "NOT Sending request for " << *request << ": empty cap url!" << LL_ENDL;
+			}
 		}
-		else if (!object->hasMedia())
-		{
-			LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL;
+		else {
+			if (request.isNull()) 
+			{
+				LL_WARNS("LLMediaDataClient") << "Not Sending request: NULL request!" << LL_ENDL;
+			}
+			else if (NULL == object) 
+			{
+				LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " NULL object!" << LL_ENDL;
+			}
+			else if (!object->hasMedia())
+			{
+				LL_WARNS("LLMediaDataClient") << "Not Sending request for " << *request << " hasMedia() is false!" << LL_ENDL;
+			}
+			error = true;
 		}
-		error = true;
-	}
-	bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries;
-	if (performed_request || exceeded_retries || error) // Try N times before giving up 
-	{
-		if (exceeded_retries)
+		bool exceeded_retries = request->getRetryCount() > mMDC->mMaxNumRetries;
+		if (performed_request || exceeded_retries || error) // Try N times before giving up 
 		{
-			LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " 
-										  << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; 
-			// XXX Should we bring up a warning dialog??
+			if (exceeded_retries)
+			{
+				LL_WARNS("LLMediaDataClient") << "Could not send request " << *request << " for " 
+											  << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; 
+				// XXX Should we bring up a warning dialog??
+			}
+			queue.pop();
 		}
-		queue.pop();
-	}
-	else {
-		request->incRetryCount();
-	}
+		else {
+			request->incRetryCount();
+		}
+		
+ 		// end of quick retry loop -- any cases where we want to loop will use 'continue' to jump back to the start.
+ 		break;
+	}  
+	
 	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, queue is now: " << (*(mMDC->pRequestQueue)) << LL_ENDL;
 
 	return queue.empty();
@@ -617,6 +637,9 @@ void LLObjectMediaNavigateClient::navigate(LLMediaDataClientObject *object, U8 t
 	sd_payload[LLTextureEntry::OBJECT_ID_KEY] = object->getID();
 	sd_payload[LLMediaEntry::CURRENT_URL_KEY] = url;
 	sd_payload[LLTextureEntry::TEXTURE_INDEX_KEY] = (LLSD::Integer)texture_index;
+	
+	LL_INFOS("LLMediaDataClient") << "navigate() initiated: " << ll_print_sd(sd_payload) << LL_ENDL;
+	
 	request(object, sd_payload);
 }
 
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 0d1450ffbe53487ee52be734dad6f72b4eb777ca..d5dd050111faec3400001a7cbed9b27316eb1745 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -62,6 +62,8 @@ class LLMediaDataClientObject : public LLRefCount
 	virtual F64 getTotalMediaInterest() const = 0;
 	// Return the given cap url
 	virtual std::string getCapabilityUrl(const std::string &name) const = 0;
+	// Return whether the object has been marked dead
+	virtual bool isDead() const = 0;
 
 	// smart pointer
 	typedef LLPointer<LLMediaDataClientObject> ptr_t;
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 114d26af8aac017377f76135f46be411a4442118..c032d01d2f2ee9a92c533e4bfc16675b0d4f3b6a 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -172,7 +172,8 @@ LLNavigationBar::LLNavigationBar()
 	mBtnHome(NULL),
 	mCmbLocation(NULL),
 	mSearchComboBox(NULL),
-	mPurgeTPHistoryItems(false)
+	mPurgeTPHistoryItems(false),
+	mSaveToLocationHistory(false)
 {
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml");
 
@@ -186,6 +187,7 @@ LLNavigationBar::LLNavigationBar()
 LLNavigationBar::~LLNavigationBar()
 {
 	mTeleportFinishConnection.disconnect();
+	mTeleportFailedConnection.disconnect();
 }
 
 BOOL LLNavigationBar::postBuild()
@@ -220,6 +222,12 @@ BOOL LLNavigationBar::postBuild()
 	
 	mSearchComboBox->setCommitCallback(boost::bind(&LLNavigationBar::onSearchCommit, this));
 
+	mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+		setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1));
+
+	mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
+		setTeleportFailedCallback(boost::bind(&LLNavigationBar::onTeleportFailed, this));
+	
 	mDefaultNbRect = getRect();
 	mDefaultFpRect = getChild<LLFavoritesBarCtrl>("favorite")->getRect();
 
@@ -395,15 +403,19 @@ void LLNavigationBar::onLocationSelection()
 	LLWorldMapMessage::url_callback_t cb = boost::bind(
 			&LLNavigationBar::onRegionNameResponse, this,
 			typed_location, region_name, local_coords, _1, _2, _3, _4);
-	// connect the callback each time, when user enter new location to get real location of agent after teleport
-	mTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
-			setTeleportFinishedCallback(boost::bind(&LLNavigationBar::onTeleportFinished, this, _1,typed_location));
+	mSaveToLocationHistory = true;
 	LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name, cb, std::string("unused"), false);
 }
 
-void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location)
+void LLNavigationBar::onTeleportFailed()
 {
-	// Location is valid. Add it to the typed locations history.
+	mSaveToLocationHistory = false;
+}
+
+void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
+{
+	if (!mSaveToLocationHistory)
+		return;
 	LLLocationHistory* lh = LLLocationHistory::getInstance();
 
 	//TODO*: do we need convert surl into readable format?
@@ -426,8 +438,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos, con
 
 	lh->save();
 	
-	if(mTeleportFinishConnection.connected())
-		mTeleportFinishConnection.disconnect();
+	mSaveToLocationHistory = false;
 	
 }
 
diff --git a/indra/newview/llnavigationbar.h b/indra/newview/llnavigationbar.h
index 52f5a827e4b17bdc232cb72a710e8d771cce74cf..cd3ba08db3ced188f6d415668e23a1d60e26947c 100644
--- a/indra/newview/llnavigationbar.h
+++ b/indra/newview/llnavigationbar.h
@@ -81,7 +81,8 @@ class LLNavigationBar
 	void onLocationSelection();
 	void onLocationPrearrange(const LLSD& data);
 	void onSearchCommit();
-	void onTeleportFinished(const LLVector3d& global_agent_pos, const std::string& typed_location);
+	void onTeleportFinished(const LLVector3d& global_agent_pos);
+	void onTeleportFailed();
 	void onRegionNameResponse(
 			std::string typed_location,
 			std::string region_name,
@@ -99,8 +100,11 @@ class LLNavigationBar
 	LLLocationInputCtrl*		mCmbLocation;
 	LLRect						mDefaultNbRect;
 	LLRect						mDefaultFpRect;
+	boost::signals2::connection	mTeleportFailedConnection;
 	boost::signals2::connection	mTeleportFinishConnection;
 	bool						mPurgeTPHistoryItems;
+	// if true, save location to location history when teleport finishes
+	bool						mSaveToLocationHistory;
 };
 
 #endif
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 09fd9b29490cb224874a70bce0aea7be9381cc12..80a6cc343fae56c615ffa23e316ff280c5261b87 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -173,7 +173,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 				append_style_params.font.style = "ITALIC";
 				LLChat add_chat=chat;
 				add_chat.mText = chat.mFromName + " ";
-				mChatHistory->appendWidgetMessage(add_chat, append_style_params);
+				mChatHistory->appendMessage(add_chat, false, append_style_params);
 			}
 			
 			message = message.substr(3);
@@ -182,7 +182,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 		}
 		else
 		{
-			mChatHistory->appendWidgetMessage(chat);
+			mChatHistory->appendMessage(chat);
 		}
 	}
 }
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 598d0217039afa41b2ed7428f200f90a96822d15..0a595765a92f582ff62968a1c45003e708fe0c73 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -92,16 +92,26 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
 		// add message to IM
-		LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]);
-		if (!LLIMMgr::instance().hasSession(session_id))
+		const std::string
+				name =
+						notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
+								: notification->getSubstitutions()["[NAME]"];
+
+		// don't create IM session with objects
+		if (notification->getName() != "ObjectGiveItem"
+				&& notification->getName() != "ObjectGiveItemUnknownUser")
 		{
-			session_id = LLIMMgr::instance().addSession(
-					notification->getSubstitutions()["OBJECTFROMNAME"], IM_NOTHING_SPECIAL,
-					notification->getPayload()["from_id"]);
+			LLUUID from_id = notification->getPayload()["from_id"];
+			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
+					from_id);
+			if (!LLIMMgr::instance().hasSession(session_id))
+			{
+				session_id = LLIMMgr::instance().addSession(name,
+						IM_NOTHING_SPECIAL, from_id);
+			}
+			LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
+					notification->getMessage());
 		}
-		LLIMMgr::instance().addMessage(session_id, LLUUID(),
-				notification->getSubstitutions()["OBJECTFROMNAME"],
-				notification->getMessage());
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
 
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 4be98201d114c425f7f3dbc233616bf90f5699d2..f01f2e44414448be4674754f9e039ab40dd9ea93 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -38,9 +38,13 @@
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
 #include "llnotificationmanager.h"
+#include "llscriptfloater.h"
 
 using namespace LLNotificationsUI;
 
+static const std::string SCRIPT_DIALOG				("ScriptDialog");
+static const std::string SCRIPT_DIALOG_GROUP		("ScriptDialogGroup");
+
 //--------------------------------------------------------------------------
 LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
 {
@@ -90,25 +94,40 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
-		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
-
-		LLToast::Params p;
-		p.notif_id = notification->getID();
-		p.notification = notification;
-		p.panel = notify_box;	
-		p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
-
-		LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
-		if(channel)
-			channel->addToast(p);
-
-		// send a signal to the counter manager
-		mNewNotificationSignal();
-
+		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+		{
+			LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
+		}
+		else
+		{
+			LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+
+			LLToast::Params p;
+			p.notif_id = notification->getID();
+			p.notification = notification;
+			p.panel = notify_box;	
+			p.on_delete_toast = boost::bind(&LLScriptHandler::onDeleteToast, this, _1);
+
+			LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+			if(channel)
+			{
+				channel->addToast(p);
+			}
+
+			// send a signal to the counter manager
+			mNewNotificationSignal();
+		}
 	}
 	else if (notify["sigtype"].asString() == "delete")
 	{
-		mChannel->killToastByNotificationID(notification->getID());
+		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+		{
+			LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+		}
+		else
+		{
+			mChannel->killToastByNotificationID(notification->getID());
+		}
 	}
 	return true;
 }
@@ -123,6 +142,14 @@ void LLScriptHandler::onDeleteToast(LLToast* toast)
 	// send a signal to a listener to let him perform some action
 	// in this case listener is a SysWellWindow and it will remove a corresponding item from its list
 	mNotificationIDSignal(toast->getNotificationID());
+
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(toast->getNotificationID());
+	
+	if( notification && 
+		(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) )
+	{
+		LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
+	}
 }
 
 //--------------------------------------------------------------------------
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index a822897c7e644bff821f9ef33ba94438753b1754..110e05c7ab98179569df7d3b2a0c43e7e47c0aa2 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -38,6 +38,7 @@
 #include "llavatarconstants.h"	// AVATAR_ONLINE
 #include "llcallingcard.h"
 #include "llcombobox.h"
+#include "lldateutil.h"			// ageFromDate()
 #include "llimview.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
@@ -467,8 +468,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
 	//remove avatar id from cache to get fresh info
 	LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
 
-
-	childSetValue("register_date", avatar_data->born_on );
+	LLStringUtil::format_map_t args;
+	args["[REG_DATE]"] = avatar_data->born_on;
+	args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
+	std::string register_date = getString("RegisterDateFormat", args);
+	childSetValue("register_date", register_date );
 	childSetValue("sl_description_edit", avatar_data->about_text);
 	childSetValue("fl_description_edit",avatar_data->fl_about_text);
 	childSetValue("2nd_life_pic", avatar_data->image_id);
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index f94a59ecef5eec7e47a414f71cbef5dc436a75c5..5de7c3f851e375018981c7a3fdf53ba346bcaff1 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -352,6 +352,8 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
 	}
 
 	LLStringUtil::replaceChar(desc, '\n', ' ');
+	LLViewerInventoryItem::insertDefaultSortField(name);
+
 	// If no folder chosen use the "Landmarks" folder.
 	LLLandmarkActions::createLandmarkHere(name, desc,
 		folder_id.notNull() ? folder_id : gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index e199db37abd2a3321d581adc26836af346539f68..e24fa14e1e94f3662e82870071ce1d28d4d36a86 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -67,6 +67,27 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
 // helper functions
 static void filter_list(LLInventorySubTreePanel* inventory_list, const std::string& string);
 
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLLandmarksPanelObserver
+//
+// Bridge to support knowing when the inventory has changed to update
+// landmarks accordions visibility.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLLandmarksPanelObserver : public LLInventoryObserver
+{
+public:
+	LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+	virtual ~LLLandmarksPanelObserver() {}
+	/*virtual*/ void changed(U32 mask);
+
+private:
+	LLLandmarksPanel* mLP;
+};
+
+void LLLandmarksPanelObserver::changed(U32 mask)
+{
+	mLP->updateFilteredAccordions();
+}
 
 LLLandmarksPanel::LLLandmarksPanel()
 	:	LLPanelPlacesTab()
@@ -80,11 +101,16 @@ LLLandmarksPanel::LLLandmarksPanel()
 	,	mGearLandmarkMenu(NULL)
 	,	mDirtyFilter(false)
 {
+	mInventoryObserver = new LLLandmarksPanelObserver(this);
+	gInventory.addObserver(mInventoryObserver);
+
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml");
 }
 
 LLLandmarksPanel::~LLLandmarksPanel()
 {
+	if (gInventory.containsObserver(mInventoryObserver))
+		gInventory.removeObserver(mInventoryObserver);
 }
 
 BOOL LLLandmarksPanel::postBuild()
@@ -135,8 +161,14 @@ void LLLandmarksPanel::onSearchEdit(const std::string& string)
 		LLAccordionCtrlTab* tab = *iter;
 		tab->setVisible(true);
 
-		// expand accordion to see matched items in all ones. See EXT-2014.
+		// expand accordion to see matched items in each one. See EXT-2014.
 		tab->changeOpenClose(false);
+
+		// refresh all accordions to display their contents in case of less restrictive filter
+		LLInventorySubTreePanel* inventory_list = dynamic_cast<LLInventorySubTreePanel*>(tab->getAccordionView());
+		if (NULL == inventory_list) continue;
+		LLFolderView* fv = inventory_list->getRootFolder();
+		fv->refresh();
 	}
 }
 
@@ -148,20 +180,13 @@ void LLLandmarksPanel::onShowOnMap()
 		llwarns << "There are no selected list. No actions are performed." << llendl;
 		return;
 	}
-	LLLandmark* landmark = getCurSelectedLandmark();
-	if (!landmark)
-		return;
 
-	LLVector3d landmark_global_pos;
-	if (!landmark->getGlobalPos(landmark_global_pos))
-		return;
-	
-	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
-	if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
-	{
-		worldmap_instance->trackLocation(landmark_global_pos);
-		LLFloaterReg::showInstance("world_map", "center");
-	}
+	// Disable the "Map" button because loading landmark can take some time.
+	// During this time the button is useless. It will be enabled on callback finish
+	// or upon switching to other item.
+	mShowOnMapBtn->setEnabled(FALSE);
+
+	doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1));
 }
 
 // virtual
@@ -230,6 +255,31 @@ void LLLandmarksPanel::onSelectorButtonClicked()
 	}
 }
 
+void LLLandmarksPanel::updateFilteredAccordions()
+{
+	LLInventoryPanel* inventory_list = NULL;
+	LLAccordionCtrlTab* accordion_tab = NULL;
+	for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+	{
+		accordion_tab = *iter;
+		inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
+		if (NULL == inventory_list) continue;
+		LLFolderView* fv = inventory_list->getRootFolder();
+
+		bool has_descendants = fv->hasFilteredDescendants();
+
+		accordion_tab->setVisible(has_descendants);
+	}
+
+	// we have to arrange accordion tabs for cases when filter string is less restrictive but
+	// all items are still filtered.
+	static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
+	accordion->arrange();
+
+	// now filter state is applied to accordion tabs
+	mDirtyFilter = false;
+}
+
 //////////////////////////////////////////////////////////////////////////
 // PROTECTED METHODS
 //////////////////////////////////////////////////////////////////////////
@@ -256,15 +306,18 @@ bool LLLandmarksPanel::isReceivedFolderSelected() const
 
 	return false;
 }
-LLLandmark* LLLandmarksPanel::getCurSelectedLandmark() const
-{
 
+void LLLandmarksPanel::doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb)
+{
 	LLFolderViewItem* cur_item = getCurSelectedItem();
 	if(cur_item && cur_item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
 	{ 
-		return LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID());
+		LLLandmark* landmark = LLLandmarkActions::getLandmark(cur_item->getListener()->getUUID(), cb);
+		if (landmark)
+		{
+			cb(landmark);
+		}
 	}
-	return NULL;
 }
 
 LLFolderViewItem* LLLandmarksPanel::getCurSelectedItem() const 
@@ -294,45 +347,11 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
 	// We have to make request to sever to get parcel_id and snaption_id. 
 	if(isLandmarkSelected())
 	{
-		LLLandmark* landmark  =  getCurSelectedLandmark();
 		LLFolderViewItem* cur_item = getCurSelectedItem();
 		LLUUID id = cur_item->getListener()->getUUID();
-		LLInventoryItem* inv_item =  mCurrentSelectedList->getModel()->getItem(id);
-		if(landmark)
-		{
-			LLPanelPickEdit* panel_pick = LLPanelPickEdit::create();
-			LLVector3d landmark_global_pos;
-			landmark->getGlobalPos(landmark_global_pos);
-
-			// let's toggle pick panel into  panel places
-			LLPanel* panel_places =  LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places
-			panel_places->addChild(panel_pick);
-			LLRect paren_rect(panel_places->getRect());
-			panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE);
-			panel_pick->setRect(paren_rect);
-			panel_pick->onOpen(LLSD());
-
-			LLPickData data;
-			data.pos_global = landmark_global_pos;
-			data.name = cur_item->getName();
-			data.desc = inv_item->getDescription();
-			data.snapshot_id = parcel_data.snapshot_id;
-			data.parcel_id = parcel_data.parcel_id;
-			panel_pick->setPickData(&data);
-
-			LLSD params;
-			params["parcel_id"] =parcel_data.parcel_id;
-			/* set exit callback to get back onto panel places  
-			 in callback we will make cleaning up( delete pick_panel instance, 
-			 remove landmark panel from observer list
-			*/ 
-			panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
-					panel_pick, panel_places,params));
-			panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
-				panel_pick, panel_places,params));
-			panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
-							panel_pick, panel_places,params));
-		}
+		LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
+		doActionOnCurSelectedLandmark(boost::bind(
+				&LLLandmarksPanel::doProcessParcelInfo, this, _1, cur_item, inv_item, parcel_data));
 	}
 }
 
@@ -747,42 +766,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
 	}
 	else if ("create_pick" == command_name)
 	{
-		LLLandmark* landmark = getCurSelectedLandmark();
-		if(!landmark) return;
-		
-		LLViewerRegion* region = gAgent.getRegion();
-		if (!region) return;
-
-		LLGlobalVec pos_global;
-		LLUUID region_id;
-		landmark->getGlobalPos(pos_global);
-		landmark->getRegionID(region_id);
-		LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
-						  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
-						  (F32)pos_global.mdV[VZ]);
-
-		LLSD body;
-		std::string url = region->getCapability("RemoteParcelRequest");
-		if (!url.empty())
-		{
-			body["location"] = ll_sd_from_vector3(region_pos);
-			if (!region_id.isNull())
-			{
-				body["region_id"] = region_id;
-			}
-			if (!pos_global.isExactlyZero())
-			{
-				U64 region_handle = to_region_handle(pos_global);
-				body["region_handle"] = ll_sd_from_U64(region_handle);
-			}
-			LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
-		}
-		else 
-		{
-			llwarns << "Can't create pick for landmark for region" << region_id 
-					<< ". Region: "	<< region->getName() 
-					<< " does not support RemoteParcelRequest" << llendl; 
-		}
+		doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doCreatePick, this, _1));
 	}
 }
 
@@ -906,31 +890,97 @@ void LLLandmarksPanel::doIdle(void* landmarks_panel)
 
 }
 
-void LLLandmarksPanel::updateFilteredAccordions()
+void LLLandmarksPanel::doShowOnMap(LLLandmark* landmark)
 {
-	LLInventoryPanel* inventory_list = NULL;
-	LLAccordionCtrlTab* accordion_tab = NULL;
-	for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
-	{
-		accordion_tab = *iter;
-		inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
-		if (NULL == inventory_list) continue;
-		LLFolderView* fv = inventory_list->getRootFolder();
-
-		bool has_visible_children = fv->hasVisibleChildren();
+	LLVector3d landmark_global_pos;
+	if (!landmark->getGlobalPos(landmark_global_pos))
+		return;
 
-		accordion_tab->setVisible(has_visible_children);
+	LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+	if (!landmark_global_pos.isExactlyZero() && worldmap_instance)
+	{
+		worldmap_instance->trackLocation(landmark_global_pos);
+		LLFloaterReg::showInstance("world_map", "center");
 	}
 
-	// we have to arrange accordion tabs for cases when filter string is less restrictive but 
-	// all items are still filtered.
-	static LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
-	accordion->arrange();
+	mShowOnMapBtn->setEnabled(TRUE);
+}
 
-	// now filter state is applied to accordion tabs
-	mDirtyFilter = false;
+void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark,
+										   LLFolderViewItem* cur_item,
+										   LLInventoryItem* inv_item,
+										   const LLParcelData& parcel_data)
+{
+	LLPanelPickEdit* panel_pick = LLPanelPickEdit::create();
+	LLVector3d landmark_global_pos;
+	landmark->getGlobalPos(landmark_global_pos);
+
+	// let's toggle pick panel into  panel places
+	LLPanel* panel_places =  LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places
+	panel_places->addChild(panel_pick);
+	LLRect paren_rect(panel_places->getRect());
+	panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE);
+	panel_pick->setRect(paren_rect);
+	panel_pick->onOpen(LLSD());
+
+	LLPickData data;
+	data.pos_global = landmark_global_pos;
+	data.name = cur_item->getName();
+	data.desc = inv_item->getDescription();
+	data.snapshot_id = parcel_data.snapshot_id;
+	data.parcel_id = parcel_data.parcel_id;
+	panel_pick->setPickData(&data);
+
+	LLSD params;
+	params["parcel_id"] = parcel_data.parcel_id;
+	/* set exit callback to get back onto panel places
+	 in callback we will make cleaning up( delete pick_panel instance,
+	 remove landmark panel from observer list
+	*/
+	panel_pick->setExitCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+			panel_pick, panel_places,params));
+	panel_pick->setSaveCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+		panel_pick, panel_places,params));
+	panel_pick->setCancelCallback(boost::bind(&LLLandmarksPanel::onPickPanelExit,this,
+					panel_pick, panel_places,params));
 }
 
+void LLLandmarksPanel::doCreatePick(LLLandmark* landmark)
+{
+	LLViewerRegion* region = gAgent.getRegion();
+	if (!region) return;
+
+	LLGlobalVec pos_global;
+	LLUUID region_id;
+	landmark->getGlobalPos(pos_global);
+	landmark->getRegionID(region_id);
+	LLVector3 region_pos((F32)fmod(pos_global.mdV[VX], (F64)REGION_WIDTH_METERS),
+					  (F32)fmod(pos_global.mdV[VY], (F64)REGION_WIDTH_METERS),
+					  (F32)pos_global.mdV[VZ]);
+
+	LLSD body;
+	std::string url = region->getCapability("RemoteParcelRequest");
+	if (!url.empty())
+	{
+		body["location"] = ll_sd_from_vector3(region_pos);
+		if (!region_id.isNull())
+		{
+			body["region_id"] = region_id;
+		}
+		if (!pos_global.isExactlyZero())
+		{
+			U64 region_handle = to_region_handle(pos_global);
+			body["region_handle"] = ll_sd_from_U64(region_handle);
+		}
+		LLHTTPClient::post(url, body, new LLRemoteParcelRequestResponder(getObserverHandle()));
+	}
+	else
+	{
+		llwarns << "Can't create pick for landmark for region" << region_id
+				<< ". Region: "	<< region->getName()
+				<< " does not support RemoteParcelRequest" << llendl;
+	}
+}
 
 //////////////////////////////////////////////////////////////////////////
 // HELPER FUNCTIONS
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 097d79badf8825e5938c31c642cd68b21894d993..c65abc178b80cb8666b37652c9f9e4b4753e8644 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -37,6 +37,7 @@
 
 // newview
 #include "llinventorymodel.h"
+#include "lllandmarklist.h"
 #include "llpanelplacestab.h"
 #include "llpanelpick.h"
 #include "llremoteparcelrequest.h"
@@ -45,6 +46,7 @@ class LLAccordionCtrlTab;
 class LLFolderViewItem;
 class LLMenuGL;
 class LLInventoryPanel;
+class LLInventoryObserver;
 class LLInventorySubTreePanel;
 
 class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
@@ -61,14 +63,21 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 
 	void onSelectionChange(LLInventorySubTreePanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
 	void onSelectorButtonClicked();
-	
+
+	/**
+	 * Updates accordions according to filtered items in lists.
+	 *
+	 * It hides accordion for empty lists
+	 */
+	void updateFilteredAccordions();
+
 protected:
 	/**
 	 * @return true - if current selected panel is not null and selected item is a landmark
 	 */
 	bool isLandmarkSelected() const;
 	bool isReceivedFolderSelected() const;
-	LLLandmark* getCurSelectedLandmark() const;
+	void doActionOnCurSelectedLandmark(LLLandmarkList::loaded_callback_t cb);
 	LLFolderViewItem* getCurSelectedItem() const;
 	void updateSortOrder(LLInventoryPanel* panel, bool byDate);
 
@@ -121,11 +130,14 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	static void doIdle(void* landmarks_panel);
 
 	/**
-	 * Updates accordions according to filtered items in lists.
-	 *
-	 * It hides accordion for empty lists
+	 * Landmark actions callbacks. Fire when a landmark is loaded from the list.
 	 */
-	void updateFilteredAccordions();
+	void doShowOnMap(LLLandmark* landmark);
+	void doProcessParcelInfo(LLLandmark* landmark,
+							 LLFolderViewItem* cur_item,
+							 LLInventoryItem* inv_item,
+							 const LLParcelData& parcel_data);
+	void doCreatePick(LLLandmark* landmark);
 
 private:
 	LLInventorySubTreePanel*	mFavoritesInventoryPanel;
@@ -136,6 +148,7 @@ class LLLandmarksPanel : public LLPanelPlacesTab, LLRemoteParcelInfoObserver
 	LLMenuGL*					mGearFolderMenu;
 	LLMenuGL*					mMenuAdd;
 	LLInventorySubTreePanel*	mCurrentSelectedList;
+	LLInventoryObserver*		mInventoryObserver;
 
 	LLPanel*					mListCommands;
 	bool 						mSortByDate;
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index b1fbf789c692cca7e49137231e65baa6de63dffd..dbe0ec3b86e9c8f98719815afd5b42836f38468a 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1158,10 +1158,17 @@ void LLTaskLSLBridge::openItem()
 	{
 		return;
 	}
-	LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
-	if (preview && (object->permModify() || gAgent.isGodlike()))
+	if (object->permModify() || gAgent.isGodlike())
 	{
-		preview->setObjectID(mPanel->getTaskUUID());
+		LLLiveLSLEditor* preview = LLFloaterReg::showTypedInstance<LLLiveLSLEditor>("preview_scriptedit", LLSD(mUUID), TAKE_FOCUS_YES);
+		if (preview)
+		{
+			preview->setObjectID(mPanel->getTaskUUID());
+		}
+	}
+	else
+	{	
+		LLNotifications::instance().add("CannotOpenScriptObjectNoMod");
 	}
 }
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index c33277601081729ac45b46eb5f7b36750b92c4e1..5a1b2f30661742f2eb007080800db74ec882b356 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -536,8 +536,15 @@ BOOL LLPanelPeople::postBuild()
 	mNearbyList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mNearbyList));
 	mRecentList->setCommitCallback(boost::bind(&LLPanelPeople::onAvatarListCommitted, this, mRecentList));
 
+	// Set openning IM as default on return action for avatar lists
+	mOnlineFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+	mAllFriendList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+	mNearbyList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+	mRecentList->setReturnCallback(boost::bind(&LLPanelPeople::onImButtonClicked, this));
+
 	mGroupList->setDoubleClickCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
 	mGroupList->setCommitCallback(boost::bind(&LLPanelPeople::updateButtons, this));
+	mGroupList->setReturnCallback(boost::bind(&LLPanelPeople::onChatButtonClicked, this));
 
 	LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
 	accordion_tab->setDropDownStateChangedCallback(
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 0dc010e2e746009e2ecc6baeb5b38952eb5898d0..d8e0d91d885dc05f20d1d8723202ac10c549ddad 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -66,6 +66,65 @@
 #include "roles_constants.h"
 #include "llgroupactions.h"
 
+
+U8 string_value_to_click_action(std::string p_value);
+std::string click_action_to_string_value( U8 action);
+
+U8 string_value_to_click_action(std::string p_value)
+{
+	if(p_value == "Touch")
+	{
+		return CLICK_ACTION_TOUCH;
+	}
+	if(p_value == "Sit")
+	{
+		return CLICK_ACTION_SIT;
+	}
+	if(p_value == "Buy")
+	{
+		return CLICK_ACTION_BUY;
+	}
+	if(p_value == "Pay")
+	{
+		return CLICK_ACTION_PAY;
+	}
+	if(p_value == "Open")
+	{
+		return CLICK_ACTION_OPEN;
+	}
+	if(p_value == "Zoom")
+	{
+		return CLICK_ACTION_ZOOM;
+	}
+	return CLICK_ACTION_TOUCH;
+}
+
+std::string click_action_to_string_value( U8 action)
+{
+	switch (action) 
+	{
+		case CLICK_ACTION_TOUCH:
+		default:	
+			return "Touch";
+			break;
+		case CLICK_ACTION_SIT:
+			return "Sit";
+			break;
+		case CLICK_ACTION_BUY:
+			return "Buy";
+			break;
+		case CLICK_ACTION_PAY:
+			return "Pay";
+			break;
+		case CLICK_ACTION_OPEN:
+			return "Open";
+			break;
+		case CLICK_ACTION_ZOOM:
+			return "Zoom";
+			break;
+	}
+}
+
 ///----------------------------------------------------------------------------
 /// Class llpanelpermissions
 ///----------------------------------------------------------------------------
@@ -774,7 +833,8 @@ void LLPanelPermissions::refresh()
 		LLComboBox*	ComboClickAction = getChild<LLComboBox>("clickaction");
 		if(ComboClickAction)
 		{
-			ComboClickAction->setCurrentByIndex((S32)click_action);
+			std::string combo_value = click_action_to_string_value(click_action);
+			ComboClickAction->setValue(LLSD(combo_value));
 		}
 	}
 	childSetEnabled("label click action",is_perm_modify && all_volume);
@@ -1015,8 +1075,9 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 {
 	LLComboBox* box = (LLComboBox*)ctrl;
 	if (!box) return;
-
-	U8 click_action = (U8)box->getCurrentIndex();
+	std::string value = box->getValue().asString();
+	U8 click_action = string_value_to_click_action(value);
+	
 	if (click_action == CLICK_ACTION_BUY)
 	{
 		LLSaleInfo sale_info;
@@ -1028,8 +1089,8 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 			// Set click action back to its old value
 			U8 click_action = 0;
 			LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
-			box->setCurrentByIndex((S32)click_action);
-
+			std::string item_value = click_action_to_string_value(click_action);
+			box->setValue(LLSD(item_value));
 			return;
 		}
 	}
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 12ad070efd54abea3dc0ac4618258fd37d0dedeb..529912929d6274699058686226d411b07c0d4a8e 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -54,6 +54,7 @@
 #include "llpanelprimmediacontrols.h"
 #include "llpluginclassmedia.h"
 #include "llprogressbar.h"
+#include "llstring.h"
 #include "llviewercontrol.h"
 #include "llviewerparcelmgr.h"
 #include "llviewermedia.h"
@@ -92,6 +93,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mCommitCallbackRegistrar.add("MediaCtrl.Forward",	boost::bind(&LLPanelPrimMediaControls::onClickForward, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Home",		boost::bind(&LLPanelPrimMediaControls::onClickHome, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Stop",		boost::bind(&LLPanelPrimMediaControls::onClickStop, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.MediaStop",		boost::bind(&LLPanelPrimMediaControls::onClickMediaStop, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Reload",	boost::bind(&LLPanelPrimMediaControls::onClickReload, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Play",		boost::bind(&LLPanelPrimMediaControls::onClickPlay, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Pause",		boost::bind(&LLPanelPrimMediaControls::onClickPause, this));
@@ -102,6 +104,8 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeUp",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeUp, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.CommitVolumeDown",	boost::bind(&LLPanelPrimMediaControls::onCommitVolumeDown, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute",		boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.SkipBack",		boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
+	mCommitCallbackRegistrar.add("MediaCtrl.SkipForward",	boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
 	
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml");
 	mInactivityTimer.reset();
@@ -135,6 +139,8 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	mMediaAddress			= getChild<LLUICtrl>("media_address_url");
 	mMediaPlaySliderPanel	= getChild<LLUICtrl>("media_play_position");
 	mMediaPlaySliderCtrl	= getChild<LLUICtrl>("media_play_slider");
+	mSkipFwdCtrl			= getChild<LLUICtrl>("skip_forward");
+	mSkipBackCtrl			= getChild<LLUICtrl>("skip_back");
 	mVolumeCtrl				= getChild<LLUICtrl>("media_volume");
 	mVolumeBtn				= getChild<LLButton>("media_volume_button");
 	mVolumeUpCtrl			= getChild<LLUICtrl>("volume_up");
@@ -145,6 +151,7 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	mLeftBookend			= getChild<LLUICtrl>("left_bookend");
 	mRightBookend			= getChild<LLUICtrl>("right_bookend");
 	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));
+	LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
 
 	// These are currently removed...but getChild creates a "dummy" widget.
 	// This class handles them missing.
@@ -329,12 +336,17 @@ void LLPanelPrimMediaControls::updateShape()
 			mReloadCtrl->setVisible(FALSE);
 			mMediaStopCtrl->setVisible(has_focus);
 			mHomeCtrl->setVisible(FALSE);
-			mBackCtrl->setEnabled(has_focus);
-			mFwdCtrl->setEnabled(has_focus);
+			// No nav controls
+			mBackCtrl->setVisible(FALSE);
+			mFwdCtrl->setEnabled(FALSE);
 			mMediaAddressCtrl->setVisible(false);
 			mMediaAddressCtrl->setEnabled(false);
 			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
 			mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
+			mSkipFwdCtrl->setVisible(has_focus && !mini_controls);
+			mSkipFwdCtrl->setEnabled(has_focus && !mini_controls);
+			mSkipBackCtrl->setVisible(has_focus && !mini_controls);
+			mSkipBackCtrl->setEnabled(has_focus && !mini_controls);
 				
 			mVolumeCtrl->setVisible(has_focus);
 			mVolumeUpCtrl->setVisible(has_focus);
@@ -435,6 +447,10 @@ void LLPanelPrimMediaControls::updateShape()
 			mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
 			mMediaPlaySliderPanel->setVisible(FALSE);
 			mMediaPlaySliderPanel->setEnabled(FALSE);
+			mSkipFwdCtrl->setVisible(FALSE);
+			mSkipFwdCtrl->setEnabled(FALSE);
+			mSkipBackCtrl->setVisible(FALSE);
+			mSkipBackCtrl->setEnabled(FALSE);
 				
 			mVolumeCtrl->setVisible(FALSE);
 			mVolumeUpCtrl->setVisible(FALSE);
@@ -766,8 +782,8 @@ void LLPanelPrimMediaControls::onClickClose()
 
 void LLPanelPrimMediaControls::close()
 {
+	resetZoomLevel(true);
 	LLViewerMediaFocus::getInstance()->clearFocus();
-	resetZoomLevel();
 	setVisible(FALSE);
 }
 
@@ -789,7 +805,7 @@ void LLPanelPrimMediaControls::onClickForward()
 	focusOnTarget();
 
 	LLViewerMediaImpl* impl = getTargetMediaImpl();
-	
+
 	if (impl)
 	{
 		impl->navigateForward();
@@ -860,18 +876,58 @@ void LLPanelPrimMediaControls::onClickStop()
 
 	LLViewerMediaImpl* impl = getTargetMediaImpl();
 
+	if(impl)
+	{
+		impl->navigateStop();
+	}
+}
+
+void LLPanelPrimMediaControls::onClickMediaStop()
+{
+	focusOnTarget();
+
+	LLViewerMediaImpl* impl = getTargetMediaImpl();
+
 	if(impl)
 	{
 		impl->stop();
 	}
 }
 
-void LLPanelPrimMediaControls::onClickZoom()
+void LLPanelPrimMediaControls::onClickSkipBack()
 {
 	focusOnTarget();
 
-	nextZoomLevel();
+	LLViewerMediaImpl* impl =getTargetMediaImpl();
+	
+	if (impl)
+	{
+		impl->skipBack(mSkipStep);
+	}
 }
+
+void LLPanelPrimMediaControls::onClickSkipForward()
+{
+	focusOnTarget();
+
+	LLViewerMediaImpl* impl = getTargetMediaImpl();
+
+	if (impl)
+	{
+		impl->skipForward(mSkipStep);
+	}
+}
+
+void LLPanelPrimMediaControls::onClickZoom()
+{
+	focusOnTarget();
+	
+	if(mCurrentZoom == ZOOM_NONE)
+	{
+		nextZoomLevel();
+	}
+}
+
 void LLPanelPrimMediaControls::nextZoomLevel()
 {
 	int index = 0;
@@ -888,12 +944,15 @@ void LLPanelPrimMediaControls::nextZoomLevel()
 	updateZoom();
 }
 
-void LLPanelPrimMediaControls::resetZoomLevel()
+void LLPanelPrimMediaControls::resetZoomLevel(bool reset_camera)
 {
 	if(mCurrentZoom != ZOOM_NONE)
 	{
 		mCurrentZoom = ZOOM_NONE;
-		updateZoom();
+		if(reset_camera)
+		{
+			updateZoom();
+		}
 	}
 }
 
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 124fa9cce487046ab659d989beccfe5e2a119641..accfb72a0494c5eb45b4875748c2bbd40c4b41e4 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -58,7 +58,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	void updateShape();
 	bool isMouseOver();
 	void nextZoomLevel();
-	void resetZoomLevel();
+	void resetZoomLevel(bool reset_camera = true);
 	void close();
 
 	LLHandle<LLPanelPrimMediaControls>	getHandle() const { return mPanelHandle; }
@@ -95,6 +95,9 @@ class LLPanelPrimMediaControls : public LLPanel
 	void onClickPause();
 	void onClickStop();
 	void onClickZoom();
+	void onClickSkipBack();
+	void onClickSkipForward();
+	void onClickMediaStop();
 	void onCommitURL();
 	
 	void updateZoom();
@@ -137,6 +140,8 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLUICtrl *mHomeCtrl;
 	LLUICtrl *mUnzoomCtrl;
 	LLUICtrl *mOpenCtrl;
+	LLUICtrl *mSkipBackCtrl;
+	LLUICtrl *mSkipFwdCtrl;
 	LLUICtrl *mZoomCtrl;
 	LLPanel  *mMediaProgressPanel;
 	LLProgressBar *mMediaProgressBar;
@@ -154,6 +159,7 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLUICtrl *mLeftBookend;
 	LLUICtrl *mRightBookend;
 	LLUIImage* mBackgroundImage;
+	F32 mSkipStep;
 	
 	LLUICtrl *mMediaPanelScroll;
 	LLButton *mScrollUpCtrl;
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 13bd059d45eeb4adc6db5f1321e1d872a2dd9973..4ee9cba69cae03fe203bf7bf3fc70014baaf8081 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -65,6 +65,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
 	mAvatarList->setDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 	mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
+    // Set onAvatarListDoubleClicked as default on_return action.
+	mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 
 	mParticipantListMenu = new LLParticipantListMenu(*this);
 	mAvatarList->setContextMenu(mParticipantListMenu);
@@ -99,6 +101,7 @@ void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
 
 void LLParticipantList::onAvatarListDoubleClicked(LLAvatarList* list)
 {
+	// NOTE(EM): Should we check if there is multiple selection and start conference if it is so?
 	LLUUID clicked_id = list->getSelectedUUID();
 
 	if (clicked_id.isNull() || clicked_id == gAgent.getID())
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index d1cf4a081033463e1797313fbd7e46a1c3513672..fb9db42cf6e469a2d886aa69c498d1de864e57fa 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -46,6 +46,7 @@
 #include "lldockablefloater.h"
 #include "llsyswellwindow.h"
 #include "llimfloater.h"
+#include "llscriptfloater.h"
 
 #include <algorithm>
 
@@ -533,19 +534,7 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
 
 	LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
 
-	std::string mStartUpFormatString;
-
-	if(notif_num == 1)
-	{
-		mStartUpFormatString = LLTrans::getString("StartUpNotification");
-	}
-	else
-	{
-		mStartUpFormatString = LLTrans::getString("StartUpNotifications");
-	}
-	
-
-	std::string	text = llformat(mStartUpFormatString.c_str(), notif_num);
+	std::string	text = LLTrans::getString("StartUpNotifications");
 
 	toast_rect = mStartUpToastPanel->getRect();
 	mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
@@ -698,7 +687,8 @@ void LLScreenChannel::updateShowToastsState()
 	}
 
 	// for IM floaters showed in a docked state - prohibit showing of ani toast
-	if(dynamic_cast<LLIMFloater*>(floater))
+	if(dynamic_cast<LLIMFloater*>(floater)
+		|| dynamic_cast<LLScriptFloater*>(floater) )
 	{
 		setShowToasts(!(floater->getVisible() && floater->isDocked()));
 		if (!getShowToasts())
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bdea6ff45944cafea6f4a40c786b4c8b9cdb91f0
--- /dev/null
+++ b/indra/newview/llscriptfloater.cpp
@@ -0,0 +1,335 @@
+/** 
+ * @file llscriptfloater.cpp
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llscriptfloater.h"
+
+#include "llbottomtray.h"
+#include "llchannelmanager.h"
+#include "llchiclet.h"
+#include "llfloaterreg.h"
+#include "llscreenchannel.h"
+#include "lltoastnotifypanel.h"
+#include "llviewerwindow.h"
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLUUID notification_id_to_object_id(const LLUUID& notification_id)
+{
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+	if(notification)
+	{
+		return notification->getPayload()["object_id"].asUUID();
+	}
+	return LLUUID::null;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLScriptFloater::LLScriptFloater(const LLSD& key)
+: LLTransientDockableFloater(NULL, true, key)
+, mScriptForm(NULL)
+, mObjectId(key.asUUID())
+{
+}
+
+bool LLScriptFloater::toggle(const LLUUID& object_id)
+{
+	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+
+	// show existing floater
+	if(floater)
+	{
+		if(floater->getVisible())
+		{
+			floater->setVisible(false);
+			return false;
+		}
+		else
+		{
+			floater->setVisible(TRUE);
+			floater->setFocus(TRUE);
+			return true;
+		}
+	}
+	// create and show new floater
+	else
+	{
+		show(object_id);
+		return true;
+	}
+}
+
+LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
+{
+	LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", object_id);
+	floater->createForm(object_id);
+
+	if (floater->getDockControl() == NULL)
+	{
+		LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id);
+		if (chiclet == NULL)
+		{
+			llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
+		}
+		else
+		{
+			LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+		}
+
+		floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
+			LLDockControl::TOP,  boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+	}
+
+	return floater;
+}
+
+void LLScriptFloater::getAllowedRect(LLRect& rect)
+{
+	rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLScriptFloater::createForm(const LLUUID& object_id)
+{
+	// delete old form
+	if(mScriptForm)
+	{
+		removeChild(mScriptForm);
+		mScriptForm->die();
+	}
+
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(
+		LLScriptFloaterManager::getInstance()->findNotificationId(object_id));
+	if(NULL == notification)
+	{
+		return;
+	}
+
+	// create new form
+	mScriptForm = new LLToastNotifyPanel(notification);
+	addChild(mScriptForm);
+
+	// position form on floater
+	mScriptForm->setOrigin(0, 0);
+
+	// make floater size fit form size
+	LLRect toast_rect = getRect();
+	LLRect panel_rect = mScriptForm->getRect();
+	toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
+	setShape(toast_rect);
+}
+
+void LLScriptFloater::onClose(bool app_quitting)
+{
+	LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+}
+
+void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
+{
+	LLTransientDockableFloater::setDocked(docked, pop_on_undock);
+
+	hideToastsIfNeeded();
+}
+
+void LLScriptFloater::setVisible(BOOL visible)
+{
+	LLTransientDockableFloater::setVisible(visible);
+
+	hideToastsIfNeeded();
+}
+
+void LLScriptFloater::hideToastsIfNeeded()
+{
+	using namespace LLNotificationsUI;
+
+	// find channel
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+	// update notification channel state
+	if(channel)
+	{
+		channel->updateShowToastsState();
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
+{
+	// get scripted Object's ID
+	LLUUID object_id = notification_id_to_object_id(notification_id);
+	if(object_id.isNull())
+	{
+		llwarns << "Invalid notification, no object id" << llendl;
+		return;
+	}
+
+	// If an Object spawns more-than-one floater, only the newest one is shown. 
+	// The previous is automatically closed.
+	script_notification_map_t::iterator it = mNotifications.find(object_id);
+	if(it != mNotifications.end())
+	{
+		onRemoveNotification(notification_id);
+	}
+
+	LLNotificationData nd = {notification_id};
+	mNotifications.insert(std::make_pair(object_id, nd));
+
+	LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+}
+
+void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
+{
+	LLUUID object_id = notification_id_to_object_id(notification_id);
+	if(object_id.isNull())
+	{
+		llwarns << "Invalid notification, no object id" << llendl;
+		return;
+	}
+
+	using namespace LLNotificationsUI;
+
+	// remove related toast
+	LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
+		(LLChannelManager::getInstance()->findChannelByID(channel_id));
+	if(channel)
+	{
+		channel->killToastByNotificationID(findNotificationToastId(object_id));
+	}
+
+	mNotifications.erase(object_id);
+
+	// remove related chiclet
+	LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+
+	// close floater
+	LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", object_id);
+	if(floater)
+	{
+		floater->closeFloater();
+	}
+}
+
+void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
+{
+	// Check we have not removed notification yet
+	LLNotificationPtr notification = LLNotifications::getInstance()->find(
+		findNotificationId(object_id));
+	if(notification)
+	{
+		onRemoveNotification(notification->getID());
+	}
+}
+
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id)
+{
+	// hide "new message" icon from chiclet
+	LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
+	if(chiclet)
+	{
+		chiclet->setShowNewMessagesIcon(false);
+	}
+
+	// kill toast
+	using namespace LLNotificationsUI;
+	LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
+		LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+	if(channel)
+	{
+		channel->killToastByNotificationID(findNotificationToastId(object_id));
+	}
+
+	// toggle floater
+	LLScriptFloater::toggle(object_id);
+}
+
+void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id)
+{
+	script_notification_map_t::iterator it = mNotifications.find(object_id);
+	if(mNotifications.end() != it)
+	{
+		it->second.toast_notification_id = notification_id;
+	}
+}
+
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
+{
+	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
+	if(mNotifications.end() != it)
+	{
+		return it->second.notification_id;
+	}
+	return LLUUID::null;
+}
+
+LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id)
+{
+	script_notification_map_t::const_iterator it = mNotifications.find(object_id);
+	if(mNotifications.end() != it)
+	{
+		return it->second.toast_notification_id;
+	}
+	return LLUUID::null;
+}
+
+//static
+void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const LLSD&response)
+{
+	S32 option = LLNotification::getSelectedOption(notification, response);
+	LLUUID object_id = notification["payload"]["object_id"].asUUID();
+
+	switch(option)
+	{
+	case 0: // "Open"
+		LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
+		break;
+	case 1: // "Ignore"
+		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+		break;
+	case 2: // "Block"
+		LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
+		LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+		break;
+	default:
+		llwarns << "Unexpected value" << llendl;
+		break;
+	}
+}
+
+// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
new file mode 100644
index 0000000000000000000000000000000000000000..0e1a7f36b72fdf8724053d4d6fe70c61f50a5619
--- /dev/null
+++ b/indra/newview/llscriptfloater.h
@@ -0,0 +1,164 @@
+/** 
+ * @file llscriptfloater.h
+ * @brief LLScriptFloater class definition
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_SCRIPTFLOATER_H
+#define LL_SCRIPTFLOATER_H
+
+#include "lltransientdockablefloater.h"
+
+class LLToastNotifyPanel;
+
+/**
+ * Handles script notifications ("ScriptDialog" and "ScriptDialogGroup")
+ * and manages Script Floaters.
+ */
+class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
+{
+public:
+
+	/**
+	 * Handles new notifications.
+	 * Saves notification and object ids, removes old notification if needed, creates script chiclet
+	 * Note that one object can spawn one script floater.
+	 */
+	void onAddNotification(const LLUUID& notification_id);
+
+	/**
+	 * Handles notification removal.
+	 * Removes script notification toast, removes script chiclet, closes script floater
+	 */
+	void onRemoveNotification(const LLUUID& notification_id);
+
+	/**
+	 * Wrapper for onRemoveNotification, removes notification by object id.
+	 */
+	void removeNotificationByObjectId(const LLUUID& object_id);
+
+	/**
+	 * Toggles script floater.
+	 * Removes "new message" icon from chiclet and removes notification toast.
+	 */
+	void toggleScriptFloater(const LLUUID& object_id);
+
+	LLUUID findNotificationId(const LLUUID& object_id);
+
+	LLUUID findNotificationToastId(const LLUUID& object_id);
+
+	/**
+	 * Associate notification toast id with object id.
+	 */
+	void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id);
+
+	/**
+	* Callback for notification toast buttons.
+	*/
+	static void onToastButtonClick(const LLSD&notification, const LLSD&response);
+
+private:
+
+	struct LLNotificationData
+	{
+		LLUUID notification_id;
+		LLUUID toast_notification_id;
+	};
+
+	// <object_id, notification_data>
+	typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
+
+	script_notification_map_t mNotifications;
+};
+
+/**
+ * Floater script forms.
+ * LLScriptFloater will create script form based on notification data and 
+ * will auto fit the form.
+ */
+class LLScriptFloater : public LLTransientDockableFloater
+{
+public:
+
+	/**
+	 * key - UUID of scripted Object
+	 */
+	LLScriptFloater(const LLSD& key);
+
+	virtual ~LLScriptFloater(){};
+
+	/**
+	 * Toggle existing floater or create and show a new one.
+	 */
+	static bool toggle(const LLUUID& object_id);
+
+	/**
+	 * Creates and shows floater
+	 */
+	static LLScriptFloater* show(const LLUUID& object_id);
+
+	const LLUUID& getObjectId() { return mObjectId; }
+
+	/**
+	 * Close notification if script floater is closed.
+	 */
+	/*virtual*/ void onClose(bool app_quitting);
+
+	/**
+	 * Hide all notification toasts when we show dockable floater
+	 */
+	/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
+
+	/**
+	 * Hide all notification toasts when we show dockable floater
+	 */
+	/*virtual*/ void setVisible(BOOL visible);
+
+protected:
+
+	/**
+	 * Creates script form, will delete old form if floater is shown for same object.
+	 */
+	void createForm(const LLUUID& object_id);
+
+	/*virtual*/ void getAllowedRect(LLRect& rect);
+
+	/**
+	 * Hide all notification toasts.
+	 */
+	static void hideToastsIfNeeded();
+
+	void setObjectId(const LLUUID& id) { mObjectId = id; }
+
+private:
+	LLToastNotifyPanel* mScriptForm;
+	LLUUID mObjectId;
+};
+
+#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 28c06b41e0c5beb5d54ac5eead88e06d81331d53..8007e0fcec0fe538245c7ec28fbbc30e343c5a77 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -34,9 +34,12 @@
 
 #include "llagent.h"
 #include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventorypanel.h"
 #include "llfiltereditor.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
+#include "llfoldervieweventlistener.h"
 #include "llpaneleditwearable.h"
 #include "llpaneloutfitsinventory.h"
 #include "lltextbox.h"
@@ -68,7 +71,7 @@ LLSidepanelAppearance::LLSidepanelAppearance() :
 	mFilterSubString(LLStringUtil::null),
 	mFilterEditor(NULL),
 	mLookInfo(NULL),
-	mCurrLookPanel(NULL)
+	mCurrOutfitPanel(NULL)
 {
 	//LLUICtrlFactory::getInstance()->buildPanel(this, "panel_appearance.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder()
 	mFetchWorn = new LLCurrentlyWornFetchObserver(this);
@@ -81,6 +84,9 @@ LLSidepanelAppearance::~LLSidepanelAppearance()
 // virtual
 BOOL LLSidepanelAppearance::postBuild()
 {
+	mOpenOutfitBtn = getChild<LLButton>("openoutfit_btn");
+	mOpenOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onOpenOutfitButtonClicked, this));
+
 	mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
 	mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
 
@@ -90,11 +96,9 @@ BOOL LLSidepanelAppearance::postBuild()
 	mEditBtn = getChild<LLButton>("edit_btn");
 	mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
 
-	mNewLookBtn = getChild<LLButton>("newlook_btn");
-	mNewLookBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
-	mNewLookBtn->setEnabled(false);
-
-	mOverflowBtn = getChild<LLButton>("overflow_btn");
+	mNewOutfitBtn = getChild<LLButton>("newlook_btn");
+	mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
+	mNewOutfitBtn->setEnabled(false);
 
 	mFilterEditor = getChild<LLFilterEditor>("Filter");
 	if (mFilterEditor)
@@ -114,8 +118,6 @@ BOOL LLSidepanelAppearance::postBuild()
 			back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
 		}
 
-		// *TODO: Assign the action to an appropriate event.
-		// mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::toggleMediaPanel, this));
 	}
 
 	mEditWearable = dynamic_cast<LLPanelEditWearable*>(getChild<LLPanel>("panel_edit_wearable"));
@@ -130,7 +132,7 @@ BOOL LLSidepanelAppearance::postBuild()
 
 	mCurrentLookName = getChild<LLTextBox>("currentlook_name");
 	
-	mCurrLookPanel = getChild<LLPanel>("panel_currentlook");
+	mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
 
 	return TRUE;
 }
@@ -180,6 +182,27 @@ void LLSidepanelAppearance::onWearButtonClicked()
 	}
 }
 
+void LLSidepanelAppearance::onOpenOutfitButtonClicked()
+{
+	const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
+	if (!outfit_link)
+		return;
+	if (!outfit_link->getIsLinkType())
+		return;
+	LLInventoryPanel *inventory_panel = mPanelOutfitsInventory->getActivePanel();
+	if (inventory_panel)
+	{
+		LLFolderView *folder = inventory_panel->getRootFolder();
+		LLFolderViewItem *outfit_folder = folder->getItemByID(outfit_link->getLinkedUUID());
+		if (outfit_folder)
+		{
+			outfit_folder->setOpen(!outfit_folder->isOpen());
+			folder->setSelectionFromRoot(outfit_folder,TRUE);
+			folder->scrollToShowSelection();
+		}
+	}
+}
+
 void LLSidepanelAppearance::onEditAppearanceButtonClicked()
 {
 	if (gAgentWearables.areWearablesLoaded())
@@ -232,9 +255,8 @@ void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
 	mFilterEditor->setVisible(!visible);
 	mWearBtn->setVisible(!visible);
 	mEditBtn->setVisible(!visible);
-	mNewLookBtn->setVisible(!visible);
-	mOverflowBtn->setVisible(!visible);
-	mCurrLookPanel->setVisible(!visible);
+	mNewOutfitBtn->setVisible(!visible);
+	mCurrOutfitPanel->setVisible(!visible);
 }
 
 void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
@@ -256,7 +278,6 @@ void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *we
 void LLSidepanelAppearance::updateVerbs()
 {
 	bool is_look_info_visible = mLookInfo->getVisible();
-	mOverflowBtn->setEnabled(false);
 
 	if (!is_look_info_visible)
 	{
@@ -275,35 +296,24 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string name)
 {
 	if (name == "")
 	{
-		const LLUUID current_outfit_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-		LLInventoryModel::cat_array_t cat_array;
-		LLInventoryModel::item_array_t item_array;
-		// Can't search on AT_OUTFIT since links to categories return AT_CATEGORY for type since they don't
-		// return preferred type.
-		LLIsType is_category( LLAssetType::AT_CATEGORY ); 
-		gInventory.collectDescendentsIf(current_outfit_cat,
-										cat_array,
-										item_array,
-										false,
-										is_category,
-										false);
-		for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
-			 iter != item_array.end();
-			 iter++)
+		const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
+		if (outfit_link)
 		{
-			const LLViewerInventoryItem *item = (*iter);
-			const LLViewerInventoryCategory *cat = item->getLinkedCategory();
+			const LLViewerInventoryCategory *cat = outfit_link->getLinkedCategory();
 			if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
 			{
 				mCurrentLookName->setText(cat->getName());
 				return;
 			}
 		}
-		mCurrentLookName->setText(std::string(""));
+		mCurrentLookName->setText(getString("No Outfit"));
+		mOpenOutfitBtn->setEnabled(FALSE);
 	}
 	else
 	{
 		mCurrentLookName->setText(name);
+		// Can't just call update verbs since the folder link may not have been created yet.
+		mOpenOutfitBtn->setEnabled(TRUE);
 	}
 }
 
@@ -320,7 +330,7 @@ void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
 void LLSidepanelAppearance::fetchInventory()
 {
 
-	mNewLookBtn->setEnabled(false);
+	mNewOutfitBtn->setEnabled(false);
 	LLInventoryFetchObserver::item_ref_t ids;
 	LLUUID item_id;
 	for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type)
@@ -369,5 +379,5 @@ void LLSidepanelAppearance::fetchInventory()
 
 void LLSidepanelAppearance::inventoryFetched()
 {
-	mNewLookBtn->setEnabled(true);
+	mNewOutfitBtn->setEnabled(true);
 }
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 496a1fef7281ee281305d4ab3156930476cf1b72..b335fd910d9e2a9bc50b28bd3b61b4b2aa055fc2 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -64,6 +64,7 @@ class LLSidepanelAppearance : public LLPanel
 private:
 	void onFilterEdit(const std::string& search_string);
 
+	void onOpenOutfitButtonClicked();
 	void onEditAppearanceButtonClicked();
 	void onWearButtonClicked();
 	void onEditButtonClicked();
@@ -78,12 +79,12 @@ class LLSidepanelAppearance : public LLPanel
 	LLPanelLookInfo*		mLookInfo;
 	LLPanelEditWearable*	mEditWearable;
 
+	LLButton*					mOpenOutfitBtn;
 	LLButton*					mEditAppearanceBtn;
 	LLButton*					mWearBtn;
 	LLButton*					mEditBtn;
-	LLButton*					mNewLookBtn;
-	LLButton*					mOverflowBtn;
-	LLPanel*					mCurrLookPanel;
+	LLButton*					mNewOutfitBtn;
+	LLPanel*					mCurrOutfitPanel;
 
 	LLTextBox*					mCurrentLookName;
 
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 51d53b267406beefb09b4721b7b7fa18779b0ab5..54f776ca6a7fa5253e228375a5a189b59cf282bd 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -143,6 +143,27 @@ void LLSpeakButton::setShowToolTip(const std::string& msg)
 	mShowBtn->setToolTip(msg);
 }
 
+void LLSpeakButton::setLabelVisible(bool visible)
+{
+	static std::string label_selected = mSpeakBtn->getLabelSelected();
+	static std::string label_unselected = mSpeakBtn->getLabelUnselected();
+
+	if (visible)
+	{
+		mSpeakBtn->setLabelSelected(label_selected);
+		mSpeakBtn->setLabelUnselected(label_unselected);
+	}
+	else
+	{
+		static LLStringExplicit empty_string("");
+		mSpeakBtn->setLabelSelected(empty_string);
+		mSpeakBtn->setLabelUnselected(empty_string);
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PROTECTED SECTION
+//////////////////////////////////////////////////////////////////////////
 void LLSpeakButton::onMouseDown_SpeakBtn()
 {
 	bool down = true;
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index 02c8ab38909031b48f48b721f6a38bc326e0bf45..424ee5357a440f7dc6f28897bae4a491099bdde7 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -67,6 +67,18 @@ class LLSpeakButton : public LLUICtrl
 	void setSpeakToolTip(const std::string& msg);
 	void setShowToolTip(const std::string& msg);
 
+	/**
+	 * Sets visibility of speak button's label according to passed parameter.
+	 *
+	 * It removes label/selected label if "visible" is false and restores otherwise.
+	 *
+	 * @param visible if true - show label and selected label.
+	 * 
+	 * @see mSpeakBtn
+	 * @see LLBottomTray::processShrinkButtons()
+	 */
+	void setLabelVisible(bool visible);
+
 protected:
 	friend class LLUICtrlFactory;
 	LLSpeakButton(const Params& p);
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 6f3dabe5a73a1e3656af33838ec7753402d62cfd..9bb2a4ad0a9c0d035e0936c1833f9d2b92b0b3a3 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -931,6 +931,14 @@ bool LLTextureFetchWorker::doWork(S32 param)
 	
 	if (mState == DECODE_IMAGE)
 	{
+		if (mDesiredDiscard < 0)
+		{
+			// We aborted, don't decode
+			mState = DONE;
+			setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+			return true;
+		}
+		
 		if (mFormattedImage->getDataSize() <= 0)
 		{
 			llerrs << "Decode entered with invalid mFormattedImage. ID = " << mID << llendl;
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index beb31bc83342f9b6f62ea94d052cbf5560c0cba4..a4f5164a8dd749db733d9462db9a647b600376e6 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -53,6 +53,7 @@
 #include "lluictrlfactory.h"
 #include "llnotifications.h"
 #include "llfunctorregistry.h"
+#include "llrootview.h"
 
 const S32 MAX_ALLOWED_MSG_WIDTH = 400;
 const F32 DEFAULT_BUTTON_DELAY = 0.5f;
@@ -220,16 +221,13 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 	static LLUIColor alert_text_color = LLUIColorTable::instance().getColor("AlertTextColor");
 	if (mCaution)
 	{
-		LLIconCtrl::Params params;
-		params.name("icon");
-		params.rect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32));
-		params.mouse_opaque(false);
-		params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
-		params.tab_stop(false);
-		LLIconCtrl * icon = LLUICtrlFactory::create<LLIconCtrl> (params);
-		icon->setValue ("notify_caution_icon.tga");
-		icon->setMouseOpaque(FALSE);
-		LLToastPanel::addChild(icon);
+		LLIconCtrl* icon = LLUICtrlFactory::getInstance()->createFromFile<LLIconCtrl>("alert_icon.xml", this, LLPanel::child_registry_t::instance());
+		if(icon)
+		{
+			icon->setRect(LLRect(msg_x, msg_y, msg_x+32, msg_y-32));
+			LLToastPanel::addChild(icon);
+		}
+		
 		msg_x += 32 + HPAD;
 		msg_box->setColor( alert_caution_text_color );
 	}
@@ -245,29 +243,30 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 
 	// Buttons	
 	S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2;
-
+	
 	for( S32 i = 0; i < num_options; i++ )
 	{
 		LLRect button_rect;
-		button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT );
-
-		LLButton::Params p;
-		p.name(options[i].first);
-		p.rect(button_rect);
-		p.click_callback.function(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
-		p.font(font);
-		p.label(options[i].second);
+		
+		LLButton* btn = LLUICtrlFactory::getInstance()->createFromFile<LLButton>("alert_button.xml", this, LLPanel::child_registry_t::instance());
+		if(btn)
+		{
+			btn->setName(options[i].first);
+			btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT ));
+			btn->setLabel(options[i].second);
+			btn->setFont(font);
+			
+			btn->setClickedCallback(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
 
-		LLButton* btn = LLUICtrlFactory::create<LLButton>(p);
-		mButtonData[i].mButton = btn;
+			mButtonData[i].mButton = btn;
 
-		LLToastPanel::addChild(btn);
+			LLToastPanel::addChild(btn);
 
-		if( i == mDefaultOption )
-		{
-			btn->setFocus(TRUE);
+			if( i == mDefaultOption )
+			{
+				btn->setFocus(TRUE);
+			}
 		}
-
 		button_left += button_width + BTN_HPAD;
 	}
 
@@ -275,25 +274,26 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 	if (!edit_text_name.empty())
 	{
 		S32 y = VPAD + BTN_HEIGHT + VPAD/2;
+		mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance());
+	
+		if (mLineEditor)
+		{
+			LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y);
+			mLineEditor->setName(edit_text_name);
+			mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());
+			mLineEditor->setRect(leditor_rect);
+			mLineEditor->setText(edit_text_contents);
+			mLineEditor->setMaxTextLength(STD_STRING_STR_LEN);
 
-		LLLineEditor::Params params;
-		params.name(edit_text_name);
-		params.rect(LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y));
-		params.default_text(edit_text_contents);
-		params.max_length_bytes(STD_STRING_STR_LEN);
-		mLineEditor = LLUICtrlFactory::create<LLLineEditor> (params);
+			// make sure all edit keys get handled properly (DEV-22396)
+			mLineEditor->setHandleEditKeysDirectly(TRUE);
 
-		// make sure all edit keys get handled properly (DEV-22396)
-		mLineEditor->setHandleEditKeysDirectly(TRUE);
+			LLToastPanel::addChild(mLineEditor);
 
-		LLToastPanel::addChild(mLineEditor);
-	}
-	
-	if (mLineEditor)
-	{
-		mLineEditor->setDrawAsterixes(is_password);
+			mLineEditor->setDrawAsterixes(is_password);
 
-		setEditTextArgs(notification->getSubstitutions());
+			setEditTextArgs(notification->getSubstitutions());
+		}
 	}
 
 	std::string ignore_label;
@@ -323,7 +323,14 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
 
 bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control )
 {
-	const LLFontGL* font = LLFontGL::getFontSansSerif();
+	mCheck = LLUICtrlFactory::getInstance()->createFromFile<LLCheckBoxCtrl>("alert_check_box.xml", this, LLPanel::child_registry_t::instance());
+
+	if(!mCheck)
+	{
+		return false;
+	}
+
+	const LLFontGL* font =  mCheck->getFont();
 	const S32 LINE_HEIGHT = llfloor(font->getLineHeight() + 0.99f);
 	
 	// Extend dialog for "check next time"
@@ -339,14 +346,13 @@ bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::
 	LLToastPanel::reshape( dialog_width, dialog_height, FALSE );
 
 	S32 msg_x = (LLToastPanel::getRect().getWidth() - max_msg_width) / 2;
+
+	// set check_box's attributes
+	LLRect check_rect;
+	mCheck->setRect(check_rect.setOriginAndSize(msg_x, VPAD+BTN_HEIGHT+LINE_HEIGHT/2, max_msg_width, LINE_HEIGHT));
+	mCheck->setLabel(check_title);
+	mCheck->setCommitCallback(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
 	
-	LLCheckBoxCtrl::Params p;
-	p.name("check");
-	p.rect.left(msg_x).bottom(VPAD+BTN_HEIGHT+LINE_HEIGHT/2).width(max_msg_width).height(LINE_HEIGHT);
-	p.label(check_title);
-	p.font(font);
-	p.commit_callback.function(boost::bind(&LLToastAlertPanel::onClickIgnore, this, _1));
-	mCheck = LLUICtrlFactory::create<LLCheckBoxCtrl>(p);
 	LLToastPanel::addChild(mCheck);
 
 	return true;
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 9c8fca355287a1f3fb155186d213f4ebe8c35236..5ed8dc5fb9a2bacbcfb0c7f46781865f3cc567cc 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -209,6 +209,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 			// touch behavior down below...
 			break;
 		case CLICK_ACTION_SIT:
+
 			if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // agent not already sitting
 			{
 				handle_object_sit_or_stand();
@@ -252,7 +253,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 					selectionPropertiesReceived();
 				}
 			}
-			return TRUE;
+			return TRUE;	
 		case CLICK_ACTION_PLAY:
 			handle_click_action_play();
 			return TRUE;
@@ -260,6 +261,29 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
 			// mClickActionObject = object;
 			handle_click_action_open_media(object);
 			return TRUE;
+		case CLICK_ACTION_ZOOM:
+			{	
+				const F32 PADDING_FACTOR = 2.f;
+				LLViewerObject* object = gObjectList.findObject(mPick.mObjectID);
+				
+				if (object)
+				{
+					gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+					
+					LLBBox bbox = object->getBoundingBoxAgent() ;
+					F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
+					F32 distance = bbox.getExtentLocal().magVec() * PADDING_FACTOR / atan(angle_of_view);
+				
+					LLVector3 obj_to_cam = LLViewerCamera::getInstance()->getOrigin() - bbox.getCenterAgent();
+					obj_to_cam.normVec();
+					
+					LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
+					gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance), 
+													  object_center_global, 
+													  mPick.mObjectID );
+				}
+			}
+			return TRUE;			
 		default:
 			// nothing
 			break;
@@ -413,6 +437,9 @@ ECursorType cursor_from_object(LLViewerObject* object)
 			cursor = UI_CURSOR_HAND;
 		}
 		break;
+	case CLICK_ACTION_ZOOM:
+			cursor = UI_CURSOR_TOOLZOOMIN;
+			break;			
 	case CLICK_ACTION_PLAY:
 	case CLICK_ACTION_OPEN_MEDIA: 
 		cursor = cursor_from_parcel_media(click_action);
@@ -551,6 +578,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
 		case CLICK_ACTION_BUY:
 		case CLICK_ACTION_PAY:
 		case CLICK_ACTION_OPEN:
+		case CLICK_ACTION_ZOOM:
+		case CLICK_ACTION_PLAY:
+		case CLICK_ACTION_OPEN_MEDIA:
 			// Because these actions open UI dialogs, we won't change
 			// the cursor again until the next hover and GL pick over
 			// the world.  Keep the cursor an arrow, assuming that 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 7772f613f0a05ea35937a2442566150ef46ee004..642df923795c303ab9c4b71afba8e8762f289569 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -109,6 +109,7 @@
 #include "llfloaterwhitelistentry.h"
 #include "llfloaterwindlight.h"
 #include "llfloaterworldmap.h"
+#include "llimfloatercontainer.h"
 #include "llinspectavatar.h"
 #include "llinspectgroup.h"
 #include "llinspectobject.h"
@@ -124,6 +125,7 @@
 #include "llpreviewsound.h"
 #include "llpreviewtexture.h"
 #include "llsyswellwindow.h"
+#include "llscriptfloater.h"
 // *NOTE: Please add files in alphabetical order to keep merges easy.
 
 
@@ -171,6 +173,8 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("hud", "floater_hud.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHUD>);
 
 	LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
+	LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
+	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
 	LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
 	LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
 	LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 089535dfab457351d87eeb2167b2a73b86c696d7..87d256b60a94f1231928d90d7ff6d5466c160b57 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -1336,6 +1336,12 @@ BOOL LLViewerInventoryItem::extractSortFieldAndDisplayName(const std::string& na
 	return result;
 }
 
+void LLViewerInventoryItem::insertDefaultSortField(std::string& name)
+{
+	name.insert(0, std::string("1") + getSeparator());
+}
+
+
 // This returns true if the item that this item points to 
 // doesn't exist in memory (i.e. LLInventoryModel).  The baseitem
 // might still be in the database but just not loaded yet.
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 529425aa258800f09140cb71d7fc074acf62e65b..d27faffdd9e7c4417683e4b512a5b1e1ac79c0e6 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -81,6 +81,7 @@ class LLViewerInventoryItem : public LLInventoryItem, public boost::signals2::tr
 	virtual U32 getCRC32() const; // really more of a checksum.
 
 	static BOOL extractSortFieldAndDisplayName(const std::string& name, S32* sortField, std::string* displayName);
+	static void insertDefaultSortField(std::string& name);
 
 	// construct a complete viewer inventory item
 	LLViewerInventoryItem(const LLUUID& uuid, const LLUUID& parent_uuid,
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 3a7c54479b3d473910c2398354b9cd83c942f571..8c41133a3a8636d59451d6f22a5ec9a2bd7472b5 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -278,7 +278,7 @@ viewer_media_t LLViewerMedia::newMediaImpl(
 	}
 	else
 	{
-		media_impl->stop();
+		media_impl->unload();
 		media_impl->mTextureId = texture_id;
 		media_impl->mMediaWidth = media_width;
 		media_impl->mMediaHeight = media_height;
@@ -293,7 +293,12 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 {	
 	// Try to find media with the same media ID
 	viewer_media_t media_impl = getMediaImplFromTextureID(media_entry->getMediaID());
-
+	
+	lldebugs << "called, current URL is \"" << media_entry->getCurrentURL() 
+			<< "\", previous URL is \"" << previous_url 
+			<< "\", update_from_self is " << (update_from_self?"true":"false")
+			<< llendl;
+			
 	bool was_loaded = false;
 	bool needs_navigate = false;
 	
@@ -314,21 +319,32 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 			media_impl->mMediaSource->setSize(media_entry->getWidthPixels(), media_entry->getHeightPixels());
 		}
 		
+		bool url_changed = (media_entry->getCurrentURL() != previous_url);
 		if(media_entry->getCurrentURL().empty())
 		{
-			// The current media URL is now empty.  Unload the media source.
-			media_impl->unload();
+			if(url_changed)
+			{
+				// The current media URL is now empty.  Unload the media source.
+				media_impl->unload();
+			
+				lldebugs << "Unloading media instance (new current URL is empty)." << llendl;
+			}
 		}
 		else
 		{
 			// The current media URL is not empty.
 			// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
 			// do a navigate.
+			bool auto_play = (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING));
 			
-			if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)
+			if((was_loaded || auto_play) && !update_from_self)
 			{
-				needs_navigate = (media_entry->getCurrentURL() != previous_url);
+				needs_navigate = url_changed;
 			}
+			
+			lldebugs << "was_loaded is " << (was_loaded?"true":"false") 
+					<< ", auto_play is " << (auto_play?"true":"false") 
+					<< ", needs_navigate is " << (needs_navigate?"true":"false") << llendl;
 		}
 	}
 	else
@@ -354,6 +370,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 		if(needs_navigate)
 		{
 			media_impl->navigateTo(url, "", true, true);
+			lldebugs << "navigating to URL " << url << llendl;
 		}
 		else if(!media_impl->mMediaURL.empty() && (media_impl->mMediaURL != url))
 		{
@@ -362,6 +379,8 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
 
 			// If this causes a navigate at some point (such as after a reload), it should be considered server-driven so it isn't broadcast.
 			media_impl->mNavigateServerRequest = true;
+
+			lldebugs << "updating URL in the media impl to " << url << llendl;
 		}
 	}
 	
@@ -1092,15 +1111,7 @@ void LLViewerMediaImpl::stop()
 {
 	if(mMediaSource)
 	{
-		if(mMediaSource->pluginSupportsMediaBrowser())
-		{
-			mMediaSource->browse_stop();
-		}
-		else
-		{
-			mMediaSource->stop();
-		}
-
+		mMediaSource->stop();
 		// destroyMediaSource();
 	}
 }
@@ -1132,6 +1143,40 @@ void LLViewerMediaImpl::seek(F32 time)
 	}
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipBack(F32 step_scale)
+{
+	if(mMediaSource)
+	{
+		if(mMediaSource->pluginSupportsMediaTime())
+		{
+			F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
+			if(back_step < 0.0)
+			{
+				back_step = 0.0;
+			}
+			mMediaSource->seek(back_step);
+		}
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::skipForward(F32 step_scale)
+{
+	if(mMediaSource)
+	{
+		if(mMediaSource->pluginSupportsMediaTime())
+		{
+			F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
+			if(forward_step > mMediaSource->getDuration())
+			{
+				forward_step = mMediaSource->getDuration();
+			}
+			mMediaSource->seek(forward_step);
+		}
+	}
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::setVolume(F32 volume)
 {
@@ -1339,21 +1384,7 @@ void LLViewerMediaImpl::navigateBack()
 {
 	if (mMediaSource)
 	{
-		if(mMediaSource->pluginSupportsMediaTime())
-		{
-			F64 step_scale = 0.02; // temp , can be changed
-			F64 back_step = mMediaSource->getCurrentTime() - (mMediaSource->getDuration()*step_scale);
-			if(back_step < 0.0)
-			{
-				back_step = 0.0;
-			}
-			mMediaSource->seek(back_step);
-			//mMediaSource->start(-2.0);
-		}
-		else
-		{
-			mMediaSource->browse_back();
-		}
+		mMediaSource->browse_back();
 	}
 }
 
@@ -1362,21 +1393,7 @@ void LLViewerMediaImpl::navigateForward()
 {
 	if (mMediaSource)
 	{
-		if(mMediaSource->pluginSupportsMediaTime())
-		{
-			F64 step_scale = 0.02; // temp , can be changed
-			F64 forward_step = mMediaSource->getCurrentTime() + (mMediaSource->getDuration()*step_scale);
-			if(forward_step > mMediaSource->getDuration())
-			{
-				forward_step = mMediaSource->getDuration();
-			}
-			mMediaSource->seek(forward_step);
-			//mMediaSource->start(2.0);
-		}
-		else
-		{
-			mMediaSource->browse_forward();
-		}
+		mMediaSource->browse_forward();
 	}
 }
 
@@ -1525,7 +1542,6 @@ void LLViewerMediaImpl::navigateStop()
 	{
 		mMediaSource->browse_stop();
 	}
-
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index f4afce6c4c910978cb1769cb2dea005e87d371d7..ac12112ed416d2d5a052ac63d8069907ccc3b754 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -149,6 +149,8 @@ class LLViewerMediaImpl
 	void pause();
 	void start();
 	void seek(F32 time);
+	void skipBack(F32 step_scale);
+	void skipForward(F32 step_scale);
 	void setVolume(F32 volume);
 	void updateVolume();
 	F32 getVolume();
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 70a7d835a36da1b256496b40a771f60a7a78cf32..fd74c9c2fcad2a2436a15fbe4114bc06a0ad3fea 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -120,10 +120,20 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		// We must do this before  processing the media HUD zoom, or it may zoom to the wrong face. 
 		update();
 
-		if(mMediaControls.get() && face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+		if(mMediaControls.get())
 		{
-			mMediaControls.get()->resetZoomLevel();
-			mMediaControls.get()->nextZoomLevel();
+			if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
+			{
+				// Zoom in on this face
+				mMediaControls.get()->resetZoomLevel();
+				mMediaControls.get()->nextZoomLevel();
+			}
+			else
+			{
+				// Reset the controls' zoom level without moving the camera.
+				// This fixes the case where clicking focus between two non-autozoom faces doesn't change the zoom-out button back to a zoom-in button.
+				mMediaControls.get()->resetZoomLevel(false);
+			}
 		}
 	}
 	else
@@ -132,7 +142,8 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 		{
 			if(mMediaControls.get())
 			{
-				mMediaControls.get()->resetZoomLevel();
+				// Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
+				mMediaControls.get()->resetZoomLevel(false);
 			}
 		}
 
@@ -292,6 +303,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
 
 		if (key == KEY_ESCAPE)
 		{
+			// Reset camera zoom in this case.
+			if(mFocusedImplID.notNull())
+			{
+				if(mMediaControls.get())
+				{
+					mMediaControls.get()->resetZoomLevel(true);
+				}
+			}
+			
 			clearFocus();
 		}
 	}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 6a6aa1061dc6adad47b78785bde490d34cb7588c..625b8161250193e8e48a0140e0467279d279e1a4 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2733,15 +2733,26 @@ bool enable_object_edit()
 	// there.  Eventually this needs to be replaced with code that only 
 	// lets you edit objects if you have permission to do so (edit perms,
 	// group edit, god).  See also lltoolbar.cpp.  JC
-	bool enable = true;
+	bool enable = false;
 	if (gAgent.inPrelude())
 	{
 		enable = LLViewerParcelMgr::getInstance()->agentCanBuild()
 			|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
+	} 
+	else if (LLSelectMgr::getInstance()->selectGetModify())
+	{
+		enable = true;
 	}
+
 	return enable;
 }
 
+// mutually exclusive - show either edit option or build in menu
+bool enable_object_build()
+{
+	return !enable_object_edit();
+}
+
 class LLSelfRemoveAllAttachments : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -5667,6 +5678,16 @@ class LLFloaterVisible : public view_listener_t
 	}
 };
 
+class LLShowSidetrayPanel : public view_listener_t
+{
+	bool handleEvent(const LLSD& userdata)
+	{
+		std::string panel_name = userdata.asString();
+		LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+		return true;
+	}
+};
+
 bool callback_show_url(const LLSD& notification, const LLSD& response)
 {
 	S32 option = LLNotification::getSelectedOption(notification, response);
@@ -8023,9 +8044,12 @@ void initialize_menus()
 	visible.add("VisiblePayObject", boost::bind(&enable_pay_object));
 	enable.add("EnablePayAvatar", boost::bind(&enable_pay_avatar));
 	enable.add("EnableEdit", boost::bind(&enable_object_edit));
+	visible.add("VisibleBuild", boost::bind(&enable_object_build));
+	visible.add("VisibleEdit", boost::bind(&enable_object_edit));
 	visible.add("Object.VisibleEdit", boost::bind(&enable_object_edit));
 
 	view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
+	view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
 	view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
 	view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
 	view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 11b2f07f1bd514e8eb386785fa28deabc8263376..4d7d3ee8ac7c60724382b2d6c98cfeb748a64175 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -101,6 +101,7 @@
 #include "llpanelgrouplandmoney.h"
 #include "llpanelplaces.h"
 #include "llrecentpeople.h"
+#include "llscriptfloater.h"
 #include "llselectmgr.h"
 #include "llsidetray.h"
 #include "llstartup.h"
@@ -1372,7 +1373,8 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
 
 	payload["from_id"] = info->mFromID;
 	args["OBJECTFROMNAME"] = info->mFromName;
-	args["NAME"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+	args["NAME"] = info->mFromName;
+	args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
 	std::string verb = "highlight?name=" + msg;
 	args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
 
@@ -2115,7 +2117,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			send_generic_message("requestonlinenotification", strings);
 			
 			args["NAME"] = name;
-			LLNotifications::instance().add("FriendshipAccepted", args);
+			LLSD payload;
+			payload["from_id"] = from_id;
+			LLNotifications::instance().add("FriendshipAccepted", args, payload);
 		}
 		break;
 
@@ -5377,6 +5381,17 @@ void process_script_dialog(LLMessageSystem* msg, void**)
 		notification = LLNotifications::instance().add(
 			LLNotification::Params("ScriptDialogGroup").substitutions(args).payload(payload).form_elements(form.asLLSD()));
 	}
+
+	// "ScriptDialog" and "ScriptDialogGroup" are handles by LLScriptFloaterManager.
+	// We want to inform user that there is a script floater, lets add "ScriptToast"
+	LLNotification::Params p("ScriptToast");
+	p.substitutions(args).payload(payload).functor.function(boost::bind(
+		LLScriptFloaterManager::onToastButtonClick, _1, _2));
+
+	notification = LLNotifications::instance().add(p);
+
+	LLScriptFloaterManager::getInstance()->setNotificationToastId(
+		object_id, notification->getID());
 }
 
 //---------------------------------------------------------------------------
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 7559fd8e72c0bdc4c84c86182d7fcd0d5f385ea2..f61dbb1b391e87d9893969a5cbcb8cabd42004a5 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -218,7 +218,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 			LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
 
 			// Delete the old one first so they don't fight over the texture.
-			sMediaImpl->stop();
+			sMediaImpl = NULL;
 
 			sMediaImpl = LLViewerMedia::newMediaImpl(
 				placeholder_texture_id,
@@ -261,8 +261,7 @@ void LLViewerParcelMedia::stop()
 	// We need to remove the media HUD if it is up.
 	LLViewerMediaFocus::getInstance()->clearFocus();
 
-	// This will kill the media instance.
-	sMediaImpl->stop();
+	// This will unload & kill the media instance.
 	sMediaImpl = NULL;
 }
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 5fedfc943bfe9caf3a34e640d219ece4e65e97a7..479cf5a04d0ca8dd71612bacfed1d3ab4bcc1420 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1867,7 +1867,7 @@ void LLVoiceClient::stateMachine()
 					}
 					else
 					{
-						LL_WARNS("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
+						LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
 					}
 				}
 			}
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 1f49cd30c77835a88d86cc8cd68f0a64bdf9d1f8..48bd3870226b59e4854bec13648a43fd808a3ff6 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -140,6 +140,9 @@ class LLMediaDataClientObjectImpl : public LLMediaDataClientObject
 	virtual std::string getCapabilityUrl(const std::string &name) const
 		{ return mObject->getRegion()->getCapability(name); }
 	
+	virtual bool isDead() const
+		{ return mObject->isDead(); }
+	
 private:
 	LLPointer<LLVOVolume> mObject;
 };
@@ -183,6 +186,22 @@ LLVOVolume::~LLVOVolume()
 	}
 }
 
+void LLVOVolume::markDead()
+{
+	if (!mDead)
+	{
+		// TODO: tell LLMediaDataClient to remove this object from its queue
+		
+		// Detach all media impls from this object
+		for(U32 i = 0 ; i < mMediaImplList.size() ; i++)
+		{
+			removeMediaImpl(i);
+		}
+	}
+	
+	LLViewerObject::markDead();
+}
+
 
 // static
 void LLVOVolume::initClass()
@@ -1708,10 +1727,16 @@ void LLVOVolume::updateObjectMediaData(const LLSD &media_data_array)
 
 void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool merge, bool ignore_agent)
 {
+	if(mDead)
+	{
+		// If the object has been marked dead, don't process media updates.
+		return;
+	}
+	
 	LLTextureEntry *te = getTE(texture_index);
-	//llinfos << "BEFORE: texture_index = " << texture_index
-	//	<< " hasMedia = " << te->hasMedia() << " : " 
-	//	<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+	LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index
+		<< " hasMedia = " << te->hasMedia() << " : " 
+		<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
 
 	std::string previous_url;
 	LLMediaEntry* mep = te->getMediaData();
@@ -1751,9 +1776,9 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
 		removeMediaImpl(texture_index);
 	}
 
-	//llinfos << "AFTER: texture_index = " << texture_index
-	//	<< " hasMedia = " << te->hasMedia() << " : " 
-	//	<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
+	LL_DEBUGS("MediaOnAPrim") << "AFTER: texture_index = " << texture_index
+		<< " hasMedia = " << te->hasMedia() << " : " 
+		<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
 }
 
 void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
@@ -1776,7 +1801,7 @@ void LLVOVolume::mediaNavigateBounceBack(U8 texture_index)
         }
         if (! url.empty())
         {
-            LL_INFOS("LLMediaDataClient") << "bouncing back to URL: " << url << LL_ENDL;
+            LL_INFOS("MediaOnAPrim") << "bouncing back to URL: " << url << LL_ENDL;
             impl->navigateTo(url, "", false, true);
         }
     }
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 6bad245e192b3b8ee35dccfd7b3d39b9f6307f00..06e214b41e307cb9747bfaa55c0603b77cbdd6a5 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -100,6 +100,7 @@ class LLVOVolume : public LLViewerObject
 
 public:
 						LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
+	/*virtual*/ void markDead();		// Override (and call through to parent) to clean up media references
 
 	/*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
 
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index f4a239be62145f3ba0db0c15ceed6d9f149941ef..6678918db81702b13a28410cd8ae80010734b6ef 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -161,7 +161,7 @@ with the same filename but different name
   <texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
   <texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
   <texture name="Generic_Object_Medium" file_name="icons/Generic_Object_Medium.png" preload="false" />
-  <texture name="Generic_Object_Small" file_name="icons/ Generic_Object_Small.png" preload="false" />
+  <texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
   <texture name="Generic_Object_Large" file_name="icons/Generic_Object_Large.png" preload="false" />
   <texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
   <texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index 1c580aa916d90d5e8dd24a4bd40cf5daf1302a55..89cce0f6dc822ebb9535cd6b77b2296e23f2c089 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="MEDIENBROWSER">
 	<floater.string name="home_page_url">
-		http://www.secondlife.com
+		http://de.secondlife.com
 	</floater.string>
 	<floater.string name="support_page_url">
-		http://support.secondlife.com
+		http://de.secondlife.com/support
 	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index 62cd98287528378e8b27ced2cbc4adfa6c32e55d..317b525062244e4989d9cf366014f7435dc1017b 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Einstellungen" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=de" />
+		</menu_item_call>
+	</menu>
 	<menu label="Datei" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Hochladen" name="upload">
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index 7e3a6aaa932c5407418b41a2e0045deaa891daec..8b8a0afa8922a97158000847e904675309ec8a67 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -317,7 +317,7 @@ Gebühren werden nicht rückerstattet.
 	<notification name="PromptGoToEventsPage">
 		Zur [SECOND_LIFE] Events-Webseite?
 		<url name="url">
-			http://de.secondlife.com/events/
+			http://secondlife.com/events/?lang=de-DE
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
 	</notification>
@@ -498,7 +498,7 @@ Verschieben Sie alle betreffenden Objekte in dieselbe Region.
 
 [_URL] für Informationen zum Kauf von L$ öffnen?
 		<url name="url">
-			http://de.secondlife.com/app/currency/
+			http://secondlife.com/app/currency/?lang=de-DE
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
 	</notification>
@@ -1055,7 +1055,7 @@ Sie können [SECOND_LIFE] normal verwenden. Andere Benutzer können Sie korrekt
 		Die Installation von [APP_NAME] ist abgeschlossen.
 
 Wenn Sie [SECOND_LIFE] das erste Mal verwenden, müssen Sie ein Konto anlegen, bevor Sie sich anmelden können.
-Möchten Sie auf www.secondlife.com ein Konto erstellen?
+Möchten Sie auf [https://join.secondlife.com/index.php?lang=de-DE secondlife.com] ein Konto erstellen?
 		<usetemplate name="okcancelbuttons" notext="Weiter" yestext="Neues Konto..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
@@ -1452,7 +1452,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
 
 Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
 		</url>
 		<usetemplate ignoretext="Ich kann diese Region aufgrund der Alterseinstufung nicht betreten" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
 	</notification>
@@ -1480,7 +1480,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
 
 Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
 		</url>
 		<usetemplate ignoretext="Ich habe aufgrund der Alterseinstufung keinen Anspruch auf dieses Land" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
 	</notification>
@@ -1504,7 +1504,7 @@ Bitte vergewissern Sie sich, dass Sie den aktuellsten Viewer installiert haben u
 
 Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Altereinstufung zu erhalten?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Alterseinstufung:_Ein_%C3%9Cberblick_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/de
 		</url>
 		<usetemplate ignoretext="Ich kann aufgrund der Alterseinstufung dieses Land nicht kaufen" name="okcancelignore" notext="Schließen" yestext="Zur Knowledgbase"/>
 	</notification>
@@ -1690,10 +1690,7 @@ Inventarobjekt(e) verschieben?
 		<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Verwenden Sie dieses Tool, um Verletzungen der Servicebedingungen und Community-Standards zu melden. Siehe:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Verwenden Sie dieses Tool, um Verletzungen der [http://secondlife.com/corporate/tos.php?lang=de-DE Servicebedingungen] und [http://secondlife.com/corporate/cs.php?lang=de-DE Community-Standards] zu melden.
 
 Alle gemeldeten Verletzungen der Servicebedingungen und Community-Standards werden geprüft und geklärt Sie können den Prozess im Incident Report (Vorfallsbericht) verfolgen:
 
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index 9a15795cbef91ddd336c0bed7472525710c1b78a..534bcfc82b380445fa8fc367968a0936b82b8140 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -4,7 +4,7 @@
 		http://de.secondlife.com/registration/
 	</panel.string>
 	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
+		http://secondlife.com/account/request.php?lang=de
 	</panel.string>
 	<panel name="login_widgets">
 		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Vorname"/>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index b5fb2329c572ed8fdd750f9522682b77f2adee4c..c3274acaae2a8fe855afd5a275cb33e6e33f1e77 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -1,11 +1,15 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Profil" name="panel_profile">
 	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
 	</string>
 	<string name="payment_update_link_url">
 		http://www.secondlife.com/account/billing.php?lang=de-DE
 	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=de
+	</string>
 	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=de-DE"/>
 	<string name="no_partner_text" value="Keiner"/>
 	<scroll_container name="profile_scroll">
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 9a0f5021d8100ed56d7bb3cb1ed1e87987dbfee6..86eb8b1479ba97d1c2d309cc8f29faa4cb4164e4 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=de-DE</string>
 	<string name="SECOND_LIFE">
 		Second Life
 	</string>
@@ -158,7 +159,7 @@
 		Anklicken, um Befehl secondlife:// auszuführen
 	</string>
 	<string name="BUTTON_CLOSE_DARWIN">
-		Schließen (⌘-W)
+		Schließen (&#8984;W)
 	</string>
 	<string name="BUTTON_CLOSE_WIN">
 		Schließen (Strg+W)
@@ -1311,16 +1312,16 @@ Gültige Formate: .wav, .tga, .bmp, .jpg, .jpeg oder .bvh
 		Landmarke bearbeiten...
 	</string>
 	<string name="accel-mac-control">
-		⌃
+		&#8963;
 	</string>
 	<string name="accel-mac-command">
-		⌘
+		&#8984;
 	</string>
 	<string name="accel-mac-option">
-		⌥
+		&#8997;
 	</string>
 	<string name="accel-mac-shift">
-		⇧
+		&#8679;
 	</string>
 	<string name="accel-win-control">
 		Strg+
diff --git a/indra/newview/skins/default/xui/en/alert_button.xml b/indra/newview/skins/default/xui/en/alert_button.xml
new file mode 100644
index 0000000000000000000000000000000000000000..48c67a3770b90c613bbbcc2ae550e43c0e3f98d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_button.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<button
+  label_shadow="true"
+  auto_resize="false"
+  image_overlay_alignment="center"
+  use_ellipses="flse"
+  pad_right="10"
+  pad_left="10"
+  is_toggle="false"
+  scale_image="true"
+  commit_on_return="true"
+  font="SansSerifSmall"
+  follows="bottom"/>
diff --git a/indra/newview/skins/default/xui/en/alert_check_box.xml b/indra/newview/skins/default/xui/en/alert_check_box.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9f1bdb51939f7c8f9b518ad9c5221daee6b6793c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_check_box.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<check_box
+  text_enabled_color="LabelTextColor"
+  text_disabled_color="LabelDisabledColor"
+  font="SansSerif"
+  follows="left|top"
+  name="check"/>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/alert_icon.xml b/indra/newview/skins/default/xui/en/alert_icon.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b0886fce0616ad624447e11b33d22f571251bc24
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_icon.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<icon color="1.0 1.0 1.0 1.0"
+      tab_stop="false"
+      mouse_opaque="false"
+      name="icon"
+      image_name="notify_caution_icon.tga" 
+      follows="left|top">
+</icon>
diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ab708adb06b327bddfd82133f1bf37cfa64328a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<line_editor
+  select_on_focus="false"
+  handle_edit_keys_directly="false"
+  revert_on_esc="true"
+  commit_on_focus_lost="true"
+  ignore_tab="true"
+  max_length="254"
+  text_pad_right="0"
+  text_pad_left="0"
+  mouse_opaque="true"/>
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index 3a1499eaaaf0ec0c3d3ab8a6fcfdc6654e9d9af5..953bd08dd41ace4a534528f1de45ddd1e2099eec 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -26,6 +26,12 @@
      name="searching">
         Searching...
     </floater.string>
+    <!-- For multiple person selection, use "Select" and "Close" 
+      instead of "OK" and "Cancel" because "Cancel" still keeps the ones 
+      you have already selected.  The code will show the appropriate
+      set of buttons. -->
+    <string name="Select">Select</string>
+    <string name="Close">Close</string>
     <tab_container
      follows="all"
      height="300"
@@ -205,7 +211,7 @@
      height="23"
      label="OK"
      label_selected="OK"
-     name="Select"
+     name="ok_btn"
      top_pad="3"
      left="46"
      width="100" />
@@ -214,7 +220,7 @@
      height="23"
      label="Cancel"
      label_selected="Cancel"
-     name="Cancel"
+     name="cancel_btn"
      width="100"
      left_pad="5" />
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
index 833e8beb8d4116c627607ed9b71c9cb9e3422f81..77a0e9b91bfb69ffbc58eb7516bd5fcb9c5b7a4f 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml
@@ -56,7 +56,7 @@
     <text
      type="string"
      length="1"
-     follows="left|top"
+     follows="left|bottom"
      font="SansSerif"
      height="16"
      layout="topleft"
@@ -68,7 +68,7 @@
         Buy for L$[AMOUNT] from [NAME]?
     </text>
     <check_box
-     follows="left|top"
+     follows="left|bottom"
      height="16"
      label="Wear clothing now"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index 21d292847ab7dfe75b08da53838484ee27efd5ff..9f5e6828d20d4fb308b09036d38b7dabbd3b8e27 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -21,12 +21,16 @@
      name="playing">
         (Playing)
     </floater.string>
+    <!-- It's used to build new name for gesture created by "Copy" menu item -->
+    <floater.string
+     name="copy_name">Copy of [COPY_NAME]</floater.string>
     <scroll_list
      bottom_delta="400"
      draw_heading="true"
      follows="all"
      layout="topleft"
      left="0"
+     multi_select="true"
      top="20"
      name="gesture_list">
         <scroll_list.columns
@@ -57,18 +61,18 @@
              left="0"
              name="bottom_panel"
              width="313">
-               <button
+              <menu_button
                follows="bottom|left"
-               font="SansSerifBigBold"
-               tool_tip="Change sort and view of recent residents list"
                height="18"
                image_disabled="OptionsMenu_Disabled"
                image_selected="OptionsMenu_Press"
                image_unselected="OptionsMenu_Off"
                layout="topleft"
                left="10"
-               name="recent_viewsort_btn"
+               menu_filename="menu_gesture_gear.xml"
+               name="gear_btn"
                top="5"
+               tool_tip="More options"
                width="18" />
               <button
                  follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cf6a4e45bd10d8ccdd1a55c9862f669ad1549302
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<multi_floater
+background_visible="true"
+bg_color="yellow" 
+ can_resize="true"
+ height="390"
+ layout="topleft"
+ name="floater_im_box"
+ help_topic="floater_im_box"
+ save_rect="true"
+ save_visibility="true"
+ single_instance="true"
+ title="Instant Messages"
+ width="392">
+    <tab_container
+     follows="left|right|top|bottom"
+     height="390"
+     layout="topleft"
+     left="1"
+     name="im_box_tab_container"
+     tab_position="bottom"
+     tab_width="80"
+     top="0"
+     width="390" />
+    <icon
+     color="DefaultShadowLight"
+     enabled="false"
+     follows="left|right|bottom"
+     height="17"
+     image_name="tabarea.tga"
+     layout="bottomleft"
+     left="1"
+     name="im_box_tab_container_icon"
+     bottom="10"
+     width="390" />
+</multi_floater>
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index c20aaea2aa36a0dec737676ba807a7f82b81bcab..7f2f37409c370da88abdf5276f4b6d728a46062c 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -9,7 +9,7 @@
  name="panel_im"
  top="0"
  can_close="true"
- can_dock="true"
+ can_dock="false"
  can_minimize="false"
  visible="true"
  width="300"
@@ -35,6 +35,7 @@
     <layout_panel
        left="0"
        top="0"
+	   width="180"
        user_resize="false">
         <button
           height="20"
diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index 9bb30f8e86daeb121c8041c5318eaf829d604d3b..262bcd07a0fee609d28f590b2ec5af1aae775b9c 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- height="512"
+ height="555"
  help_topic="regioninfo"
  layout="topleft"
  name="regioninfo"
@@ -9,7 +9,7 @@
  title="REGION/ESTATE"
  width="480">
     <tab_container
-     bottom="512"
+     bottom="555"
      follows="left|right|top|bottom"
      layout="topleft"
      left="1"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index 696233676cd19dd4343b77d76f32fb9014b4f4c9..91ca3ef27ad0e5edd4f26591b3484f11517d8c0d 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -18,7 +18,7 @@
      height="150"
      layout="topleft"
      left="60"
-     name=""
+     name="screenshot"
      top="15"
      width="220" />
     <check_box
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f44ba6d873e8a9b8511e6f4c6d8c32fcc011cfe4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ background_visible="true"
+ follows="left|top|right|bottom"
+ height="369"
+ layout="topleft"
+ left="0"
+ name="script_floater"
+ help_topic="script_floater"
+ top="0"
+ can_dock="true"
+ can_minimize="true"
+ visible="true" 
+ width="520"
+ can_resize="true"
+ min_width="350"
+ min_height="369">
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index a626e1b3537af82545b30e9546ea5b66f5b2adea..8b6f0f03fe243d8cf20ab3b67b41144eb2fe72c8 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -968,23 +968,27 @@
                 <combo_box.item
                  label="Touch  (default)"
                  name="Touch/grab(default)"
-                 value="Touch/grab (default)" />
+                 value="Touch" />
                 <combo_box.item
                  label="Sit on object"
                  name="Sitonobject"
-                 value="Sit on object" />
+                 value="Sit" />
                 <combo_box.item
                  label="Buy object"
                  name="Buyobject"
-                 value="Buy object" />
+                 value="Buy" />
                 <combo_box.item
                  label="Pay object"
                  name="Payobject"
-                 value="Pay object" />
+                 value="Pay" />
                 <combo_box.item
                  label="Open"
                  name="Open"
                  value="Open" />
+				 <combo_box.item
+                 label="Zoom"
+                 name="Zoom"
+                 value="Zoom" />
             </combo_box>
             <check_box
              height="16"
diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4642e82c0b20bf29e51c4f258e87d218c02ce3cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ mouse_opaque="false"
+ name="menu_gesture_gear"
+ visible="false">
+    <menu_item_call
+     font="SansSerifBold"
+     label="Add/Remove from Favorites"
+     layout="topleft"
+     name="activate">
+        <on_click
+         function="Gesture.Action.ToogleActiveState" />
+    </menu_item_call>
+    <menu_item_call
+     label="Copy"
+     layout="topleft"
+     name="copy_gesture">
+        <on_click
+         function="Gesture.Action.CopyPast"
+         parameter="copy_gesture" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="copy_gesture" />
+    </menu_item_call>
+    <menu_item_call
+     label="Paste"
+     layout="topleft"
+     name="paste">
+        <on_click
+         function="Gesture.Action.CopyPast"
+         parameter="paste" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="paste" />
+    </menu_item_call>
+    <menu_item_call
+     label="Copy UUID"
+     layout="topleft"
+     name="copy_uuid">
+        <on_click
+         function="Gesture.Action.CopyPast"
+         parameter="copy_uuid" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="copy_uuid" />
+    </menu_item_call>
+    <menu_item_call
+     label="Save to current outfit"
+     layout="topleft"
+     name="save_to_outfit">
+        <on_click
+         function="Gesture.Action.SaveToCOF" />
+    </menu_item_call>
+    <menu_item_call
+     label="Edit"
+     layout="topleft"
+     name="edit_gesture">
+        <on_click
+         function="Gesture.Action.ShowPreview" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="edit_gesture" />
+    </menu_item_call>
+    <menu_item_call
+     label="Inspect"
+     layout="topleft"
+     name="inspect">
+        <on_click
+         function="Gesture.Action.ShowPreview" />
+        <on_enable
+         function="Gesture.EnableAction"
+         parameter="inspect" />
+    </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 2b101e90584f9153e392047878fbb4e3a7842fc5..972284969090be5491b49997d198522ca63199da 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -59,7 +59,7 @@
          label="My Inventory"
          layout="topleft"
          name="Inventory"
-         shortcut="control|I">
+         shortcut="control|shift|I">
             <menu_item_check.on_check
              function="Floater.Visible"
              parameter="inventory" />
@@ -67,6 +67,15 @@
              function="Floater.Toggle"
              parameter="inventory" />
         </menu_item_check>
+        <menu_item_call
+         label="Show Sidetray Inventory"
+         name="ShowSidetrayInventory"
+         shortcut="control|I"
+         visible="false">
+            <menu_item_call.on_click
+             function="ShowSidetrayPanel"
+             parameter="sidepanel_inventory" />
+        </menu_item_call>
         <menu_item_call
          label="My Gestures"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index cdf62340b28a4ccaac7076a7fc89349bfc153f68..c104f74dd111d1a9b7d62c0bbdd938c0d3730b6e 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -722,7 +722,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
    icon="alertmodal.tga"
    name="AddClassified"
    type="alertmodal">
-Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://www.secondlife.com secondlife.com] for one week.
+Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
 Fill out your ad, then click &apos;Publish...&apos; to add it to the directory.
 You&apos;ll be asked for a price to pay when clicking Publish.
 Paying more makes your ad appear higher in the list, and also appear higher when people search for keywords.
@@ -1434,6 +1434,13 @@ Not able to perform &apos;reset&apos;.
 Select objects with scripts that you have permission to modify.
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="CannotOpenScriptObjectNoMod"
+   type="alertmodal">
+    Unable to open script in object without modify permissions.
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="CannotSetRunningSelectObjectsNoScripts"
@@ -3261,7 +3268,7 @@ You are not allowed in that region due to your maturity Rating.
 
 Go to the Knowledge Base for more information about maturity Ratings?
     <url option="0" name="url">
-		https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+		http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
     </url>
     <usetemplate
      name="okcancelignore"
@@ -3318,7 +3325,7 @@ You cannot claim this land due to your maturity Rating.
 
 Go to the Knowledge Base for more information about maturity Ratings?
     <url option="0" name="url">
-		https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+		http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
     </url>
     <usetemplate
      name="okcancelignore"
@@ -3368,7 +3375,7 @@ You cannot buy this land due to your maturity Rating.
 
 Go to the Knowledge Base for more information about maturity Ratings?
     <url option="0" name="url">
-		https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+		http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview
     </url>
     <usetemplate
      name="okcancelignore"
@@ -3765,7 +3772,7 @@ There are no items in this object that you are allowed to copy.
    icon="alertmodal.tga"
    name="WebLaunchAccountHistory"
    type="alertmodal">
-Go to  your [http://secondlife.com/account/ Dashboard] to see your account history?
+Go to your [http://secondlife.com/account/ Dashboard] to see your account history?
     <usetemplate
      ignoretext="Launch my browser to see my account history"
      name="okcancelignore"
@@ -4971,7 +4978,7 @@ No valid parcel could be found.
    icon="notify.tga"
    name="ObjectGiveItem"
    type="offer">
-An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
+An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has offered you [OBJECTTYPE]:
 [ITEM_SLURL]
     <form name="form">
       <button
@@ -4992,8 +4999,9 @@ An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
   <notification
    icon="notify.tga"
    name="ObjectGiveItemUnknownUser"
-   type="notify">
-An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a [OBJECTTYPE] named [OBJECTNAME].
+   type="offer">
+An object named [OBJECTFROMNAME] owned by (an unknown Resident) has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
     <form name="form">
       <button
        index="0"
@@ -5014,7 +5022,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
    icon="notify.tga"
    name="UserGiveItem"
    type="offer">
-[NAME] has offered you [OBJECTTYPE]:
+[NAME_SLURL] has offered you [OBJECTTYPE]:
 [ITEM_SLURL]
     <form name="form">
       <button
@@ -5309,6 +5317,27 @@ Grant this request?
     </form>
   </notification>
 
+  <notification
+   icon="notify.tga"
+   name="ScriptToast"
+   type="notify">
+    [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; is requesting user input.
+    <form name="form">
+      <button
+       index="0"
+       name="Open"
+       text="Open Dialog"/>
+      <button
+       index="1"
+       name="Ignore"
+       text="Ignore"/>
+      <button
+       index="2"
+       name="Block"
+       text="Block"/>
+    </form>
+  </notification>
+
   <notification
    icon="notify.tga"
    name="FirstBalanceIncrease"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 00711a29e010fb1cb5506ec5b65497f5d7cc6f00..6480469f43f959323958f96e8d7fba2a46832c23 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -60,11 +60,11 @@
          min_height="28"
          width="104"
          top_delta="0"
-         min_width="104"
+         min_width="54"
          name="speak_panel"
          user_resize="false">
           <talk_button
-           follows="right"
+           follows="left|right"
            height="23"
            speak_button.tab_stop="true"
            show_button.tab_stop="true"
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 58a78a0ab852aefef0059ad5b2d64927a074b510..4c30db4034b24ad5e61d884284ded86bc97cc651 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="all"
-     height="380"
+     height="378"
  label="General"
  class="panel_group_general"
  layout="topleft"
@@ -40,13 +40,13 @@ Hover your mouse over the options for more help.
      column_padding="0"
      draw_heading="true"
      follows="left|top"
-     heading_height="16"
+     heading_height="20"
      height="130"
      layout="topleft"
-     left="5"
+     left="0"
      name="visible_members"
      top_pad="2"
-     width="305">
+     width="310">
         <name_list.columns
          label="Member"
          name="name"
@@ -59,9 +59,9 @@ Hover your mouse over the options for more help.
          <text
          follows="left|top"
          type="string"
-         height="14"
+         height="12"
          layout="topleft"
-         left_delta="0"
+         left="5"
          name="active_title_label"
          top_pad="5"
          width="300">
@@ -75,7 +75,7 @@ Hover your mouse over the options for more help.
          name="active_title"
          tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."
          top_pad="2"
-         width="305" />
+         width="300" />
         <check_box
          height="16"
          font="SansSerifSmall"
@@ -101,12 +101,12 @@ Hover your mouse over the options for more help.
          border="true"
          bg_alpha_color="FloaterUnfocusBorderColor"
          follows="left|top"
-         height="93"
+         height="90"
          layout="topleft"
          left="5"
          name="preferences_container"
          top_pad="5"
-         width="305">
+         width="300">
         <check_box
          follows="right|top"
          height="16"
@@ -140,7 +140,7 @@ Hover your mouse over the options for more help.
          left_pad="2"
          name="spin_enrollment_fee"
          tool_tip="New members must pay this fee to join the group when Enrollment Fee is checked."
-         width="105" />
+         width="100" />
         <check_box
          height="16"
          initial_value="true"
@@ -157,7 +157,7 @@ Hover your mouse over the options for more help.
          left_delta="0"
          name="group_mature_check"
          tool_tip="Sets whether your group information is considered mature"
-         top_pad="5"
+         top_pad="2"
          width="190">
             <combo_box.item
              label="PG Content"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 0082128ca42fd5ea5202f8579501227f3f15f943..c0db734f8c165e3fac37ecb4639b72adef576690 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -2,10 +2,10 @@
 <panel
 background_visible="true"
  follows="all"
- height="570"
+ height="635"
  label="Group Info"
  layout="topleft"
- min_height="425"
+ min_height="460"
  left="0"
  top="20"
  name="GroupInfo"
@@ -116,44 +116,43 @@ background_visible="true"
      visible="true"
      width="120" />
    <accordion
+           single_expansion="true"
              follows="all"
-             height="405"
+             height="478"
              layout="topleft"
              left="0"
              name="groups_accordion"
-             top_pad="15"
+             top_pad="10"
              width="323">
              <accordion_tab
-                 expanded="true"
-                 layout="topleft"
-                 name="group_general_tab"
-                 title="General">
+            expanded="false"
+            layout="topleft"
+            name="group_general_tab"
+            title="General">
             <panel
-            border="false"
-         class="panel_group_general" 
+             border="false"
+             class="panel_group_general"
              filename="panel_group_general.xml"
              layout="topleft"
              left="0"
              help_topic="group_general_tab"
              name="group_general_tab_panel"
-             top="0"
-             width="300" />
+             top="0" />
          </accordion_tab>
          <accordion_tab
-                 expanded="false"
-                 layout="topleft"
-                 name="group_roles_tab"
-                 title="Roles">
-                 <panel
-                 border="false"
-         class="panel_group_roles"
-                  filename="panel_group_roles.xml"
-                  layout="topleft"
-                  left="0"
-                  help_topic="group_roles_tab"
-         name="group_roles_tab_panel"
-                  top="0"
-             width="303" />
+            expanded="true"
+            layout="topleft"
+            name="group_roles_tab"
+            title="Roles">
+            <panel
+            border="false"
+            class="panel_group_roles"
+             filename="panel_group_roles.xml"
+             layout="topleft"
+             left="0"
+             help_topic="group_roles_tab"
+             name="group_roles_tab_panel"
+             top="0" />
          </accordion_tab>
          <accordion_tab
                  expanded="false"
@@ -168,8 +167,7 @@ background_visible="true"
          left="0"
          help_topic="group_notices_tab"
          name="group_notices_tab_panel"
-         top="0"
-         width="303" />
+         top="0" />
          </accordion_tab>
         <accordion_tab
                  expanded="false"
@@ -184,21 +182,25 @@ background_visible="true"
          left="0"
          help_topic="group_land_money_tab"
          name="group_land_tab_panel"
-         top="0"
-         width="300" />
+         top="0" />
          </accordion_tab>
          </accordion>
+   <panel
+   name="button_row"
+   height="23"
+   follows="bottom|left"
+   top_pad="-1"
+   width="323">
    <button
      follows="top|left"
      height="22"
      image_overlay="Refresh_Off"
      layout="topleft"
-     left="5"
+     left="10"
      name="btn_refresh"
-     top_pad="-15"
      width="23" />
-         <button
-     height="20"
+    <button
+     height="22"
      label="Create"
      label_selected="New group"
      name="btn_create"
@@ -214,12 +216,12 @@ background_visible="true"
      visible="false"
      width="65" />-->
      <button
-     height="20"
-     font="SansSerifSmall"
+     height="22"
      label="Save"
      label_selected="Save"
      name="btn_apply"
      left_pad="10"
      right="-10"
-     width="65" />
+     width="100" />
+     </panel>
 </panel>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 2c649642c331f3e200b5846003d0abb6ee1bc0a3..2075d7e05b518abbce55a73d3e0b5f81124a87d7 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -2,7 +2,7 @@
 <panel
  border="false"
  follows="all"
- height="510"
+ height="380"
  label="Land &amp; L$"
  layout="topleft"
  left="0"
@@ -11,7 +11,7 @@
  width="310">
     <panel.string
      name="help_text">
-        Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.
+   A warning appears until the Total Land in Use is less than or = to the Total Contribution.
     </panel.string>
     <panel.string
      name="cant_view_group_land_text">
@@ -43,14 +43,14 @@
     </text> -->
     <scroll_list
      draw_heading="true"
-     follows="top"
+     follows="top|left|right"
      heading_height="20"
-     height="150"
+     height="130"
      layout="topleft"
-     left="2"
+     left="0"
+     top="0"
      name="group_parcel_list"
-     top_pad="0"
-     width="305">
+     width="310">
         <scroll_list.columns
          label="Parcel"
          name="name"
@@ -72,34 +72,22 @@
          name="hidden"
          width="-1" />
     </scroll_list>
-    <button
-     follows="top"
-     height="23"
-     label="Map"
-     label_selected="Map"
-     layout="topleft"
-     name="map_button"
-     right="-5"
-     top_pad="5"
-     width="95"
-     enabled="false" />
     <text
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="total_contributed_land_label"
-     top_pad="0"
      width="130">
-        Total Contribution:
+        Total contribution:
     </text>
     <text
     text_color="EmphasisColor"
      type="string"
      follows="left|top"
-     height="16"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="total_contributed_land_value"
@@ -107,23 +95,34 @@
      width="120">
         [AREA] m²
     </text>
+    <button
+     follows="top"
+     height="20"
+     label="Map"
+     label_selected="Map"
+     layout="topleft"
+     name="map_button"
+     right="-5"
+     left_pad="0"
+     width="95"
+     enabled="false" />
     <text
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="total_land_in_use_label"
      top_pad="0"
      width="130">
-        Total Land In Use:
+        Total land in use:
     </text>
     <text
     text_color="EmphasisColor"
      type="string"
      follows="left|top"
-     height="16"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="total_land_in_use_value"
@@ -135,19 +134,19 @@
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="land_available_label"
      top_pad="0"
      width="130">
-        Land Available:
+        Land available:
     </text>
     <text
     text_color="EmphasisColor"
      type="string"
      follows="left|top"
-     height="16"
+     height="15"
      layout="topleft"
      left_pad="5"
      name="land_available_value"
@@ -159,17 +158,15 @@
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="15"
      layout="topleft"
-     left="5"
+     left="0"
      name="your_contribution_label"
      top_pad="0"
      width="130">
-        Your Contribution:
+        Your contribution:
     </text>
     <line_editor
-     border_style="line"
-     border_thickness="1"
      follows="left|top"
      height="19"
      layout="topleft"
@@ -177,7 +174,7 @@
      max_length="10"
      name="your_contribution_line_editor"
      top_delta="0"
-     width="95" />
+     width="80" />
     <text
      type="string"
      follows="left|top"
@@ -194,7 +191,7 @@
      type="string"
      follows="left|top"
      halign="right"
-     height="16"
+     height="12"
      layout="topleft"
      left="140"
      name="your_contribution_max_value"
@@ -203,27 +200,27 @@
         ([AMOUNT] max)
     </text>
     <icon
-     height="16"
-     image_name="notify_next"
+     height="18"
+     image_name="BuyArrow_Over"
      layout="topleft"
-     left="9"
+     left="75"
      name="group_over_limit_icon"
      top_pad="0"
-     visible="false"
-     width="16" />
+     visible="true"
+     width="18" />
     <text
      follows="left|top"
      type="string"
      word_wrap="true"
      font="SansSerifSmall"
-     height="35"
+     height="20"
      layout="topleft"
-     left_pad="5"
+     left_pad="2"
      name="group_over_limit_text"
      text_color="EmphasisColor"
      top_delta="0"
-     width="260">
-        Group members must contribute more land credits to support land in use
+     width="213">
+        More land credits are needed to support land in use
     </text>
     <text
      type="string"
@@ -231,29 +228,29 @@
      font="SansSerifBig"
      height="16"
      layout="topleft"
-     left="10"
+     left="0"
      name="group_money_heading"
      text_color="EmphasisColor"
-     top_pad="0"
-     width="150">
+     top_pad="-15"
+     width="100">
         Group L$
     </text>
     <tab_container
      follows="all"
-     height="200"
+     height="173"
      halign="center"
      layout="topleft"
-     left="5"
+     left="0"
      name="group_money_tab_container"
      tab_position="top"
      tab_height="20"
      top_pad="2"
-     tab_min_width="70"
-     width="300">
+     tab_min_width="75"
+     width="310">
         <panel
          border="false"
          follows="all"
-         height="180"
+         height="173"
          label="PLANNING"
          layout="topleft"
          left="0"
@@ -264,7 +261,6 @@
             <text_editor
              type="string"
              follows="all"
-             font="SansSerif"
              height="140"
              layout="topleft"
              left="0"
@@ -279,13 +275,13 @@
       <panel
          border="false"
          follows="all"
-         height="180"
+         height="173"
          label="DETAILS"
          layout="topleft"
          left="0"
          help_topic="group_money_details_tab"
          name="group_money_details_tab"
-         top="5"
+         top="0"
          width="300">
           <text_editor
              type="string"
@@ -302,34 +298,34 @@
             </text_editor>
             <button
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Left_Off"
 	     layout="topleft"
 	     name="earlier_details_button"
 	     tool_tip="Back"
-	     top_pad="5"
              right="-45"
-	     width="31" />
+             bottom="0"
+	     width="25" />
              <button
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Right_Off"
 	     layout="topleft"
 	     left_pad="10"
        name="later_details_button"
 	     tool_tip="Next"
-	     width="31" />
+	     width="25" />
         </panel>
       <panel
          border="false"
          follows="all"
-         height="180"
+         height="173"
          label="SALES"
          layout="topleft"
          left_delta="0"
          help_topic="group_money_sales_tab"
          name="group_money_sales_tab"
-         top="5"
+         top="0"
          width="300">
             <text_editor
              type="string"
@@ -345,24 +341,24 @@
                 Loading...
             </text_editor>
                          <button
+             bottom="0"
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Left_Off"
 	     layout="topleft"
 	     name="earlier_sales_button"
 	     tool_tip="Back"
-	     top_pad="5"
          right="-45"
-	     width="31" />
+	     width="25" />
              <button
 	     follows="left|top"
-	     height="23"
+	     height="18"
 	     image_overlay="Arrow_Right_Off"
 	     layout="topleft"
 	     left_pad="10"
          name="later_sales_button"
 	     tool_tip="Next"
-	     width="31" />
+	     width="25" />
         </panel>
     </tab_container>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index e56db6414f91efca6e46928a9f8b8ede51f74469..0dea81eefe068caa55b8c1be1ce66791a36371df 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  follows="all"
- height="485"
+ height="463"
  label="Notices"
  layout="topleft"
  left="0"
@@ -10,11 +10,10 @@
  width="310">
     <panel.string
      name="help_text">
-        Notices are a quick way to communicate across a 
-group by broadcasting a message and delivering 
+        Notices let you send a message and
 an optionally attached item. Notices only go to
-group members in Roles granted the ability to 
-receive Notices. You can turn off Notices on 
+group members in Roles with the ability to
+receive Notices. You can turn off Notices on
 the General tab.
     </panel.string>
     <panel.string
@@ -25,14 +24,15 @@ the General tab.
       follows="left|top"
      type="string"
      word_wrap="true"
-     height="30"
+     height="24"
+     halign="right"
      layout="topleft"
      left="5"
      name="lbl2"
      top="5"
      width="300">
      Notices are kept for 14 days
-Groups are limited to 200 notices/group daily
+Maximum 200 per group daily
     </text>
     <scroll_list
       follows="left|top"
@@ -44,7 +44,7 @@ Groups are limited to 200 notices/group daily
      left="2"
      name="notice_list"
      top_pad="0"
-     width="305">
+     width="300">
         <scroll_list.columns
          label=""
          name="icon"
@@ -52,15 +52,15 @@ Groups are limited to 200 notices/group daily
         <scroll_list.columns
          label="Subject"
          name="subject"
-         width="125" />
+         width="110" />
         <scroll_list.columns
          label="From"
          name="from"
-         width="90" />
+         width="100" />
         <scroll_list.columns
          label="Date"
          name="date"
-         width="30" />
+         width="60" />
         <scroll_list.columns
          name="sort"
          width="-1" />
@@ -84,7 +84,7 @@ Groups are limited to 200 notices/group daily
        left="5"
        name="create_new_notice"
        tool_tip="Create a new notice"
-     top_delta="0"
+     top_delta="-3"
        width="18" />
      <button
      follows="top|left"
@@ -97,14 +97,14 @@ Groups are limited to 200 notices/group daily
      width="23" />
     <panel
      follows="left|top"
-     height="300"
+     height="280"
      label="Create New Notice"
      layout="topleft"
      left="0"
-     top_pad="10"
-     visible="false"
+     top_pad="0"
+     visible="true"
      name="panel_create_new_notice"
-     width="303">
+     width="300">
         <text
          follows="left|top"
          type="string"
@@ -216,31 +216,31 @@ Groups are limited to 200 notices/group daily
          follows="left|top"
          height="23"
          label="Send"
-         label_selected="Send Notice"
+         label_selected="Send"
          layout="topleft"
          right="-10"
          top_pad="10"
          name="send_notice"
          width="100" />
       <group_drop_target
-         height="466"
-         top="0"
-         left="0"
+         height="95"
+         top="160"
+         left="10"
          layout="topleft"
          name="drop_target"
          tool_tip="Drag an inventory item onto the message box to send it with the notice. You must have permission to copy and transfer the object to send it with the notice."
-         width="295" />
-   </panel> 
+         width="280" />
+   </panel>
     <panel
      follows="left|top"
-     height="300"
+     height="280"
      label="View Past Notice"
      layout="topleft"
      left="0"
-     visible="true"
+     visible="false"
      name="panel_view_past_notice"
      top="180"
-     width="303">
+     width="300">
         <text
          type="string"
          font="SansSerifBig"
@@ -303,7 +303,7 @@ Groups are limited to 200 notices/group daily
         </text>
         <text_editor
          enabled="false"
-         height="205"
+         height="160"
          layout="topleft"
          left="10"
          max_length="511"
@@ -319,7 +319,7 @@ Groups are limited to 200 notices/group daily
          max_length="63"
          mouse_opaque="false"
          name="view_inventory_name"
-         top_pad="10"
+         top_pad="8"
          width="285" />
         <icon
          height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index 2e4df92da4505d9c523456eb4d2bb296455b6f6e..9b0b81cd0a2790041e53c474ed4cfc9bcae5ca37 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,8 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
  background_visible="true"
- bevel_style="in"
- bg_alpha_color="0 0 0 0"
  height="90"
  label="instant_message"
  layout="topleft"
@@ -21,8 +19,6 @@
      value="SANSSERIF" />
     <panel
      background_visible="true"
-     bevel_style="in"
-     bg_alpha_color="black"
      follows="top"
      height="30"
      label="header"
@@ -32,7 +28,7 @@
      top="0"
      width="305">
         <icon
-         follows="left|top|right|bottom"
+         follows="all"
          height="20"
          layout="topleft"
          left="5"
@@ -41,8 +37,8 @@
          top="5"
          width="20" />
         <text
-         follows="left|top|right|bottom"
-         font="SansSerifBigBold"
+         follows="all"
+         font="SansSerifBig"
          height="20"
          layout="topleft"
          left_pad="10"
@@ -56,7 +52,7 @@
     <text_editor
      allow_html="true"
      enabled="true"
-     follows="left|top|bottom|right"
+     follows="all"
      height="0"
      layout="topleft"
      left="25"
@@ -69,7 +65,7 @@
      type="string"
      use_ellipses="true"
      value="message"
-     width="270" 
+     width="270"
 	 word_wrap="true" >
     </text_editor>
     <icon
@@ -97,9 +93,9 @@
      bottom="85"
      follows="bottom"
      height="20"
-     label="OK"
+     label="Ok"
      layout="topleft"
-     left="25"
+     right="-10"
      name="btn_ok"
      width="70" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 604fb81c8e740685f0dfb2bd46e00961318fca9c..5bae5c2711a38cb676d8e08e4733f972ab42f58b 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel
- border="false"
+ follows="all"
  height="552"
  label="Members &amp; Roles"
  layout="topleft"
@@ -14,26 +14,27 @@
     </panel.string>
     <panel.string
      name="want_apply_text">
-        Do you want to save these changes?
+        Do you want to save your changes?
     </panel.string>
     <panel.string
      name="help_text" />
     <tab_container
     border="false"
      follows="left|top"
-     height="245"
+     height="552"
      halign="center"
      layout="topleft"
-     left="5"
+     left="0"
      name="roles_tab_container"
      tab_position="top"
      tab_height="20"
      tab_min_width="75"
-     top="3"
-     width="300">
+     top="0"
+     width="310">
         <panel
          border="false"
-         height="220"
+         follows="all"
+         height="303"
          label="MEMBERS"
          layout="topleft"
          left="0"
@@ -41,7 +42,7 @@
          name="members_sub_tab"
          tool_tip="Members"
          class="panel_group_members_subtab"
-         width="300">
+         width="310">
             <panel.string
              name="help_text">
                 You can add or remove Roles assigned to Members.
@@ -50,11 +51,11 @@ clicking on their names.
             </panel.string>
          <filter_editor
          layout="topleft"
-         top="10"
+         top="5"
          left="5"
          width="280"
          height="20"
-         follows="left|top|right"
+         follows="top"
          max_length="250"
          label="Filter Members"
          name="filter_input" />
@@ -62,7 +63,7 @@ clicking on their names.
              column_padding="0"
              draw_heading="true"
              heading_height="20"
-             height="160"
+             height="240"
              follows="left|top"
              layout="topleft"
              left="0"
@@ -73,30 +74,26 @@ clicking on their names.
                 <name_list.columns
                  label="Member"
                  name="name"
-               relative_width="0.45" />
+               relative_width="0.44" />
                 <name_list.columns
-                 label="Donations"
+                 label="Donation"
                  name="donated"
-         relative_width="0.3" />
+         relative_width="0.25" />
                 <name_list.columns
-                 label="Online"
+                 label="Status"
                  name="online"
-         relative_width="0.2" />
+         relative_width="0.15" />
             </name_list>
             <button
              height="20"
-             font="SansSerifSmall"
+             follows="bottom|left"
              label="Invite"
-             layout="topleft"
              left="5"
              name="member_invite"
-             top_pad="3"
              width="100" />
             <button
              height="20"
-             font="SansSerifSmall"
              label="Eject"
-             layout="topleft"
              left_pad="5"
              right="-5"
              name="member_eject"
@@ -104,14 +101,23 @@ clicking on their names.
         </panel>
         <panel
          border="false"
-         height="220"
+         height="230"
          label="ROLES"
          layout="topleft"
          left="0"
          help_topic="roles_roles_tab"
          name="roles_sub_tab"
          class="panel_group_roles_subtab"
-         width="300">
+         width="310">
+           <!-- <button
+             enabled="false"
+             height="20"
+             label="Show All"
+             layout="topleft"
+             top="-65"
+             right="-5"
+             name="show_all_button"
+             width="100" />-->
             <panel.string
              name="help_text">
                 Roles have a title and an allowed list of Abilities
@@ -121,7 +127,7 @@ including the Everyone and Owner Roles.
             </panel.string>
             <panel.string
              name="cant_delete_role">
-                The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and cannot be deleted.
+                The &apos;Everyone&apos; and &apos;Owners&apos; Roles are special and can't be deleted.
             </panel.string>
             <panel.string
              name="power_folder_icon">
@@ -129,15 +135,15 @@ including the Everyone and Owner Roles.
             </panel.string>
             <panel.string
              name="power_all_have_icon">
-                checkbox_enabled_true.tga
+                Checkbox_On
             </panel.string>
             <panel.string
              name="power_partial_icon">
-                checkbox_enabled_false.tga
+                Checkbox_Off
             </panel.string>
          <filter_editor
          layout="topleft"
-         top="10"
+         top="5"
          left="5"
          width="280"
          height="20"
@@ -145,61 +151,48 @@ including the Everyone and Owner Roles.
          max_length="250"
          label="Filter Roles"
          name="filter_input" />
-            <!--
-            <button
-             enabled="false"
-             height="20"
-             label="Show All"
-             layout="topleft"
-             left_pad="0"
-             name="show_all_button"
-             top_delta="0"
-             width="80" /> -->
             <scroll_list
              column_padding="0"
              draw_heading="true"
              draw_stripes="false"
              follows="left|top"
              heading_height="20"
-             height="160"
+             height="170"
              layout="topleft"
              search_column="1"
              left="0"
              name="role_list"
              top_pad="2"
-             width="300">
+             width="310">
                 <scroll_list.columns
                  label="Role"
                  name="name"
-                 width="80" />
+               relative_width="0.45"  />
                 <scroll_list.columns
                  label="Title"
                  name="title"
-                 width="90" />
+               relative_width="0.45"  />
                 <scroll_list.columns
-                 label="Members"
+                 label="#"
                  name="members"
-                 width="95" />
+               relative_width="0.15"  />
             </scroll_list>
             <button
+            follows="bottom|left"
              height="20"
-             font="SansSerifSmall"
-             label="Add Role"
+             label="New Role"
              layout="topleft"
              left="5"
              name="role_create"
-             top_pad="6"
-             width="125" />
+             width="100" />
             <button
              height="20"
-             font="SansSerifSmall"
              label="Delete Role"
              layout="topleft"
              left_pad="5"
              right="-5"
              name="role_delete"
-             top_delta="0"
-             width="125" />
+             width="100" />
         </panel>
         <panel
          border="false"
@@ -211,7 +204,7 @@ including the Everyone and Owner Roles.
          name="actions_sub_tab"
          class="panel_group_actions_subtab"
          tool_tip="You can view an Ability&apos;s Description and which Roles and Members can execute the Ability."
-         width="300">
+         width="310">
             <panel.string
              name="help_text">
                 Abilities allow Members in Roles to do specific
@@ -219,7 +212,7 @@ things in this group. There&apos;s a broad variety of Abilities.
             </panel.string>
          <filter_editor
          layout="topleft"
-         top="10"
+         top="5"
          left="5"
          width="280"
          height="20"
@@ -231,74 +224,63 @@ things in this group. There&apos;s a broad variety of Abilities.
              column_padding="0"
              draw_stripes="false"
              follows="left|top"
-             height="160"
+             height="200"
              layout="topleft"
              left="0"
              multi_select="true"
              name="action_list"
              search_column="1"
              tool_tip="Select an Ability to view more details"
-             top_pad="2"
+             top_pad="5"
              width="300">
                 <scroll_list.columns
-                 label=""
-                 name="icon"
-                 width="16" />
-                <scroll_list.columns
-                 label="Action"
                  name="action"
-                 width="247" />
+                 width="300" />
             </scroll_list>
-            <icon
-             height="16"
-             image_name="Inv_FolderClosed"
-             layout="topleft"
-             name="power_folder_icon"
-             visible="false"
-             width="16" />
         </panel>
     </tab_container>
     <panel
      height="252"
      layout="topleft"
      follows="left|top"
-     left="10"
+     left="0"
+     mouse_opaque="false" 
      name="members_footer"
-     top="245"
-     top_delta="0"
-     width="290">
+     top="300"
+     visible="false"
+     width="310">
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static"
          top_pad="5"
-         width="285">
+         width="300">
             Assigned Roles
         </text>
         <scroll_list
-         draw_stripes="false"
+         draw_stripes="true"
          follows="left|top"
-         height="80"
+         height="90"
          layout="topleft"
          left="0"
          name="member_assigned_roles"
          top_pad="0"
-         width="285">
+         width="300">
             <scroll_list.columns
              label=""
              name="checkbox"
-             width="30" />
+             width="20" />
             <scroll_list.columns
              label=""
              name="role"
-             width="255" />
+             width="270" />
         </scroll_list>
                  <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          follows="left|top"
          left="0"
@@ -308,48 +290,42 @@ things in this group. There&apos;s a broad variety of Abilities.
             Allowed Abilities
         </text>
          <scroll_list
-         draw_stripes="false"
-         height="80"
+         draw_stripes="true"
+         height="90"
          layout="topleft"
          left="0"
          name="member_allowed_actions"
          search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
          top_pad="0"
-         width="285">
-            <scroll_list.columns
-             label=""
-             name="icon"
-             width="20" />
+         width="300">
             <scroll_list.columns
              label=""
              name="action"
-             width="265" />
+             width="300" />
         </scroll_list>
     </panel>
     <panel
      height="297"
      layout="topleft"
-     left="10"
+     left="0"
      name="roles_footer"
      top_delta="0"
-     top="245"
+     top="220"
      visible="false"
-     width="290">
+     width="310">
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          left="0"
          name="static"
          top="0"
-         width="140">
-            Name
+         width="300">
+           Role Name
         </text>
         <line_editor
          type="string"
-         border_style="line"
-         border_thickness="1"
          follows="left|top"
          height="20"
          layout="topleft"
@@ -357,106 +333,97 @@ things in this group. There&apos;s a broad variety of Abilities.
          max_length="295"
          name="role_name"
          top_pad="0"
-         width="290">
-            Employees
+         width="300">
         </line_editor>
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          name="static3"
          top_pad="5"
-         width="290">
-            Title
+         width="300">
+           Role Title
         </text>
         <line_editor
          type="string"
-         border_style="line"
-         border_thickness="1"
          follows="left|top"
          height="20"
          layout="topleft"
          max_length="295"
          name="role_title"
          top_pad="0"
-         width="290">
-          (waiting)
+         width="300">
         </line_editor>
                 <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          left="0"
          name="static2"
          top_pad="5"
-         width="100">
+         width="200">
             Description
         </text>
         <text_editor
          type="string"
          halign="left"
-         height="35"
+         height="50"
          layout="topleft"
          left="0"
          max_length="295"
          name="role_description"
          top_pad="0"
-         width="295"
+         width="300"
          word_wrap="true">
-          (waiting)
         </text_editor>
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static4"
          top_pad="5"
-         width="290">
-            Assigned Roles
+         width="300">
+            Assigned Members
         </text>
         <name_list
-         draw_stripes="false"
-         height="50"
+         draw_stripes="true"
+         height="60"
          layout="topleft"
          left="0"
          name="role_assigned_members"
          top_pad="0"
-         width="290" />
+         width="300" />
         <check_box
          height="15"
          label="Reveal members"
          layout="topleft"
          name="role_visible_in_list"
          tool_tip="Sets whether members of this role are visible in the General tab to people outside of the group."
-         top_pad="3"
-         width="290" />
+         top_pad="4"
+         width="300" />
          <text
          type="string"
-         height="16"
+         height="13"
          layout="topleft"
          follows="left|top"
          left="0"
          name="static5"
          top_pad="5"
-         width="290">
+         width="300">
             Allowed Abilities
         </text>
         <scroll_list
-         draw_stripes="false"
-         height="50"
+         draw_stripes="true"
+         height="60"
          layout="topleft"
          left="0"
          name="role_allowed_actions"
          search_column="2"
          tool_tip="For details of each allowed ability see the abilities tab"
          top_pad="0"
-         width="295">
-            <scroll_list.columns
-             label=""
-             name="icon"
-             width="20" />
+         width="300">
             <scroll_list.columns
              label=""
              name="checkbox"
@@ -464,33 +431,27 @@ things in this group. There&apos;s a broad variety of Abilities.
             <scroll_list.columns
              label=""
              name="action"
-             width="250" />
+             width="270" />
         </scroll_list>
     </panel>
    <panel
      height="303"
      layout="topleft"
-     left="10"
+     left="0"
      name="actions_footer"
      top_delta="0"
-     top="245"
+     top="255"
      visible="false"
-     width="290">
-        <text
-         type="string"
-         height="16"
-         layout="topleft"
-         name="static"
-         width="200">
-            Ability description
-        </text>
+     width="310">
         <text_editor
+       bg_readonly_color="Transparent"
+       text_readonly_color="EmphasisColor"
+       font="SansSerifSmall"
          type="string"
          enabled="false"
          halign="left"
-         height="80"
+         height="90"
          layout="topleft"
-         left_delta="0"
          max_length="512"
          name="action_description"
          top_pad="0"
@@ -500,28 +461,28 @@ things in this group. There&apos;s a broad variety of Abilities.
         </text_editor>
         <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
-         left_delta="0"
+         left="5"
          name="static2"
          top_pad="5"
-         width="295">
+         width="300">
             Roles with this ability
         </text>
         <scroll_list
-         height="60"
+         height="65"
          layout="topleft"
-         left="0"
+         left="5"
          name="action_roles"
          top_pad="0"
-         width="295" />
-                 <text
+         width="300" />
+        <text
          type="string"
-         height="16"
+         height="14"
          layout="topleft"
          name="static3"
          top_pad="5"
-         width="290">
+         width="300">
             Members with this ability
         </text>
         <name_list
@@ -529,6 +490,6 @@ things in this group. There&apos;s a broad variety of Abilities.
          layout="topleft"
          name="action_members"
          top_pad="0"
-         width="290" />
+         width="300" />
     </panel>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index 5a4b0a3892d2f387eca5570209dd999b99546c48..fac0d5c60f0521a0b354bd72e2f87cac15a62bc2 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -309,4 +309,13 @@
      name="send_im_to_email"
      top_pad="5"
      width="400" />
+    <check_box
+     enabled="false"
+     height="16"
+     label="Enable plain text chat history"
+     layout="topleft"
+     left_delta="0"
+     name="plain_text_chat_history"
+     top_pad="5"
+     width="400" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index 1b9a99f90b05fa2b64cace21a8b05ba50829f345..23832ba120b728cc7e9090681b6c22ecc68922a6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -86,7 +86,16 @@
      name="autoplay_enabled"
      top_pad="10"
      width="350" />
-    <text
+    <check_box
+     control_name="ParcelMediaAutoPlayEnable"
+     height="16"
+     label="Automatically Play Parcel Media"
+     layout="topleft"
+     left="30"
+     name="parcel_autoplay_enabled"
+     top_pad="10"
+     width="350" />
+   <text
       type="string"
     length="1"
     follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 98025e28db84736afab3f161352cb2ce4e66f223..88049fe7d1138970edb818b00f6fccd638546a69 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -8,6 +8,7 @@
 	mouse_opaque="false"
 	width="800">
   <string name="control_background_image_name">Inspector_Background</string>
+  <string name="skip_step">0.2</string>
   <panel
 	  name="media_region"
 	  bottom="125"
@@ -86,7 +87,7 @@
 		  auto_resize="false"
 		  height="22"
 		  layout="topleft"
-		  tool_tip="Step back"
+		  tool_tip="Navigate back"
 		  width="22"
 		  left="0"
 		  top_delta="4">
@@ -111,7 +112,7 @@
 		  hover_glow_amount="0.15"
 		  height="22"
 		  layout="topleft"
-		  tool_tip="Step forward"
+		  tool_tip="Navigate forward"
 		  top_delta="0"
 		  min_width="22"
 		  width="22">
@@ -165,7 +166,7 @@
 		  min_width="22"
 		  width="22">
 		<button.commit_callback
-			function="MediaCtrl.Stop" />
+			function="MediaCtrl.MediaStop" />
 	  </button>
 	</layout_panel>
 	<layout_panel
@@ -359,6 +360,55 @@ function="MediaCtrl.CommitURL" />
 			function="MediaCtrl.JumpProgress" />
 	  </slider_bar>
 	</layout_panel>
+	<layout_panel
+		name="skip_back"
+		auto_resize="false"
+		user_resize="false"
+		layout="topleft"
+		min_width="22"
+		width="22">
+	  <button
+		  image_overlay="SkipBackward_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
+		  auto_resize="false"
+		  height="22"
+		  layout="topleft"
+		  tool_tip="Step back"
+		  top="-14"
+		  width="22"
+		  left="0">
+		<button.commit_callback
+			function="MediaCtrl.SkipBack" />
+	  </button>
+	</layout_panel>
+	<layout_panel
+		name="skip_forward"
+		auto_resize="false"
+		user_resize="false"
+		layout="topleft"
+		min_width="22"
+		width="22">
+	  <button
+		  image_overlay="SkipForward_Off"
+		  image_disabled="PushButton_Disabled"
+		  image_disabled_selected="PushButton_Disabled"
+		  image_selected="PushButton_Selected"
+		  image_unselected="PushButton_Off"
+		  hover_glow_amount="0.15"
+		  height="22"
+		  layout="topleft"
+		  tool_tip="Step forward"
+		  top="-14"
+		  min_width="22"
+		  width="22">
+		<button.commit_callback
+			function="MediaCtrl.SkipForward" />
+	  </button>
+	</layout_panel>
 	<layout_panel
 		name="media_volume"
 		auto_resize="false"
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 5110b6b2ef5768b9e817d961f0ae85d5b45010a2..bf1d46451bc9aa5c8c2dbd717a5d082a338dc0a9 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -27,7 +27,8 @@
     <string
      name="no_partner_text"
      value="None" />
- <scroll_container
+    <string name="RegisterDateFormat">[REG_DATE] ([AGE])</string>
+  <scroll_container
      color="DkGray2"
      follows="all"
      height="485"
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index add1476179191b8e1e3b021b91fddc1f275cb4b4..e25ff0d548503e4c47db38b5f0d277bebd58c468 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -81,7 +81,7 @@ regions in the estate.
     <view_border
      bevel_style="in"
      follows="top|left"
-     height="290"
+     height="310"
      layout="topleft"
      left_delta="-4"
      top_pad="5"
@@ -185,48 +185,48 @@ regions in the estate.
      follows="left|top"
      height="20"
      layout="topleft"
-     left="10"
+     left="15"
      name="abuse_email_text"
-     top_pad="5"
+     top_pad="10"
      width="180">
         Abuse email address:
     </text>
     <line_editor
      follows="top|left"
-     height="19"
+     height="23"
      layout="topleft"
      left="15"
      name="abuse_email_address"
-     top_pad="5"
-     width="205" />
+     top_pad="-5"
+     width="230" />
     <button
      enabled="false"
      follows="left|top"
-     height="20"
+     height="23"
      label="Apply"
      layout="topleft"
      name="apply_btn"
-     right="250"
-     top_pad="4"
-     width="90" />
+     top_pad="10"
+     left="78"
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Send Message To Estate..."
      layout="topleft"
-     left="8"
+     left="50"
      name="message_estate_btn"
-     top_pad="5"
-     width="250" />
+     top_pad="20"
+     width="160" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Kick User from Estate..."
      layout="topleft"
-     left="8"
+     left="50"
      name="kick_user_from_estate_btn"
      top_pad="5"
-     width="250" />
+     width="160" />
 
     <text
      type="string"
@@ -243,14 +243,14 @@ regions in the estate.
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -259,22 +259,22 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_estate_manager_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_estate_manager_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
     <text
      type="string"
      length="1"
@@ -283,21 +283,21 @@ regions in the estate.
      layout="topleft"
      left_delta="0"
      name="allow_resident_label"
-     top_pad="5"
+     top_pad="10"
      width="200">
         Allowed Residents:
     </text>
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -306,22 +306,22 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_allowed_avatar_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_allowed_avatar_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
     <text
      type="string"
      length="1"
@@ -330,21 +330,21 @@ regions in the estate.
      layout="topleft"
      left_delta="0"
      name="allow_group_label"
-     top_pad="5"
+     top_pad="10"
      width="200">
         Allowed Groups:
     </text>
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -353,22 +353,22 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_allowed_group_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_allowed_group_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
     <text
      type="string"
      length="1"
@@ -377,21 +377,21 @@ regions in the estate.
      layout="topleft"
      left_delta="0"
      name="ban_resident_label"
-     top_pad="5"
+     top_pad="10"
      width="200">
         Banned Residents:
     </text>
     <view_border
      bevel_style="none"
      follows="top|left"
-     height="60"
+     height="71"
      layout="topleft"
      right="470"
-     top_pad="5"
+     top_pad="-5"
      width="200" />
     <name_list
      follows="left|top"
-     height="60"
+     height="71"
      layout="topleft"
      left_delta="0"
      multi_select="true"
@@ -400,20 +400,20 @@ regions in the estate.
      width="200" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Remove..."
      layout="topleft"
      name="remove_banned_avatar_btn"
      right="470"
      top_pad="5"
-     width="90" />
+     width="97" />
     <button
      follows="left|top"
-     height="20"
+     height="23"
      label="Add..."
      layout="topleft"
-     left_delta="-110"
+     left_delta="-103"
      name="add_banned_avatar_btn"
      top_delta="0"
-     width="90" />
+     width="97" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 041297a542fead2d38855d796af1cb12b70874a0..b9a89a2ebcc7ea76fd6ecb8e1df8b1e545858438 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -9,9 +9,9 @@
 	  min_width="240"
 	  name="appearance panel"
 	  width="333">
-     <string
-		 name="looks_tab_title"
-		 value="Outfits" />
+	 <string
+      name="No Outfit"
+	  value="No Outfit" />
      <panel
 		 left="5" width="320" height="55"
 		 background_visible="true"
@@ -19,25 +19,34 @@
 		 bg_alpha_color="0.2 0.2 0.2 1.0"
 		 name="panel_currentlook"
 		 follows="left|top|right">
+  	    <button
+  	     	 follows="left|right|top"
+  	     	 font="SansSerif"
+  	     	 top="28" right="-10" width="60" height="20"
+  	     	 layout="topleft"
+  		 	 label="Edit"
+  	     	 name="editappearance_btn"/>
+        <button
+	     follows="left|right|top"
+		 top="28" left="5" width="25" height="22"
+	     image_overlay="Inv_LookFolderOpen"
+	     layout="topleft"
+		 name="openoutfit_btn"
+	     picture_style="true" />
 		<text
-			 top="-5" width="200" left="5" height="10" follows="left|right|top"
+			 top="10" width="150" left="5" height="15" follows="left|right|top"
+			 layout="topleft"
         	 font="SansSerif" text_color="LtGray" word_wrap="true"
         	 mouse_opaque="false" name="currentlook_title">
-					Current Outfit
+					Current Outfit:
     	</text>
   		<text
-			 top="-30" left="8" height="10" follows="left|right|top"
+			 top="32" width="150" left="32" height="15" follows="left|right|top"
+			 layout="topleft"
       		 font="SansSerifBold" text_color="white" word_wrap="true"
       		 mouse_opaque="false" name="currentlook_name" >
 					MyOutfit
   		</text>
-  	    <button
-  	     	 follows="left|right|top"
-  	     	 font="SansSerif"
-  	     	 top="28" right="-105" width="60" height="20"
-  	     	 layout="topleft"
-  		 	 label="Edit"
-  	     	 name="editappearance_btn"/>
 	</panel>
 
     <filter_editor
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index e76763d7ebce0ad37c67e76fb8ad7727ad7d8c40..90fb3a6bf990dfc6af9fbd526ed890cdb728332a 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <!-- This file contains strings that used to be hardcoded in the source.
      It is only for those strings which do not belong in a floater.
-     For example, the strings used in avatar chat bubbles, and strings 
+     For example, the strings used in avatar chat bubbles, and strings
      that are returned from one component and may appear in many places-->
 <strings>
 
@@ -44,8 +44,8 @@
 
 	<!-- Disconnection -->
 	<string name="AgentLostConnection">This region may be experiencing trouble.  Please check your connection to the Internet.</string>
-	
-	
+
+
 	<!-- Tooltip, lltooltipview.cpp -->
 	<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
 	<string name="TooltipNoName">(no name)</string> <!-- No name on an object -->
@@ -80,11 +80,11 @@
 	<!-- text for SLURL labels -->
 	<string name="SLurlLabelTeleport">Teleport to</string>
 	<string name="SLurlLabelShowOnMap">Show Map for</string>
-	
+
 	<!-- ButtonToolTips, llfloater.cpp -->
 	<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
 	<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
-	<string name="BUTTON_RESTORE">Restore</string>			
+	<string name="BUTTON_RESTORE">Restore</string>
 	<string name="BUTTON_MINIMIZE">Minimize</string>
 	<string name="BUTTON_TEAR_OFF">Tear Off</string>
 	<string name="BUTTON_DOCK">Dock</string>
@@ -103,24 +103,24 @@
 
 	<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
 	<string name="LoadingData">Loading...</string>
-	
-	
+
+
 	<!-- namecache -->
 	<!-- Avatar name: text shown for LLUUID::null -->
 	<string name="AvatarNameNobody">(nobody)</string>
-	
+
 	<!-- Avatar name: text shown while fetching name -->
 	<string name="AvatarNameWaiting">(waiting)</string>
 
   <!-- Avatar name: More than one avatar is selected/used here -->
   <string name="AvatarNameMultiple">(multiple)</string>
-  
+
   <!-- Avatar name: text shown as an alternative to AvatarNameFetching, easter egg. -->
 	<string name="AvatarNameHippos">(hippos)</string>
-	
+
 	<!-- Group name: text shown for LLUUID::null -->
 	<string name="GroupNameNone">(none)</string>
-	
+
 	<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
 	<string name="AssetErrorNone">No error</string>
 	<string name="AssetErrorRequestFailed">Asset request: failed</string>
@@ -133,7 +133,7 @@
 	<string name="AssetErrorCircuitGone">Circuit gone</string>
 	<string name="AssetErrorPriceMismatch">Viewer and server do not agree on price</string>
 	<string name="AssetErrorUnknownStatus">Unknown status</string>
-	
+
 	<!-- Asset Type human readable names:  these will replace variable [TYPE] in notification FailedToFindWearable* -->
 	<string name="texture">texture</string>
 	<string name="sound">sound</string>
@@ -159,7 +159,7 @@
 	<string name="simstate">simstate</string>
 	<string name="favorite">favorite</string>
 	<string name="symbolic link">link</string>
-	
+
 	<!-- llvoavatar. Displayed in the avatar chat bubble -->
 	<string name="AvatarEditingAppearance">(Editing Appearance)</string>
 	<string name="AvatarAway">Away</string>
@@ -236,17 +236,17 @@
 	<string name="anim_express_worry">Worry</string>
 	<string name="anim_yes_happy">Yes (Happy)</string>
 	<string name="anim_yes_head">Yes</string>
-	
+
 	<!-- world map -->
 	<string name="texture_loading">Loading...</string>
 	<string name="worldmap_offline">Offline</string>
 	<string name="worldmap_results_none_found">None found.</string>
-	
+
 	<!-- animations uploading status codes -->
 	<string name="Ok">OK</string>
 	<string name="Premature end of file">Premature end of file</string>
 	<string name="ST_NO_JOINT">Can't find ROOT or JOINT.</string>
-	
+
 	<!-- Chat -->
 	<string name="whisper">whispers:</string>
 	<string name="shout">shouts:</string>
@@ -274,7 +274,7 @@
 	<string name="SIM_ACCESS_ADULT">Adult</string>
 	<string name="SIM_ACCESS_DOWN">Offline</string>
 	<string name="SIM_ACCESS_MIN">Unknown</string>
-	
+
 	<!-- For use when we do not have land type back from the server -->
 	<string name="land_type_unknown">(unknown)</string>
 
@@ -294,14 +294,14 @@
 	<string name="compressed_image_files">Compressed Images</string>
 	<string name="load_files">Load Files</string>
 	<string name="choose_the_directory">Choose Directory</string>
-	
+
 	<!-- LSL Usage Hover Tips -->
 	<!-- NOTE: For now these are set as translate="false", until DEV-40761 is implemented (to internationalize the rest of tooltips in the same window).
              This has no effect on viewer code, but prevents Linden Lab internal localization tool from scraping these strings.  -->
 	<string name="LSLTipSleepTime" translate="false">
 Sleeps script for [SLEEP_TIME] seconds.
 	</string>
-	
+
 	<string name="LSLTipText_llSin" translate="false">
 float llSin(float theta)
 Returns the sine of theta (theta in radians)
@@ -1732,7 +1732,7 @@ Returns the value for header for request_id
 	</string>
   <string name="LSLTipText_llSetPrimMediaParams" translate="false">
 llSetPrimMediaParams(integer face, list params)
-Sets the media params for a particular face on an object. If media is not already on this object, add it. 
+Sets the media params for a particular face on an object. If media is not already on this object, add it.
 List is a set of name/value pairs in no particular order.  Params not specified are unchanged, or if new media is added then set to the default specified.
 The possible names are below, along with the types of values and what they mean.
   </string>
@@ -1751,7 +1751,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="AvatarSetAway">Away</string>
 	<string name="AvatarSetNotBusy">Not Busy</string>
 	<string name="AvatarSetBusy">Busy</string>
-	
+
 	<!-- Wearable Types -->
 	<string name="shape">Shape</string>
 	<string name="skin">Skin</string>
@@ -1769,7 +1769,7 @@ Clears (deletes) the media and all params from the given face.
 	<string name="alpha">Alpha</string>
 	<string name="tattoo">Tattoo</string>
 	<string name="invalid">invalid</string>
-	
+
 	<!-- notify -->
 	<string name="next">Next</string>
 	<string name="ok">OK</string>
@@ -1782,12 +1782,11 @@ Clears (deletes) the media and all params from the given face.
 	<string name="GroupNotifySaveAttachment">Save Attachment</string>
   <string name="TeleportOffer">Teleport offering</string>
   <!-- start-up toast's string-->
-  <string name="StartUpNotification">%d new notification arrived while you were away...</string>
-  <string name="StartUpNotifications">%d new notifications arrived while you were away...</string>
+  <string name="StartUpNotifications">New notifications arrived while you were away.</string>
   <!-- overflow toast's string-->
   <string name="OverflowInfoChannelString">You have %d more notification</string>
-  
-  
+
+
 	<!-- body parts -->
 	<string name="BodyPartsRightArm">Right Arm</string>
 	<string name="BodyPartsHead">Head</string>
@@ -1800,10 +1799,10 @@ Clears (deletes) the media and all params from the given face.
 	<string name="GraphicsQualityLow">Low</string>
 	<string name="GraphicsQualityMid">Mid</string>
 	<string name="GraphicsQualityHigh">High</string>
-	
+
 	<!-- mouselook -->
 	<string name="LeaveMouselook">Press ESC to return to World View</string>
-	
+
 	<!-- inventory -->
 	<string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
 	<string name="InventoryNoTexture">
@@ -1831,7 +1830,7 @@ this texture in your inventory
 	<string name="Wave"          value=" Wave " />
 	<string name="HelloAvatar"   value=" Hello, avatar! " />
 	<string name="ViewAllGestures"  value="  View All &gt;&gt;" />
-				
+
 	<!-- inventory filter -->
     <!-- use value="" because they have preceding spaces -->
 	<string name="Animations"    value=" Animations," />
@@ -1881,21 +1880,21 @@ this texture in your inventory
 	<!-- inventory FVBridge -->
 	<string name="Buy">Buy</string>
 	<string name="BuyforL$">Buy for L$</string>
-	
+
 	<string name="Stone">Stone</string>
 	<string name="Metal">Metal</string>
 	<string name="Glass">Glass</string>
 	<string name="Wood">Wood</string>
 	<string name="Flesh">Flesh</string>
 	<string name="Plastic">Plastic</string>
-	<string name="Rubber">Rubber</string>	
+	<string name="Rubber">Rubber</string>
 	<string name="Light">Light</string>
-	
+
 	<!-- keyboard -->
 	<string name="KBShift">Shift</string>
 	<string name="KBCtrl">Ctrl</string>
 
-	<!-- Avatar Skeleton --> 
+	<!-- Avatar Skeleton -->
 	<string name="Chest">Chest</string>
 	<string name="Skull">Skull</string>
 	<string name="Left Shoulder">Left Shoulder</string>
@@ -1925,7 +1924,7 @@ this texture in your inventory
 	<string name="L Lower Leg">L Lower Leg</string>
 	<string name="Stomach">Stomach</string>
 	<string name="Left Pec">Left Pec</string>
-	<string name="Right Pec">Right Pec</string>	
+	<string name="Right Pec">Right Pec</string>
 
   <!-- Avatar age computation, see LLDateUtil::ageFromDate -->
   <string name="YearsMonthsOld">[AGEYEARS] [AGEMONTHS] old</string>
@@ -1934,7 +1933,7 @@ this texture in your inventory
   <string name="WeeksOld">[AGEWEEKS] old</string>
   <string name="DaysOld">[AGEDAYS] old</string>
   <string name="TodayOld">Joined today</string>
-  
+
   <!-- AgeYearsA = singular,
        AgeYearsB = plural,
        AgeYearsC = plural for non-English languages like Russian
@@ -1967,16 +1966,16 @@ this texture in your inventory
   <string name="NoPaymentInfoOnFile">No Payment Info On File</string>
   <string name="AgeVerified">Age-verified</string>
   <string name="NotAgeVerified">Not Age-verified</string>
-  
-  <!-- HUD Position --> 
-	<string name="Center 2">Center 2</string>	
-	<string name="Top Right">Top Right</string>	
-	<string name="Top">Top</string>	
-	<string name="Top Left">Top Left</string>	
-	<string name="Center">Center</string>	
-	<string name="Bottom Left">Bottom Left</string>	
-	<string name="Bottom">Bottom</string>		
-	<string name="Bottom Right">Bottom Right</string>							
+
+  <!-- HUD Position -->
+	<string name="Center 2">Center 2</string>
+	<string name="Top Right">Top Right</string>
+	<string name="Top">Top</string>
+	<string name="Top Left">Top Left</string>
+	<string name="Center">Center</string>
+	<string name="Bottom Left">Bottom Left</string>
+	<string name="Bottom">Bottom</string>
+	<string name="Bottom Right">Bottom Right</string>
 
 	<!-- compile queue-->
 	<string name="CompileQueueDownloadedCompiling">Downloaded, now compiling</string>
@@ -1998,11 +1997,11 @@ this texture in your inventory
 	<string name="CompileSuccessful">Compile successful!</string>
 	<string name="CompileSuccessfulSaving">Compile successful, saving...</string>
 	<string name="SaveComplete">Save complete.</string>
-	<string name="ObjectOutOfRange">Script (object out of range)</string>    
-	
+	<string name="ObjectOutOfRange">Script (object out of range)</string>
+
 	<!-- god tools -->
 	<string name="GodToolsObjectOwnedBy">Object [OBJECT] owned by [OWNER]</string>
-	
+
 	<!-- groups -->
 	<string name="GroupsNone">none</string>
   <string name="Group" value=" (group)" />
@@ -2013,14 +2012,14 @@ this texture in your inventory
 	<string name="Balance">Balance</string>
 	<string name="Credits">Credits</string>
 	<string name="Debits">Debits</string>
-	<string name="Total">Total</string>	
-	<string name="NoGroupDataFound">No group data found for group </string>	
-		
+	<string name="Total">Total</string>
+	<string name="NoGroupDataFound">No group data found for group </string>
+
 	<!-- floater IM -->
 	<string name="IMParentEstate">parent estate</string>
 	<string name="IMMainland">mainland</string>
 	<string name="IMTeen">teen</string>
-	
+
 	<!-- floater region info -->
 	<!-- The following will replace variable [ALL_ESTATES] in notifications EstateAllowed*, EstateBanned*, EstateManager* -->
 	<string name="RegionInfoError">error</string>
@@ -2036,45 +2035,37 @@ this texture in your inventory
 
 	<!-- script editor -->
 	<string name="CursorPos">Line [LINE], Column [COLUMN]</string>
-	
+
 	<!-- panel dir browser -->
 	<string name="PanelDirCountFound">[COUNT] found</string>
 	<string name="PanelDirTimeStr">[hour12,datetime,slt]:[min,datetime,slt] [ampm,datetime,slt]</string>
 
 	<!-- panel dir events -->
 	<string name="PanelDirEventsDateText">[mthnum,datetime,slt]/[day,datetime,slt]</string>
-	
+
 	<!-- panel contents -->
 	<string name="PanelContentsNewScript">New Script</string>
-	
+
 	<!-- Mute -->
 	<string name="MuteByName">(by name)</string>
 	<string name="MuteAgent">(resident)</string>
 	<string name="MuteObject">(object)</string>
 	<string name="MuteGroup">(group)</string>
-	
+
 	<!-- Region/Estate Covenant -->
 	<string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string>
 	<string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab.  Please contact the Estate Owner for sales details.</string>
 	<string name="covenant_last_modified">Last Modified:</string>
 	<string name="none_text"  value=" (none) " />
 	<string name="never_text" value=" (never) " />
-	
+
 	<!--Region Details-->
 	<string name="GroupOwned">Group Owned</string>
 	<string name="Public">Public</string>
-	
+
 	<!-- panel classified -->
 	<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
 	<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
-	
-	<!-- group voting dialog -->
-	<string name="GroupVoteYes">Yes</string>
-	<string name="GroupVoteNo">No</string>
-	<string name="GroupVoteNoActiveProposals">There are currently no active proposals</string>
-	<string name="GroupVoteNoArchivedProposals">There are currently no archived proposals</string>
-	<string name="GroupVoteRetrievingArchivedProposals">Retrieving archived proposals</string>
-	<string name="GroupVoteRetrievingActiveProposals">Retrieving active proposals</string>
 
 	<!-- Multi Preview Floater -->
 	<string name="MultiPreviewTitle">Preview</string>
@@ -2089,7 +2080,7 @@ this texture in your inventory
 	<string name="InvOfferGaveYou">gave you</string>
 	<string name="InvOfferYouDecline">You decline</string>
 	<string name="InvOfferFrom">from</string>
-	
+
 	<!-- group money -->
 	<string name="GroupMoneyTotal">Total</string>
 	<string name="GroupMoneyBought">bought</string>
@@ -2101,21 +2092,21 @@ this texture in your inventory
 	<string name="GroupMoneyBalance">Balance</string>
 	<string name="GroupMoneyCredits">Credits</string>
 	<string name="GroupMoneyDebits">Debits</string>
-	
+
 	<!-- viewer object -->
 	<string name="ViewerObjectContents">Contents</string>
-	
+
 	<!-- Viewer menu -->
 	<string name="AcquiredItems">Acquired Items</string>
-	<string name="Cancel">Cancel</string>	
-	<string name="UploadingCosts">Uploading %s costs</string>	
+	<string name="Cancel">Cancel</string>
+	<string name="UploadingCosts">Uploading %s costs</string>
 	<string name="UnknownFileExtension">
 		Unknown file extension .%s
 Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
-	</string>		
-	<string name="AddLandmarkNavBarMenu">Add Landmark...</string>	 
+	</string>
+	<string name="AddLandmarkNavBarMenu">Add Landmark...</string>
 	<string name="EditLandmarkNavBarMenu">Edit Landmark...</string>
-	
+
 	<!-- menu accelerators -->
 	<string name="accel-mac-control">&#8963;</string>
 	<string name="accel-mac-command">&#8984;</string>
@@ -2126,72 +2117,72 @@ Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
 	<string name="accel-win-shift">Shift+</string>
 
 	<!-- Previews -->
-	<string name="FileSaved">File Saved</string>	
-	<string name="Receiving">Receiving</string>	
-		
+	<string name="FileSaved">File Saved</string>
+	<string name="Receiving">Receiving</string>
+
 	<!-- status bar , Time -->
-	<string name="AM">AM</string>	
-	<string name="PM">PM</string>	
-	<string name="PST">PST</string>	
-	<string name="PDT">PDT</string>			
+	<string name="AM">AM</string>
+	<string name="PM">PM</string>
+	<string name="PST">PST</string>
+	<string name="PDT">PDT</string>
 
 	<!-- Directions, HUD -->
-	<string name="Forward">Forward</string>	
-	<string name="Left">Left</string>	
-	<string name="Right">Right</string>	
-	<string name="Back">Back</string>			
-	<string name="North">North</string>	
-	<string name="South">South</string>	
-	<string name="West">West</string>	
-	<string name="East">East</string>		
-	<string name="Up">Up</string>	
-	<string name="Down">Down</string>	
+	<string name="Forward">Forward</string>
+	<string name="Left">Left</string>
+	<string name="Right">Right</string>
+	<string name="Back">Back</string>
+	<string name="North">North</string>
+	<string name="South">South</string>
+	<string name="West">West</string>
+	<string name="East">East</string>
+	<string name="Up">Up</string>
+	<string name="Down">Down</string>
 
     <!-- Search Category Strings -->
-	<string name="Any Category">Any Category</string>	
-	<string name="Shopping">Shopping</string>	
-	<string name="Land Rental">Land Rental</string>	
-	<string name="Property Rental">Property Rental</string>	
-	<string name="Special Attraction">Special Attraction</string>	
-	<string name="New Products">New Products</string>	
-	<string name="Employment">Employment</string>	
-	<string name="Wanted">Wanted</string>	
-	<string name="Service">Service</string>	
-	<string name="Personal">Personal</string>	
+	<string name="Any Category">Any Category</string>
+	<string name="Shopping">Shopping</string>
+	<string name="Land Rental">Land Rental</string>
+	<string name="Property Rental">Property Rental</string>
+	<string name="Special Attraction">Special Attraction</string>
+	<string name="New Products">New Products</string>
+	<string name="Employment">Employment</string>
+	<string name="Wanted">Wanted</string>
+	<string name="Service">Service</string>
+	<string name="Personal">Personal</string>
 
 	<!-- PARCEL_CATEGORY_UI_STRING -->
-	<string name="None">None</string>	
-	<string name="Linden Location">Linden Location</string>	
-	<string name="Adult">Adult</string>	
-	<string name="Arts&amp;Culture">Arts &amp; Culture</string>			
-	<string name="Business">Business</string>	
-	<string name="Educational">Educational</string>	
-	<string name="Gaming">Gaming</string>	
-	<string name="Hangout">Hangout</string>		
-	<string name="Newcomer Friendly">Newcomer Friendly</string>	
+	<string name="None">None</string>
+	<string name="Linden Location">Linden Location</string>
+	<string name="Adult">Adult</string>
+	<string name="Arts&amp;Culture">Arts &amp; Culture</string>
+	<string name="Business">Business</string>
+	<string name="Educational">Educational</string>
+	<string name="Gaming">Gaming</string>
+	<string name="Hangout">Hangout</string>
+	<string name="Newcomer Friendly">Newcomer Friendly</string>
 	<string name="Parks&amp;Nature">Parks &amp; Nature</string>
-	<string name="Residential">Residential</string>	
+	<string name="Residential">Residential</string>
 	<!--<string name="Shopping">Shopping</string>	-->
-	<string name="Stage">Stage</string>	
-	<string name="Other">Other</string>	
-	<string name="Any">Any</string>	
-	<string name="You">You</string>							
-						
+	<string name="Stage">Stage</string>
+	<string name="Other">Other</string>
+	<string name="Any">Any</string>
+	<string name="You">You</string>
+
 	<!-- punctuations -->
-	<string name=":">:</string>			
-	<string name=",">,</string>					
-	<string name="...">...</string>					
-	<string name="***">***</string>					
-	<string name="(">(</string>					
+	<string name=":">:</string>
+	<string name=",">,</string>
+	<string name="...">...</string>
+	<string name="***">***</string>
+	<string name="(">(</string>
 	<string name=")">)</string>
-	<string name=".">.</string>		
-	<string name="'">'</string>	
-	<string name="---">---</string>										
+	<string name=".">.</string>
+	<string name="'">'</string>
+	<string name="---">---</string>
 
 	<!-- media -->
 	<string name="Multiple Media">Multiple Media</string>
 	<string name="Play Media">Play/Pause Media</string>
-	
+
 	<!-- OSMessageBox messages -->
 	<string name="MBCmdLineError">
 		An error was found parsing the command line.
@@ -2800,13 +2791,13 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Wide Lips">Wide Lips</string>
 <string name="Wild">Wild</string>
 <string name="Wrinkles">Wrinkles</string>
-  
+
   <!-- Favorites Bar -->
   <string name="LocationCtrlAddLandmarkTooltip">Add to My Landmarks</string>
   <string name="LocationCtrlEditLandmarkTooltip">Edit My Landmark</string>
   <string name="LocationCtrlInfoBtnTooltip">See more info about the current location</string>
   <string name="LocationCtrlComboBtnTooltip">My location history</string>
-  
+
   <!-- Strings used by the (currently Linux) auto-updater app -->
 	<string name="UpdaterWindowTitle">
 	  [APP_NAME] Update
@@ -2868,9 +2859,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
   <string name="inventory_item_offered-im">
     Inventory item offered
   </string>
-  <string name="share_alert">
-    Drag items from inventory here
-  </string>
 
   <string name="only_user_message">
     You are the only user in this session.
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5011bf6a61aa58afbca4c5dbbcda0f1409c21b5d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_script.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<chiclet_script
+ name="script_chiclet">
+ <icon
+  name="chiclet_icon"
+  follows="all"
+  mouse_opaque="false"
+  image_name="Generic_Object_Small" />
+</expandable_text>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index 1d8257fbc8ae0b308d4c09f24a1cdaef40e18dc6..64c2e65a6e0d2902049a3f359a1700967e61314a 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -6,6 +6,7 @@
     image_unselected="SegmentedBtn_Left_Off"
   -->
   <speak_button
+    follows="left|right" 
     name="left"
     label="Speak"
     label_selected="Speak"
@@ -13,6 +14,7 @@
     tab_stop="false"
     />
   <show_button
+    follows="right" 
     name="right"
     label=""
     left="0"
@@ -25,6 +27,7 @@
     image_unselected="ComboButton_UpOff"
     />
   <monitor
+    follows="right" 
     name="monitor"
     left="0"
     top="18"
diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml
index ff50b56a32fd35b8cafe2f3fde923e0d9c001de8..cdc7ae49ffeb744fbb3ce2cd82de04fe6365549c 100644
--- a/indra/newview/skins/default/xui/es/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="NAVEGADOR">
+	<floater.string name="home_page_url">
+		http://es.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://es.secondlife.com/support
+	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
 			<button label="Atrás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index 33754f39356ce1f99ed414b1cbaf4ae3a0ab398b..fdb6a920841f5b58d53138ea625f27563184ab55 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Preferencias" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es" />
+		</menu_item_call>
+	</menu>
 	<menu label="Archivo" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Subir" name="upload">
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 86f3f1f1259c9811a4db37aaf8b4d871eb78f816..6b58bbea4700018d8d5024b8631dd6451a17e44b 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -374,10 +374,13 @@ La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no
 Debe escribir tanto el nombre como el apellido de su avatar, los dos.
 
 Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere crear una ahora?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=es-ES
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
 	</notification>
 	<notification name="AddClassified">
-		Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en www.secondlife.com.
+		Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en [http://secondlife.com/community/classifieds/?lang=es-ES secondlife.com].
 Rellene su anuncio y pulse &apos;Publicar...&apos; para añadirlo al directorio.
 Cuando pulse Publicar, se le preguntará por un precio a pagar.
 El pagar más hará que su anuncio aparezca más arriba en la lista, y que también aparezca más arriba cuando la gente busque por palabras clave.
@@ -398,6 +401,9 @@ No se reembolsan las cuotas pagadas.
 	</notification>
 	<notification name="PromptGoToEventsPage">
 		¿Ir a la web de eventos de [SECOND_LIFE]?
+		<url name="url">
+			http://secondlife.com/events/?lang=es-ES
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
 	</notification>
 	<notification name="SelectProposalToView">
@@ -575,6 +581,9 @@ misma región.
 		[EXTRA]
 
 ¿Ir a [_URL] para informarse sobre la compra de L$?
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=es-ES
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
 	</notification>
 	<notification name="UnableToLinkObjects">
@@ -1140,13 +1149,16 @@ Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctame
 		Se ha completado la instalación de [APP_NAME].
 
 Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión.
-¿Volver a www.secondlife.com para crear una cuenta nueva?
+¿Volver a [https://join.secondlife.com/index.php?lang=es-ES secondlife.com] para crear una cuenta nueva?
 		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
 		Tenemos problemas de conexión. Puede deberse a un problema de su conexión a internet o de los servidores de [SECOND_LIFE].
 
 Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pulse Ayuda para conectarse a nuestro sitio de Sporte, o pulse Teleportar para intentar teleportarse a su Base.
+		<url name="url">
+			http://es.secondlife.com/support/
+		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
 			<button name="Help" text="Ayuda"/>
@@ -1520,7 +1532,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
 
 ¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1559,7 +1571,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
 
 ¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1593,7 +1605,7 @@ Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de C
 
 ¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -2014,10 +2026,7 @@ Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar u
 		<usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Use esta herramienta para denunciar violaciones de las Normas de la Comunidad y las Condiciones del Servicio. Vea:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Use esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php?lang=es-ES Condiciones del Servicio] y las [http://secondlife.com/corporate/cs.php?lang=es-ES Normas de la Comunidad].
 
 Se investigan y resuelven todas las infracciones denunciadas de las Normas de la Comunidad y las Condiciones del Servicio. Puede ver la resolución tomada en el Informe de Incidentes, en:
 
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 6505424b35d2ddeb1d0836bd7a19ad28d242016b..52c3855d6a357c152962b591415b04b994699554 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
-	<string name="real_url">
-		http://secondlife.com/app/login/
-	</string>
-	<string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</string>
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=es-ES
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=es
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text">
 		Nombre:
 	</text>
@@ -35,3 +36,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
new file mode 100644
index 0000000000000000000000000000000000000000..218e03dcce02f9a37550439947a6f6c620f9297e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=es-ES
+	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=es
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 294e407278f30ecb4c7df27b33601486701f1258..dc508f7c374303f89c517f2ee2ba9bc902aa651b 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=es-ES</string>
 	<string name="LoginInProgress">
 		Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
 	</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 44ab075271be1d6d8f2d7f69065be262d93ca145..986deaabc97337af65927c5e5f67122bdc1aec57 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="NAVIGATEUR">
 	<floater.string name="home_page_url">
-		http://www.secondlife.com
+		http://fr.secondlife.com
 	</floater.string>
 	<floater.string name="support_page_url">
-		http://support.secondlife.com
+		http://fr.secondlife.com/support
 	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index ea28b82d7e0c72bbf0c575730ab19cd690611fe8..532714531b1937b7c7d077030cc213c7cd514891 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Préférences" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=fr" />
+		</menu_item_call>
+	</menu>
 	<menu label="Fichier" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Importer" name="upload">
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 7f6960c8fb9c53475b9a8b1206cce3d10561d090..558b04d68e3c65b16e02f7f03ec46a73047a0657 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -285,7 +285,7 @@ Vous devez saisir le nom et le prénom de votre avatar.
 
 Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
 		<url name="url">
-			http://join.secondlife.com/
+			https://join.secondlife.com/index.php?lang=fr-FR
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
 	</notification>
@@ -312,7 +312,7 @@ Une fois payés, les frais ne sont pas remboursables.
 	<notification name="PromptGoToEventsPage">
 		Aller à la page web de [SECOND_LIFE] réservée aux événements ?
 		<url name="url">
-			http://secondlife.com/events/
+			http://secondlife.com/events/?lang=fr-FR
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
 	</notification>
@@ -493,7 +493,7 @@ Veuillez mettre tous les objets que vous souhaitez acquérir dans la même régi
 
 Aller sur [_URL] pour obtenir des informations sur l&apos;achat de L$ ?
 		<url name="url">
-			http://secondlife.com/app/currency/
+			http://secondlife.com/app/currency/?lang=fr-FR
 		</url>
 		<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
 	</notification>
@@ -1038,7 +1038,7 @@ Vous pouvez utiliser [SECOND_LIFE] normalement, les autres résidents vous voien
 		L&apos;installation de [APP_NAME] est terminée.
 
 S&apos;il s&apos;agit de la première fois que vous utilisez [SECOND_LIFE], vous devrez créer un compte avant de pouvoir vous connecter.
-Retourner sur www.secondlife.com pour créer un nouveau compte ?
+Retourner sur [https://join.secondlife.com/index.php?lang=fr-FR secondlife.com] pour créer un nouveau compte ?
 		<usetemplate name="okcancelbuttons" notext="Continuer" yestext="Nouveau compte..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
@@ -1046,7 +1046,7 @@ Retourner sur www.secondlife.com pour créer un nouveau compte ?
 
 Vérifiez votre connextion Internet et réessayez dans quelques minutes, cliquez sur Aide pour consulter la page [SUPPORT_SITE] ou bien sur Téléporter pour essayer d&apos;aller chez vous.
 		<url name="url">
-			http://secondlife.com/support/
+			http://fr.secondlife.com/support/
 		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
@@ -1436,7 +1436,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
 
 Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
 		</url>
 		<usetemplate ignoretext="Je ne peux pas pénétrer dans cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
 	</notification>
@@ -1464,7 +1464,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
 
 Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
 		</url>
 		<usetemplate ignoretext="Je ne peux pas réclamer cette région car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
 	</notification>
@@ -1488,7 +1488,7 @@ Vérifiez que vous avez la toute dernière version du client et consultez les pa
 
 Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/Pr%C3%A9sentation_des_cat%C3%A9gories_de_contenu_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/fr
 		</url>
 		<usetemplate ignoretext="Je ne peux pas acheter ce terrain car je n&apos;ai pas accès à cette catégorie de contenu" name="okcancelignore" notext="Fermer" yestext="Consulter les pages d&apos;aide"/>
 	</notification>
@@ -1672,10 +1672,7 @@ Déplacer les objets de l&apos;inventaire ?
 		<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Utilisez cet outil pour signaler des infractions aux Conditions d&apos;utilisation et aux Règles de la communauté. Voir :
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php?lang=fr-FR Conditions d&apos;utilisation] et aux [http://secondlife.com/corporate/cs.php?lang=fr-FR Règles de la communauté].
 
 Lorsqu&apos;elles sont signalées, toutes les infractions aux Conditions d&apos;utilisation et aux Règles de la communauté font l&apos;objet d&apos;une enquête et sont résolues. Pour accéder aux détails de la résolution d&apos;un incident, allez sur :
 
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 284590cd5d7b279342ae118edd4593c5dd126cc2..f7ab2891e85edea31949d6e2d80fe473472c74ee 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
 	<panel.string name="create_account_url">
-		http://secondlife.com/registration/
+		http://fr.secondlife.com/registration/
 	</panel.string>
 	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
+		http://secondlife.com/account/request.php?lang=fr
 	</panel.string>
 	<panel name="login_widgets">
 		<line_editor name="first_name_edit" tool_tip="Prénom sur [SECOND_LIFE]"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_pick_info.xml b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..642e31a2c36d589654c336464f2cdcd4d1ccac29
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+	<text name="title" value="Infos"/>
+	<scroll_container name="profile_scroll">
+		<panel name="scroll_content_panel">
+			<text name="pick_name" value="[name]"/>
+			<text name="pick_location" value="[chargement...]"/>
+			<text name="pick_desc" value="[description]"/>
+		</panel>
+	</scroll_container>
+	<panel name="buttons">
+		<button label="Téléporter" name="teleport_btn"/>
+		<button label="Carte" name="show_on_map_btn"/>
+		<button label="Éditer" name="edit_btn"/>
+	</panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index e13de7a5d1f15be62fd2297e3df69c3becb8fd0d..dc28547cb495e9655edffa0de3a4fa8ccbfa3cc6 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -1,12 +1,16 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="Profil" name="panel_profile">
 	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
 	</string>
 	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=en
+		http://www.secondlife.com/account/billing.php?lang=fr-FR
 	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/account"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=fr
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=fr-FR"/>
 	<string name="no_partner_text" value="Aucun"/>
 	<scroll_container name="profile_scroll">
 		<panel name="scroll_content_panel">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 2d0df66f18b95057ce82141950ba8a70c4f9fc24..c59e359d6ec126fffdb90077c61d15d52be1c85b 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=fr-FR</string>
 	<string name="SECOND_LIFE">
 		Second Life
 	</string>
@@ -158,7 +159,7 @@
 		Cliquez pour exécuter la commande secondlife:// command
 	</string>
 	<string name="BUTTON_CLOSE_DARWIN">
-		Fermer (⌘-W)
+		Fermer (&#8984;W)
 	</string>
 	<string name="BUTTON_CLOSE_WIN">
 		Fermer (Ctrl+W)
@@ -1311,16 +1312,16 @@
 		Modifier le repère...
 	</string>
 	<string name="accel-mac-control">
-		⌃
+		&#8963;
 	</string>
 	<string name="accel-mac-command">
-		⌘
+		&#8984;
 	</string>
 	<string name="accel-mac-option">
-		⌥
+		&#8997;
 	</string>
 	<string name="accel-mac-shift">
-		⇧
+		&#8679;
 	</string>
 	<string name="accel-win-control">
 		Ctrl+
diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml
index 7a5f9c9fcbc6b84f1e5ad47d480eb246479b540a..0e25cef60b7f79645597fd82a5afb50290b1b7df 100644
--- a/indra/newview/skins/default/xui/it/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="floater_about" title="BROWSER MULTIMEDIALE">
+	<floater.string name="home_page_url">
+		http://it.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://it.secondlife.com/support
+	</floater.string>
 	<layout_stack name="stack1">
 		<layout_panel name="nav_controls">
 			<button label="Indietro" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index 0010f42a12a7d60c916401dd895dce55ec04559d..b1eb80149e9e827c88d6b1ba45813c80bcb73759 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Preferenze" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it" />
+		</menu_item_call>
+	</menu>
 	<menu label="File" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Carica" name="upload">
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 8f8a969acef05613dd81f6d65f5165c3d7c9ffcd..26a64a49d397617fc9892ec9e0f1e294a61359d3 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -379,10 +379,13 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach
 Devi inserire sia il nome che il cognome del tuo avatar.
 
 Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adesso?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=it-IT
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
 	</notification>
 	<notification name="AddClassified">
-		Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su www.secondlife.com per una settimana.
+		Gli annunci appaiono nella sezione &apos;Annunci&apos; della ricerca nel database e su [http://secondlife.com/community/classifieds/?lang=it-IT secondlife.com] per una settimana.
 Compila il tuo annuncio e clicca &apos;Pubblica...&apos; per aggiungerlo al database.
 Ti verrà chiesto un prezzo da pagare quando clicchi su Pubblica.
 Pagare un prezzo più alto fa sì che il tuo annuncio compaia più in alto nella lista, e che sia più facile da trovare quando la gente ricerca per parole chiavi.
@@ -403,6 +406,9 @@ Non ci sono rimborsi per la tariffa pagata.
 	</notification>
 	<notification name="PromptGoToEventsPage">
 		Vai alla pagina degli eventi di [SECOND_LIFE]?
+		<url name="url">
+			http://secondlife.com/events/?lang=it-IT
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
 	</notification>
 	<notification name="SelectProposalToView">
@@ -575,6 +581,9 @@ Sposta tutti gli oggetti che vuoi acquisire su una sola regione.
 		[EXTRA]
 
 Vuoi andare su [_URL] per maggiori informazioni su come acquistare L$?
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=it-IT
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
 	</notification>
 	<notification name="UnableToLinkObjects">
@@ -1128,13 +1137,16 @@ Puoi usare [SECOND_LIFE] normalmente e gli altri utenti ti vedranno correttament
 		L&apos;installazione di [APP_NAME] è completata.
 
 Se questa è la prima volta che usi [SECOND_LIFE], avari bisogno di creare un account prima di poterti collegare.
-Vai su www.secondlife.com per creare un nuovo account?
+Vai su [https://join.secondlife.com/index.php?lang=it-IT secondlife.com] per creare un nuovo account?
 		<usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
 		Ci sono stati problemi durante la connessione. Potrebbero esserci problemi con la tua connessione ad internet oppure con i server di [SECOND_LIFE].
 
 Puoi controllare la tua connessione internet e riprovare fra qualche minuto, oppure cliccare su Aiuto per collegarti al nostro sito di supporto, oppure cliccare teleporta per cercare di teleportarti a casa.
+		<url name="url">
+			http://it.secondlife.com/support/
+		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
 			<button name="Help" text="Aiuto"/>
@@ -1510,7 +1522,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
 
 Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di accesso?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1549,7 +1561,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
 
 Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1583,7 +1595,7 @@ Verifica di avere installato l&apos;ultima versione del programma e vai alla Kno
 
 Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di accesso?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -2008,10 +2020,7 @@ Trasferisci gli elementi nell&apos;inventario?
 		<usetemplate ignoretext="Quando esci da [APP_NAME]." name="okcancelignore" notext="Continua" yestext="Esci"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Usa questo strumento per segnalare violazioni ai Termini di Servizio e agli standard della Comunità. Vedi:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Usa questo strumento per segnalare violazioni ai [http://secondlife.com/corporate/tos.php?lang=it-IT Termini di Servizio] e agli [http://secondlife.com/corporate/cs.php?lang=it-IT standard della Comunità].
 
 Tutte gli abusi ai Termini di Servizio e agli Standard della Comunità segnalati, sono indagati e risolti. Puoi controllare la risoluzione degli abusi visitando la pagina delle Risoluzioni degli Incidenti:
 
@@ -2366,7 +2375,7 @@ Vuoi visitare il sito di [SECOND_LIFE] per verificare la tua eta?
 
 [_URL]
 		<url name="url" option="0">
-			https://secondlife.com/account/verification.php
+			https://secondlife.com/account/verification.php?lang=it
 		</url>
 		<usetemplate ignoretext="Quando hai un avviso per mancanza della verifica dell&apos;età." name="okcancelignore" notext="No" yestext="Si"/>
 	</notification>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 178208903933923832c3e93e3e79a7999deb682a..e3cb7473fc47c1ee609f4e80269e057e6962cfda 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
-	<string name="real_url">
-		http://secondlife.com/app/login/
-	</string>
-	<string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</string>
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=it-IT
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=it
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text" left="20">
 		Nome:
 	</text>
@@ -37,3 +38,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2aa8b7d0e4a35622f9e1a419cd0f3e2abab06d10
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=it-IT
+	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=it
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index bc3cc38a407f25caebeb5543701648a2d9aeb301..6e3301fdd917733d4f909566f312d109e40b76c0 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=it-IT</string>
 	<string name="LoginInProgress">
 		In connessione. [APP_NAME] può sembrare rallentata.  Attendi.
 	</string>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index bb33a14be4a8e0fedc25f0af6dfa188ea9cb54ab..77aeeefe02d20ac70b3d190831f886809476171c 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="環境設定" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja" />
+		</menu_item_call>
+	</menu>
 	<menu label="ファイル" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="アップロード" name="upload">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index 9962bedaf20bfa0c2ad7d39c681a22b74a6655dc..fca7c8918358fb07052cddbf1a7c9b45055c09c4 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -340,7 +340,7 @@ L$が不足しているのでこのグループに参加することができま
 	<notification name="PromptGoToEventsPage">
 		[SECOND_LIFE]イベント・ウェブ・ページに移動しますか?
 		<url name="url">
-			http://jp.secondlife.com/events/
+			http://secondlife.com/events/?lang=ja-JP
 		</url>
 		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
 	</notification>
@@ -530,7 +530,7 @@ L$が不足しているのでこのグループに参加することができま
 
 [_URL] でリンデンドル購入に関する情報を確認しますか?
 		<url name="url">
-			http://jp.secondlife.com/currency/
+			http://secondlife.com/app/currency/?lang=ja-JP
 		</url>
 		<usetemplate name="okcancelbuttons" notext="取り消し" yestext="OK"/>
 	</notification>
@@ -1113,7 +1113,7 @@ L$は返金されません。
 
 [SECOND_LIFE] の使用が初めての方は、
 ログイン前にアカウントの作成が必要です。
-www.secondlife.comに移動し、新規アカウントの作成を行いますか?
+[https://join.secondlife.com/index.php?lang=ja-JP secondlife.com]に移動し、新規アカウントの作成を行いますか?
 		<usetemplate name="okcancelbuttons" notext="続行" yestext="新規アカウント..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
@@ -1524,7 +1524,7 @@ F1キーを押してください。
 
 ナレッジベースを開きレーティング区分について学びますか?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
 		</url>
 		<usetemplate ignoretext="レーティング区分の制限のため、このリージョンに入ることができません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
 	</notification>
@@ -1553,7 +1553,7 @@ F1キーを押してください。
 
 ナレッジベースを開きレーティング区分について学びますか?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
 		</url>
 		<usetemplate ignoretext="レーティング区分の制限のため、この土地を取得できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
 	</notification>
@@ -1578,7 +1578,7 @@ F1キーを押してください。
 
 ナレッジベースを開きレーティング区分について学びますか?
 		<url name="url">
-			http://wiki.secondlife.com/wiki/レーティング区分概要_(KB)
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
 		</url>
 		<usetemplate ignoretext="レーティング区分の制限のため、この土地を購入できません" name="okcancelignore" notext="閉じる" yestext="ナレッジベースを開く"/>
 	</notification>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 00b9d5aa47d329bc1112cc0d58dc7e6081bd11ec..27eed48d825d96be8dc9b0044d6f7e562643d4a6 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -4,7 +4,7 @@
 		http://jp.secondlife.com/registration/
 	</panel.string>
 	<panel.string name="forgot_password_url">
-		http://secondlife.com/account/request.php
+		http://secondlife.com/account/request.php?lang=ja
 	</panel.string>
 	<panel name="login_widgets">
 		<line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストネーム"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index 8c94833a54ad0f79173be719299d08a0b36e399f..a449c10e10896b5c1b8f33205f08dc906c1d655f 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -1,12 +1,16 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel label="プロフィール" name="panel_profile">
 	<string name="CaptionTextAcctInfo">
-		[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
 	</string>
 	<string name="payment_update_link_url">
-		http://www.secondlife.com/account/billing.php?lang=ja
+		http://www.secondlife.com/account/billing.php?lang=ja-JP
 	</string>
-	<string name="my_account_link_url" value="http://secondlife.com/account"/>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=ja
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=ja-JP"/>
 	<string name="no_partner_text" value="なし"/>
 	<scroll_container name="profile_scroll">
 		<panel name="scroll_content_panel">
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index d6d41aecc0e7f49b4a94f98df9962907c64fb48d..fc9e4b67b71593288b92dda87d063faa2472ba53 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=ja-JP</string>
 	<string name="SECOND_LIFE">
 		Second Life
 	</string>
@@ -158,7 +159,7 @@
 		クリックして secondlife:// コマンドを出す
 	</string>
 	<string name="BUTTON_CLOSE_DARWIN">
-		閉じる (⌘-W)
+		閉じる (&#8984;W)
 	</string>
 	<string name="BUTTON_CLOSE_WIN">
 		閉じる (Ctrl+W)
@@ -1311,16 +1312,16 @@
 		ランドマークを編集...
 	</string>
 	<string name="accel-mac-control">
-		⌃
+		&#8963;
 	</string>
 	<string name="accel-mac-command">
-		⌘
+		&#8984;
 	</string>
 	<string name="accel-mac-option">
-		⌥
+		&#8997;
 	</string>
 	<string name="accel-mac-shift">
-		⇧
+		&#8679;
 	</string>
 	<string name="accel-win-control">
 		Ctrl+
diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml
index 9a83eaea614b4b67d096fcc8086fd62f7b863a5a..a282c267a1c65a507ccba6aa0c0fc724976fcb8a 100644
--- a/indra/newview/skins/default/xui/nl/notifications.xml
+++ b/indra/newview/skins/default/xui/nl/notifications.xml
@@ -380,6 +380,9 @@ De outfit folder bevat geen kleding, lichaamsdelen of externe bevestigingen.
 U moet zowel de voornaam als de achternaam van uw avatar opgeven.
 
 U heeft een account nodig om [SECOND_LIFE] binnen te gaan. Wilt u er nu een maken?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=nl-NL
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Probeer het opnieuw" yestext="Maak een nieuw account"/>
 	</notification>
 	<notification name="AddClassified">
@@ -1131,7 +1134,7 @@ U kunt [SECOND_LIFE] normaal gebruiken en anderen zullen u correct zien.
 		[APP_NAME] installatie compleet.
 
 Als dit de eerste keer is dat u [SECOND_LIFE] gebruikt, zult u een account aan moeten maken voordat u in kan loggen.
-Terugkeren naar www.secondlife.com om een nieuw account aan te maken?
+Terugkeren naar [https://join.secondlife.com/index.php?lang=nl-NL secondlife.com] om een nieuw account aan te maken?
 		<usetemplate name="okcancelbuttons" notext="Doorgaan" yestext="Nieuw Account..."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
index 5bfb9dd235864a615912a01d2855f10742359d04..235e15e7fbc0be23fdf501f4a29067cdc9dbc15e 100644
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ b/indra/newview/skins/default/xui/nl/panel_login.xml
@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
-	<string name="real_url">
-		http://secondlife.com/app/login/
-	</string>
-	<string name="forgot_password_url">
-		http://secondlife.com/account/request.php
-	</string>
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=nl-NL
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=nl-NL
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text">
 		Voornaam:
 	</text>
@@ -35,3 +36,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 49ebcd319ca08e67956c8debf78f783c30cff73d..0be5ec9e869f650e97cc75c7786e8a4de5e994d9 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=nl-NL</string>
 	<string name="LoginInProgress">
 		Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
 	</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
index 3437dfcdba3c6d66753532b76d22a6b6ab618804..1cd6d5662c274e3af897731b37bedb89ec612046 100644
--- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater min_width="477" name="floater_about" title="NAVEGADOR DE MÍDIA" width="570">
+	<floater.string name="home_page_url">
+		http://br.secondlife.com
+	</floater.string>
+	<floater.string name="support_page_url">
+		http://br.secondlife.com/support
+	</floater.string>
 	<layout_stack name="stack1" width="550">
 		<layout_panel name="nav_controls">
 			<button label="Para trás" name="back" width="75"/>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index c476ef0bbcd840e9a8bd31a5cb775b7c470d2c88..2c887fa50c0684d9222bb951d618cf2f5e3d3b36 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <menu_bar name="Main Menu">
+	<menu name="Me">
+		<menu_item_call label="Preferências" name="Preferences"/>
+		<menu_item_call name="Manage My Account">
+			<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt" />
+		</menu_item_call>
+	</menu>
 	<menu label="Arquivo" name="File">
 		<tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
 		<menu label="Upload" name="upload">
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index 0ee2c5cb849cfb5eeb0c4c8a7c54308c949219c3..c3ce53861f482af537e995c192c43ff6cf4caeb4 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -377,10 +377,13 @@ Scripts devem ser permitidos para fazer as armas funcionarem.
 Você precisa entrar com ambos os Nome e Sobrenome do seu avatar.
 
 Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de criar uma conta agora?
+		<url name="url">
+			https://join.secondlife.com/index.php?lang=pt-BR
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/>
 	</notification>
 	<notification name="AddClassified">
-		Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no www.secondlife.com por uma semana.
+		Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no [http://secondlife.com/community/classifieds/?lang=pt-BR secondlife.com] por uma semana.
 Preencha seu anúncio e então clique &apos;Publicar...&apos; para adicioná-lo ao diretório.
 Será solicitado a você um preço a ser pago, quando você clicar Publicar.
 Pagando mais, faz com que seu anúncio apareça em posição mais alta na lista e também em posição mais alta, quando as pessoas buscarem por palavras-chave.
@@ -401,6 +404,9 @@ Não há reembolso por taxas já pagas.
 	</notification>
 	<notification name="PromptGoToEventsPage">
 		Ir até a página web de enventos [SECOND_LIFE] ?
+		<url name="url">
+			http://secondlife.com/events/?lang=pt-BR
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/>
 	</notification>
 	<notification name="SelectProposalToView">
@@ -492,7 +498,7 @@ O objeto pode estar fora de alcance ou ter sido deletado.
 MINSPECS
 Você deseja visitar [_URL] para maiores informações?
 		<url name="url" option="0">
-			http://www.secondlife.com/corporate/sysreqs.php
+			http://secondlife.com/support/sysreqs.php?lang=pt
 		</url>
 		<usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
 	</notification>
@@ -571,6 +577,9 @@ Por favor, mova todos os objetos a serem adquiridos para uma mesma região.
 		[EXTRA]
 
 Vá para [_URL] para informação sobre compra de L$.
+		<url name="url">
+			http://secondlife.com/app/currency/?lang=pt-BR
+		</url>
 		<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir até a página"/>
 	</notification>
 	<notification name="UnableToLinkObjects">
@@ -1115,13 +1124,16 @@ Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretam
 		A instalação do [APP_NAME] está completa.
 
 Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar.
-Retornar a www.secondlife.com para criar uma nova conta?
+Retornar a [https://join.secondlife.com/index.php?lang=pt-BR secondlife.com] para criar uma nova conta?
 		<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
 	</notification>
 	<notification name="LoginPacketNeverReceived">
 		Estamos com problemas de conexão. Pode ser problema com a conexão de sua internet ou com os servidores do [SECOND_LIFE].
 
 Voce tanto pode checar a conexão de sua internet e tentar novamente em alguns minutos, ou clicar em Teletransporte para tentar teletransportar-se para sua casa.
+		<url name="url">
+			http://br.secondlife.com/support/
+		</url>
 		<form name="form">
 			<button name="OK" text="OK"/>
 			<button name="Help" text="Ajuda"/>
@@ -1492,7 +1504,7 @@ Por favor, verifique se você está com o último Visualizador instalado e vá a
 
 Ir para o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1531,7 +1543,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o
 
 Ir para a o Banco de Conhecimento para maiores informações sobre Classificações de maturidade?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1565,7 +1577,7 @@ Por favor, verifique se você tem o último Visualizador instalado e vá para o
 
 Ir para o Banco de Conhecimento para maiores informações sobre Classificações de Maturidade?
 		<url name="url">
-			https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
+			http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
 		</url>
     <usetemplate
      name="okcancelignore"
@@ -1975,10 +1987,7 @@ Mover para o inventário o(s) item(s)?
 		<usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/>
 	</notification>
 	<notification name="HelpReportAbuseEmailLL">
-		Use esta ferramenta para reportar violações aos Termos de Serviço e aos Padrões da Comunidade. Veja:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
+		Use esta ferramenta para reportar violações aos [http://secondlife.com/corporate/tos.php?lang=pt-BR Termos de Serviço] e aos [http://secondlife.com/corporate/cs.php?lang=pt-BR Padrões da Comunidade].
 
 Todos os abusos aos Termos de Serviço e aos Padrões da Comunidade reportados, são investigados e resolvidos. Você pode ver a resolução do incidente na Reportagem de Incidentes em:
 
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index c6f1433440cba378b58a2e78a45d30852cae578b..d7ff3f29df191ec2f41164bd291733cb662f4cca 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,5 +1,12 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <panel name="panel_login">
+	<panel.string name="create_account_url">
+		http://join.secondlife.com/index.php?lang=pt-BR
+	</panel.string>
+	<panel.string name="forgot_password_url">
+		http://secondlife.com/account/request.php?lang=pt
+	</panel.string>
+<panel name="login_widgets">
 	<text name="first_name_text">
 		Primeiro nome:
 	</text>
@@ -29,3 +36,4 @@
 		[VERSION]
 	</text>
 </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ff53aa6a41d3ca50fa95dfd5b3b56354019a9eba
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_profile.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_profile">
+	<string name="CaptionTextAcctInfo">
+		[ACCTTYPE]
+[PAYMENTINFO] [AGEVERIFICATION]
+	</string>
+	<string name="payment_update_link_url">
+		http://www.secondlife.com/account/billing.php?lang=pt-BR
+	</string>
+	<string name="partner_edit_link_url">
+		http://www.secondlife.com/account/partners.php?lang=pt
+	</string>
+	<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 2d3514e5fe883e31f3a71c2c77e11d5beeb602dc..9acfce99dd159a0845f866a7d4fba349e9f44b6e 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -4,6 +4,7 @@
      For example, the strings used in avatar chat bubbles, and strings 
      that are returned from one component and may appear in many places-->
 <strings>
+	<string name="create_account_url">http://join.secondlife.com/index.php?lang=pt-BR</string>
 	<string name="LoginInProgress">
 		Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
 	</string>
diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp
index ed753b6ff7a2788f11a4c1f69fef47ac40e57127..142a5eb5e6aa02e5c83fbbef22e19e51e58ec9a7 100644
--- a/indra/newview/tests/lldateutil_test.cpp
+++ b/indra/newview/tests/lldateutil_test.cpp
@@ -60,6 +60,11 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
 
 std::string LLTrans::getCountString(const std::string& language, const std::string& xml_desc, S32 count)
 {
+	count_string_t key(xml_desc, count);
+	if (gCountString.find(key) == gCountString.end())
+	{
+		return std::string("Couldn't find ") + xml_desc;
+	}
 	return gCountString[ count_string_t(xml_desc, count) ];
 }
 
@@ -91,8 +96,11 @@ namespace tut
 			gCountString[ count_string_t("AgeYears", 2) ]  = "2 years";
 			gCountString[ count_string_t("AgeMonths", 1) ] = "1 month";
 			gCountString[ count_string_t("AgeMonths", 2) ] = "2 months";
+			gCountString[ count_string_t("AgeMonths", 11) ]= "11 months";
 			gCountString[ count_string_t("AgeWeeks", 1) ]  = "1 week";
 			gCountString[ count_string_t("AgeWeeks", 2) ]  = "2 weeks";
+			gCountString[ count_string_t("AgeWeeks", 3) ]  = "3 weeks";
+			gCountString[ count_string_t("AgeWeeks", 4) ]  = "4 weeks";
 			gCountString[ count_string_t("AgeDays", 1) ]   = "1 day";
 			gCountString[ count_string_t("AgeDays", 2) ]   = "2 days";
 		}
@@ -113,12 +121,18 @@ namespace tut
 		ensure_equals("years",
 			LLDateUtil::ageFromDate("12/31/2007", mNow),
 			"2 years old" );
-		ensure_equals("single year",
-			LLDateUtil::ageFromDate("12/31/2008", mNow),
-			"1 year old" );
+		ensure_equals("years",
+			LLDateUtil::ageFromDate("1/1/2008", mNow),
+			"1 year 11 months old" );
+		ensure_equals("single year + one month",
+			LLDateUtil::ageFromDate("11/30/2008", mNow),
+			"1 year 1 month old" );
 		ensure_equals("single year + a bit",
 			LLDateUtil::ageFromDate("12/12/2008", mNow),
 			"1 year old" );
+		ensure_equals("single year",
+			LLDateUtil::ageFromDate("12/31/2008", mNow),
+			"1 year old" );
     }
 
 	template<> template<>
@@ -128,6 +142,9 @@ namespace tut
 		ensure_equals("months",
 			LLDateUtil::ageFromDate("10/30/2009", mNow),
 			"2 months old" );
+		ensure_equals("months 2",
+			LLDateUtil::ageFromDate("10/31/2009", mNow),
+			"2 months old" );
 		ensure_equals("single month",
 			LLDateUtil::ageFromDate("11/30/2009", mNow),
 			"1 month old" );
@@ -137,6 +154,9 @@ namespace tut
 	void dateutil_object_t::test<3>()
 	{
 		set_test_name("Weeks");
+		ensure_equals("4 weeks",
+			LLDateUtil::ageFromDate("12/1/2009", mNow),
+			"4 weeks old" );
 		ensure_equals("weeks",
 			LLDateUtil::ageFromDate("12/17/2009", mNow),
 			"2 weeks old" );
diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp
index 3ac631d96e3213a9df2b0051365f7d015f115e97..217889c39005fc151774b0d015d040571b041b02 100644
--- a/indra/newview/tests/llmediadataclient_test.cpp
+++ b/indra/newview/tests/llmediadataclient_test.cpp
@@ -152,12 +152,13 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject
 			std::istringstream d(data);
 			LLSDSerialize::fromXML(mRep, d);
 			mNumBounceBacks = 0;
+			mDead = false;
             
            // std::cout << ll_pretty_print_sd(mRep) << std::endl;
            // std::cout << "ID: " << getID() << std::endl;
 		}
 	LLMediaDataClientObjectTest(const LLSD &rep) 
-		: mRep(rep), mNumBounceBacks(0) {}
+		: mRep(rep), mNumBounceBacks(0), mDead(false) {}
 	~LLMediaDataClientObjectTest()
 		{ LL_DEBUGS("LLMediaDataClient") << "~LLMediaDataClientObjectTest" << LL_ENDL; }
 	
@@ -187,12 +188,18 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject
 	virtual std::string getCapabilityUrl(const std::string &name) const 
 		{ return mRep["cap_urls"][name]; }
 
+	virtual bool isDead() const
+		{ return mDead; }
+
 	int getNumBounceBacks() const
 		{ return mNumBounceBacks; }
 	
+	void markDead()
+		{ mDead = true; }
 private:
 	LLSD mRep;
 	int mNumBounceBacks;
+	bool mDead;
 };
 
 // This special timer delay should ensure that the timer will fire on the very
@@ -531,4 +538,61 @@ namespace tut
 		ensure("REF COUNT", o1->getNumRefs(), num_refs_start);
 		
 	}
+
+	template<> template<>
+    void mediadataclient_object_t::test<8>()
+    {
+		// Test queue handling of objects that are marked dead.
+		LOG_TEST(8);
+		
+		LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"1.0","1.0"));
+		LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"2.0","1.0"));
+		LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"3.0","1.0"));
+		LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"4.0","1.0"));
+		{
+			LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+			
+			// queue up all 4 objects
+			mdc->fetchMedia(o1);
+			mdc->fetchMedia(o2);
+			mdc->fetchMedia(o3);
+			mdc->fetchMedia(o4);
+			
+			// and mark the second and fourth ones dead.
+			dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o2))->markDead();
+			dynamic_cast<LLMediaDataClientObjectTest*>(static_cast<LLMediaDataClientObject*>(o4))->markDead();
+
+			ensure("is in queue 1", mdc->isInQueue(o1));
+			ensure("is in queue 2", mdc->isInQueue(o2));
+			ensure("is in queue 3", mdc->isInQueue(o3));
+			ensure("is in queue 4", mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 0);
+			
+			::pump_timers();
+			
+			// The first tick should remove the first one 
+			ensure("is not in queue 1", !mdc->isInQueue(o1));
+			ensure("is in queue 2", mdc->isInQueue(o2));
+			ensure("is in queue 3", mdc->isInQueue(o3));
+			ensure("is in queue 4", mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 1);
+			
+			::pump_timers();
+			
+			// The second tick should skip the second and remove the third
+			ensure("is not in queue 2", !mdc->isInQueue(o2));
+			ensure("is not in queue 3", !mdc->isInQueue(o3));
+			ensure("is in queue 4", mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 2);
+
+			::pump_timers();
+
+			// The third tick should skip the fourth one and empty the queue.
+			ensure("is not in queue 4", !mdc->isInQueue(o4));
+			ensure("post records", gPostRecords->size(), 2);
+
+			ensure("queue empty", mdc->isEmpty());
+		}
+		
+	}
 }