diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index f2edd5c559a2e11227bf75a4e4182a08124c7923..721e5670e73a7e62ef2fbbd2f84591fd4d061afc 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -963,30 +963,29 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token,
 	// if never fell into those two ifs above, param must be utc
 	if (secFromEpoch < 0) secFromEpoch = 0;
 
-	LLDate * datetime = new LLDate((F64)secFromEpoch);
+	LLDate datetime((F64)secFromEpoch);
 	std::string code = LLStringOps::getDatetimeCode (token);
 
 	// special case to handle timezone
 	if (code == "%Z") {
 		if (param == "utc")
+		{
 			replacement = "GMT";
-		else if (param == "slt")
-			replacement = "SLT";
-		else if (param != "local") // *TODO Vadim: not local? then what?
+		}
+		else if (param == "local")
+		{
+			replacement = "";		// user knows their own timezone
+		}
+		else
+		{
+			// "slt" = Second Life Time, which is deprecated.
+			// If not utc or user local time, fallback to Pacific time
 			replacement = LLStringOps::getDaylightSavings() ? "PDT" : "PST";
-
-		return true;
-	}
-	replacement = datetime->toHTTPDateString(code);
-
-	if (code.empty())
-	{
-		return false;
-	}
-	else
-	{
+		}
 		return true;
 	}
+	replacement = datetime.toHTTPDateString(code);
+	return !code.empty();
 }
 
 // LLStringUtil::format recogizes the following patterns.
diff --git a/indra/llrender/lltexture.h b/indra/llrender/lltexture.h
index c18917b66346296b862584875fb58f9a34d1ccf8..0cd96676444b18222b33cc4bacb766b951c62367 100644
--- a/indra/llrender/lltexture.h
+++ b/indra/llrender/lltexture.h
@@ -61,6 +61,8 @@ public:
 	//
 	//interfaces to access LLViewerTexture
 	//
+	virtual S8         getType() const = 0 ;
+	virtual void       setKnownDrawSize(S32 width, S32 height) = 0 ;
 	virtual bool       bindDefaultImage(const S32 stage = 0) const = 0 ;
 	virtual void       forceImmediateUpdate() = 0 ;
 	virtual void       setActive() = 0 ;
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 6dcc1957a947ff051cc12c2e887bfaccf6025374..8c72b079eee4dc71222705579a9824dc972fcfec 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -268,21 +268,14 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
 		mButtonsEnabled[i] = FALSE;
 		mButtons[i] = NULL;
 	}
-	for (S32 i = 0; i < 4; i++) 
-	{
-		mResizeBar[i] = NULL; 
-		mResizeHandle[i] = NULL;
-	}
+	addDragHandle();
+	addResizeCtrls();
 	
 	initFromParams(p);
 	
 	// chrome floaters don't take focus at all
 	setFocusRoot(!getIsChrome());
 
-	addDragHandle();
-	addResizeCtrls();
-	enableResizeCtrls(mResizable);
-
 	initFloater();
 }
 
@@ -2589,7 +2582,7 @@ void LLFloater::setupParamsForExport(Params& p, LLView* parent)
 
 void LLFloater::initFromParams(const LLFloater::Params& p)
 {
-	// *NOTE: We have too many classes derived from LLPanel to retrofit them 
+	// *NOTE: We have too many classes derived from LLFloater to retrofit them 
 	// all to pass in params via constructors.  So we use this method.
 
 	 // control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible
@@ -2603,11 +2596,10 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
 	setCanMinimize(p.can_minimize);
 	setCanClose(p.can_close);
 	setCanDock(p.can_dock);
+	setCanResize(p.can_resize);
+	setResizeLimits(p.min_width, p.min_height);
 	
 	mDragOnLeft = p.can_drag_on_left;
-	mResizable = p.can_resize;
-	mMinWidth = p.min_width;
-	mMinHeight = p.min_height;
 	mHeaderHeight = p.header_height;
 	mLegacyHeaderHeight = p.legacy_header_height;
 	mSingleInstance = p.single_instance;
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index d98d8a0e90fb7d4a566097a8a19491f371384adc..aca4dc56eed59bc9f53da99dd3b6e1a5ac23ec89 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -127,7 +127,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key)
 				bool success = LLUICtrlFactory::getInstance()->buildFloater(res, xui_file, NULL);
 				if (!success)
 				{
-					llwarns << "Failed to buid floater type: '" << name << "'." << llendl;
+					llwarns << "Failed to build floater type: '" << name << "'." << llendl;
 					return NULL;
 				}
 					
diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp
index 66c2ba682fc474b115c511c31c87ed0bd5ede5c5..c1bc21f2e941a91a98f3466a2c8d993b1de84261 100644
--- a/indra/llui/lliconctrl.cpp
+++ b/indra/llui/lliconctrl.cpp
@@ -57,7 +57,9 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p)
 :	LLUICtrl(p),
 	mColor(p.color()),
 	mImagep(p.image),
-	mPriority(0)
+	mPriority(0),
+	mDrawWidth(0),
+	mDrawHeight(0)
 {
 	if (mImagep.notNull())
 	{
@@ -100,6 +102,8 @@ void LLIconCtrl::setValue(const LLSD& value )
 	{
 		mImagep = LLUI::getUIImage(tvalue.asString(), mPriority);
 	}
+
+	setIconImageDrawSize();
 }
 
 std::string LLIconCtrl::getImageName() const
@@ -109,3 +113,14 @@ std::string LLIconCtrl::getImageName() const
 	else
 		return std::string();
 }
+
+void LLIconCtrl::setIconImageDrawSize()
+{
+	if(mImagep.notNull() && mDrawWidth && mDrawHeight)
+	{
+		if(mImagep->getImage().notNull())
+		{
+			mImagep->getImage()->setKnownDrawSize(mDrawWidth, mDrawHeight) ;
+		}
+	}
+}
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 90f1693060475846f53eb0526a9390cf6f64a0e4..66368f979b6a74d9baedc8294fe1f6d5c6d6b844 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -60,6 +60,7 @@ public:
 protected:
 	LLIconCtrl(const Params&);
 	friend class LLUICtrlFactory;
+
 public:
 	virtual ~LLIconCtrl();
 
@@ -73,9 +74,16 @@ public:
 
 	void			setColor(const LLColor4& color) { mColor = color; }
 	
+private:
+	void setIconImageDrawSize() ;
+
 protected:
 	S32 mPriority;
 
+	//the output size of the icon image if set.
+	S32 mDrawWidth ;
+	S32 mDrawHeight ;
+
 private:
 	LLUIColor mColor;
 	LLPointer<LLUIImage> mImagep;
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 6e058e4c629bf4a3aa9870e45a3a91a859720df3..91e7e46195d5da1a2e6398b75ab230192faae97a 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -2894,8 +2894,8 @@ void hide_top_view( LLView* view )
 }
 
 
-// x and y are the desired location for the popup, NOT necessarily the
-// mouse location
+// x and y are the desired location for the popup, in the spawning_view's
+// coordinate frame, NOT necessarily the mouse location
 // static
 void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y)
 {
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 48887ec3520169fc2b03a51ffec060a3cf915e54..09d9e407c7bea43e03860ae2a82fdfadc5697563 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -505,7 +505,7 @@ public:
 	void buildDrawLabels();
 	void createJumpKeys();
 
-	// Show popup at a specific location.
+	// Show popup at a specific location, in the spawn_view's coordinate frame
 	static void showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y);
 
 	// Whether to drop shadow menu bar 
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index 7d21c7e0c18de8462e6b860902bbb330a7183ba8..78738c826dd08a9e3bbd5bc87729716bde4d115a 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -434,6 +434,7 @@ void LLMultiFloater::onTabSelected()
 void LLMultiFloater::setCanResize(BOOL can_resize)
 {
 	LLFloater::setCanResize(can_resize);
+	if (!mTabContainer) return;
 	if (isResizable() && mTabContainer->getTabPosition() == LLTabContainer::BOTTOM)
 	{
 		mTabContainer->setRightTabBtnOffset(RESIZE_HANDLE_WIDTH);
@@ -457,6 +458,8 @@ BOOL LLMultiFloater::postBuild()
 	}
 
 	mTabContainer = getChild<LLTabContainer>("Preview Tabs");
+	
+	setCanResize(mResizable);
 	return TRUE;
 }
 
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 0d340699c5ad95c47f312ef0f411c95a6ec53e2e..07c0f3ce847eaff623422813a29b5e2488efae4c 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -110,8 +110,6 @@ LLPanel::LLPanel(const LLPanel::Params& p)
 	// *NOTE: Be sure to also change LLPanel::initFromParams().  We have too
 	// many classes derived from LLPanel to retrofit them all to pass in params.
 {
-	setIsChrome(FALSE);
-
 	if (p.has_border)
 	{
 		addBorder(p.border);
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index f9f0307d17c27020ec479f82f10b1a65b75e5baf..86bd2f05ce99cc5034169f07c5d0ad63ddf70d7f 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -106,7 +106,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled)
 			child->setEnabled(enabled);
 			if (index == mSelectedIndex && enabled == FALSE)
 			{
-				mSelectedIndex = -1;
+				setSelectedIndex(-1);
 			}
 			break;
 		}
diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp
index 073e14386f63312a58323c5781d19e5560415533..ba53f84877478e48cf5dc783e9e56e42a3e79065 100644
--- a/indra/llui/llscrolllistcolumn.cpp
+++ b/indra/llui/llscrolllistcolumn.cpp
@@ -47,6 +47,21 @@ const S32 MIN_COLUMN_WIDTH = 20;
 //---------------------------------------------------------------------------
 // LLScrollColumnHeader
 //---------------------------------------------------------------------------
+LLScrollColumnHeader::Params::Params()
+:	column("column")
+{
+	name  = "column_header";
+	image_unselected.name("square_btn_32x128.tga");
+	image_selected.name("square_btn_selected_32x128.tga");
+	image_disabled.name("square_btn_32x128.tga");
+	image_disabled_selected.name("square_btn_selected_32x128.tga");
+	image_overlay.name("combobox_arrow.tga");
+	image_overlay_alignment("right");
+	font_halign = LLFontGL::LEFT;
+	tab_stop(false);
+	scale_image(true);
+}
+
 
 LLScrollColumnHeader::LLScrollColumnHeader(const LLScrollColumnHeader::Params& p) 
 :	LLButton(p), // use combobox params to steal images
diff --git a/indra/llui/llscrolllistcolumn.h b/indra/llui/llscrolllistcolumn.h
index 23318fd7c4e6792b1cf4ceda85bd52e815ef05db..5aef6e8e94e3bfd65b77fc2e30064fe5d51f577c 100644
--- a/indra/llui/llscrolllistcolumn.h
+++ b/indra/llui/llscrolllistcolumn.h
@@ -50,20 +50,7 @@ public:
 	{
 		Mandatory<LLScrollListColumn*> column;
 
-		Params()
-		:	column("column")
-		{
-			name  = "column_header";
-			image_unselected.name("square_btn_32x128.tga");
-			image_selected.name("square_btn_selected_32x128.tga");
-			image_disabled.name("square_btn_32x128.tga");
-			image_disabled_selected.name("square_btn_selected_32x128.tga");
-			image_overlay.name("combobox_arrow.tga");
-			image_overlay_alignment("right");
-			font_halign = LLFontGL::LEFT;
-			tab_stop(false);
-			scale_image(true);
-		}
+		Params();
 	};
 	LLScrollColumnHeader(const Params&);
 	~LLScrollColumnHeader();
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2b1d677ffb7ffaec05b39d2305fcb26ec87f3556..9a26f0b4726be0e54ebf089ac5ffd58b40bc9479 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -933,13 +933,16 @@ BOOL LLTextBase::handleToolTip(S32 x, S32 y, MASK mask)
 
 void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
 {
-	LLUICtrl::reshape( width, height, called_from_parent );
+	if (width != getRect().getWidth() || height != getRect().getHeight())
+	{
+		LLUICtrl::reshape( width, height, called_from_parent );
 
-	// do this first after reshape, because other things depend on
-	// up-to-date mTextRect
-	updateRects();
-	
-	needsReflow();
+		// do this first after reshape, because other things depend on
+		// up-to-date mTextRect
+		updateRects();
+		
+		needsReflow();
+	}
 }
 
 void LLTextBase::draw()
@@ -1193,11 +1196,10 @@ void LLTextBase::reflow(S32 start_index)
 				//llassert_always(getLocalRectFromDocIndex(mScrollIndex).mBottom == first_char_rect.mBottom);
 			}
 		}
-	}
-
 
-	// reset desired x cursor position
-	updateCursorXPos();
+		// reset desired x cursor position
+		updateCursorXPos();
+	}
 }
 
 LLRect LLTextBase::getContentsRect()
@@ -2108,9 +2110,12 @@ LLRect LLTextBase::getVisibleDocumentRect() const
 	}
 	else
 	{
-		// entire document rect when not scrolling
+		// entire document rect is visible when not scrolling
+		// but offset according to height of widget
 		LLRect doc_rect = mDocumentView->getLocalRect();
-		doc_rect.translate(-mDocumentView->getRect().mLeft, -mDocumentView->getRect().mBottom);
+		doc_rect.mLeft -= mDocumentView->getRect().mLeft;
+		// adjust for height of text above widget baseline
+		doc_rect.mBottom = llmin(0, doc_rect.getHeight() - mTextRect.getHeight());
 		return doc_rect;
 	}
 }
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 14fd786127115792b6c64b082d9795ca5d27c1d3..4cca522a23501ec3893e4144e0d49c3f911b0c3f 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -154,6 +154,9 @@ public:
 	LLRect					getContentsRect();
 	LLRect					getVisibleDocumentRect() const;
 
+	S32						getVPad() { return mVPad; }
+	S32						getHPad() { return mHPad; }
+
 
 	S32						getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const;
 	LLRect					getLocalRectFromDocIndex(S32 pos) const;
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index f0238dba4927df5be507d2011a1224c358b1f985..3ce5a0320be63dd849375a12369349bf4edf9ee9 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -652,6 +652,13 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	BOOL	handled = FALSE;
 
+	// set focus first, in case click callbacks want to change it
+	// RN: do we really need to have a tab stop?
+	if (hasTabStop())
+	{
+		setFocus( TRUE );
+	}
+
 	// Let scrollbar have first dibs
 	handled = LLTextBase::handleMouseDown(x, y, mask);
 
@@ -694,12 +701,6 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 		handled = TRUE;
 	}
 
-	if (hasTabStop())
-	{
-		setFocus( TRUE );
-		handled = TRUE;
-	}
-
 	// Delay cursor flashing
 	resetCursorBlink();
 
@@ -708,29 +709,32 @@ BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
 
 BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
-	BOOL handled = LLTextBase::handleRightMouseDown(x, y, mask);
-	if (!handled && hasTabStop())
+	if (hasTabStop())
+	{
+		setFocus(TRUE);
+	}
+	if (!LLTextBase::handleRightMouseDown(x, y, mask))
 	{
-		setFocus( TRUE );
 		showContextMenu(x, y);
-		handled = TRUE;
 	}
-	return handled;
+	return TRUE;
 }
 
 
 
 BOOL LLTextEditor::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
 {
-	BOOL	handled = FALSE;
-	handled = LLTextBase::handleMouseDown(x, y, mask);
+	if (hasTabStop())
+	{
+		setFocus(TRUE);
+	}
 
-	if (!handled)
+	if (!LLTextBase::handleMouseDown(x, y, mask))
 	{
-		setFocus( TRUE );
 		if( canPastePrimary() )
 		{
 			setCursorAtLocalPos( x, y, true );
+			// does not rely on focus being set
 			pastePrimary();
 		}
 	}
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 34501ae080c47f598bfe1efc681c16feaf37d752..23c87c7522cca89063c1fb3187d6dcb3065506fa 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -161,10 +161,7 @@ LLToolTip::Params::Params()
 	web_based_media("web_based_media", false),
 	media_playing("media_playing", false)
 {
-	name = "tooltip";
-	font = LLFontGL::getFontSansSerif();
-	bg_opaque_color = LLUIColorTable::instance().getColor( "ToolTipBgColor" );
-	background_visible = true;
+	chrome = true;
 }
 
 LLToolTip::LLToolTip(const LLToolTip::Params& p)
@@ -208,6 +205,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 		icon_params.rect = icon_rect;
 		//icon_params.follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;
 		icon_params.image_unselected(imagep);
+		icon_params.image_selected(imagep);
 		icon_params.scale_image(true);
 		icon_params.flash_color(icon_params.highlight_color());
 		mInfoButton  = LLUICtrlFactory::create<LLButton>(icon_params);
@@ -221,7 +219,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 		mTextBox->translate(TOOLTIP_ICON_SIZE + mPadding, 0);
 	}
 	
-	if (p.time_based_media.isProvided() && p.time_based_media == true)
+	if (p.time_based_media)
 	{
 		LLButton::Params p_button;
 		p_button.name(std::string("play_media"));
@@ -238,17 +236,14 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 		{
 			mPlayMediaButton->setCommitCallback(boost::bind(p.click_playmedia_callback()));
 		}
-		if(p.media_playing.isProvided())
-		{
-			mPlayMediaButton->setToggleState(p.media_playing);
-		}
+		mPlayMediaButton->setToggleState(p.media_playing);
 		addChild(mPlayMediaButton);
 		
 		// move text over to fit image in
 		mTextBox->translate(TOOLTIP_PLAYBUTTON_SIZE + mPadding, 0);
 	}
 	
-	if (p.web_based_media.isProvided() && p.web_based_media == true)
+	if (p.web_based_media)
 	{
 		LLButton::Params p_w_button;
 		p_w_button.name(std::string("home_page"));
@@ -455,7 +450,10 @@ void LLToolTipMgr::show(const std::string& msg)
 
 void LLToolTipMgr::show(const LLToolTip::Params& params)
 {
-	if (!params.validateBlock()) 
+	// fill in default tooltip params from tool_tip.xml
+	LLToolTip::Params params_with_defaults(params);
+	params_with_defaults.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLToolTip>());
+	if (!params_with_defaults.validateBlock()) 
 	{
 		llwarns << "Could not display tooltip!" << llendl;
 		return;
@@ -467,12 +465,12 @@ void LLToolTipMgr::show(const LLToolTip::Params& params)
 
 	// are we ready to show the tooltip?
 	if (!mToolTipsBlocked									// we haven't hit a key, moved the mouse, etc.
-		&& LLUI::getMouseIdleTime() > params.delay_time)	// the mouse has been still long enough
+		&& LLUI::getMouseIdleTime() > params_with_defaults.delay_time)	// the mouse has been still long enough
 	{
-		bool tooltip_changed = mLastToolTipParams.message() != params.message()
-								|| mLastToolTipParams.pos() != params.pos()
-								|| mLastToolTipParams.time_based_media() != params.time_based_media()
-								|| mLastToolTipParams.web_based_media() != params.web_based_media();
+		bool tooltip_changed = mLastToolTipParams.message() != params_with_defaults.message()
+								|| mLastToolTipParams.pos() != params_with_defaults.pos()
+								|| mLastToolTipParams.time_based_media() != params_with_defaults.time_based_media()
+								|| mLastToolTipParams.web_based_media() != params_with_defaults.web_based_media();
 
 		bool tooltip_shown = mToolTip 
 							 && mToolTip->getVisible() 
@@ -480,7 +478,7 @@ void LLToolTipMgr::show(const LLToolTip::Params& params)
 
 		mNeedsToolTip = tooltip_changed || !tooltip_shown;
 		// store description of tooltip for later creation
-		mNextToolTipParams = params;
+		mNextToolTipParams = params_with_defaults;
 	}
 }
 
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 4a5f60f93da006d4eacb3ade4af535f352f1318a..30d251266c0ff8e9b306803159cfc41d51391bf6 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -78,16 +78,13 @@ public:
 									visible_time_far;	// time for which tooltip is visible while mouse moved away
 		Optional<LLRect>			sticky_rect;
 		Optional<const LLFontGL*>	font;
-
-		Optional<click_callback_t>	click_callback;
 		Optional<LLUIImage*>		image;
-		
-		
-		Optional<bool>				time_based_media;
-		Optional<bool>				web_based_media;
-		Optional<bool>				media_playing;
-		Optional<click_callback_t>	click_playmedia_callback;
-		Optional<click_callback_t>	click_homepage_callback;
+		Optional<bool>				time_based_media,
+									web_based_media,
+									media_playing;
+		Optional<click_callback_t>	click_callback,
+									click_playmedia_callback,
+									click_homepage_callback;
 		Optional<S32>				max_width;
 		Optional<S32>				padding;
 		Optional<bool>				wrap;
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 48504a1e5400ddf8d1395a253c7b68240aa477b9..a82e6eb372a9f12f3e8f2a87a70803893bd55ee1 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -1953,11 +1953,6 @@ namespace LLInitParam
 			}
 		}
 		
-		if (mData.mValue == NULL)
-		{
-			mData.mValue = LLFontGL::getFontDefault();
-		}
-		
 		// default to current value
 		return mData.mValue;
 	}
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index efb1b0a36f4676f78db39ec94244212a1fa5c6da..5ec07f1941b726439649298358a1152a7f8a3d3f 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -404,6 +404,20 @@ namespace LLInitParam
 		LLUIColor getValueFromBlock() const;
 	};
 
+	// provide a better default for Optional<const LLFontGL*> than NULL
+	template <>
+	struct DefaultInitializer<const LLFontGL*>
+	{
+		// return reference to a single default instance of T
+		// built-in types will be initialized to zero, default constructor otherwise
+		static const LLFontGL* get() 
+		{ 
+			static const LLFontGL* sDefaultFont = LLFontGL::getFontDefault();  
+			return sDefaultFont;
+		} 
+	};
+
+
 	template<>
 	class TypedParam<const LLFontGL*> 
 	:	public BlockValue<const LLFontGL*>
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 0faff5eff682ec4a76b46071d9213330093f584f..08fc8fb7849203697e2e183446b80ba4709356bb 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -42,6 +42,7 @@ static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
 
 LLUICtrl::Params::Params()
 :	tab_stop("tab_stop", true),
+	chrome("chrome", false),
 	label("label"),
 	initial_value("value"),
 	init_callback("init_callback"),
@@ -86,6 +87,7 @@ void LLUICtrl::initFromParams(const Params& p)
 {
 	LLView::initFromParams(p);
 
+	setIsChrome(p.chrome);
 	setControlName(p.control_name);
 	if(p.enabled_controls.isProvided())
 	{
@@ -582,7 +584,6 @@ void LLUICtrl::setIsChrome(BOOL is_chrome)
 // virtual
 BOOL LLUICtrl::getIsChrome() const
 { 
-
 	LLView* parent_ctrl = getParent();
 	while(parent_ctrl)
 	{
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index 45fe47772b52da6577559501a2be98684d0122e0..dd22851100b0f3cf081ed5c32dee8266b1da76e9 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -126,7 +126,8 @@ public:
 	struct Params : public LLInitParam::Block<Params, LLView::Params>
 	{
 		Optional<std::string>			label;
-		Optional<bool>					tab_stop;
+		Optional<bool>					tab_stop,
+										chrome;
 		Optional<LLSD>					initial_value;
 
 		Optional<CommitCallbackParam>	init_callback,
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index a7681e4a1d047bfb72bf3e057c6153fc550cd689..0133d2222d9ef7a9631dee468ed2a70112397bc5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -185,6 +185,7 @@ set(viewer_SOURCE_FILES
     llfloatermediasettings.cpp
     llfloatermemleak.cpp
     llfloaternamedesc.cpp
+	llfloaternearbymedia.cpp
     llfloaternotificationsconsole.cpp
     llfloateropenobject.cpp
     llfloaterparcel.cpp
@@ -665,6 +666,7 @@ set(viewer_HEADER_FILES
     llfloatermediasettings.h
     llfloatermemleak.h
     llfloaternamedesc.h
+	llfloaternearbymedia.h
     llfloaternotificationsconsole.h
     llfloateropenobject.h
     llfloaterparcel.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c0eefaa64253565c13b5a26c2ac28144714d8f16..c4722b772e183c9b37b85c4d3acabdedf7b167a2 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9030,17 +9030,6 @@
       <key>Value</key>
       <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
     </map>
-    <key>UIImgDefaultTattooUUID</key>
-    <map>
-      <key>Comment</key>
-      <string />
-      <key>Persist</key>
-      <integer>0</integer>
-      <key>Type</key>
-      <string>String</string>
-      <key>Value</key>
-      <string>5748decc-f629-461c-9a36-a35a221fe21f</string>
-    </map>
     <key>UIImgDefaultUnderwearUUID</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index ebcda13dd495310df29805b485192122db4f353c..b56e8d1ec2546009a1dcf2d893cec0b5680dc9ef 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -155,6 +155,8 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
 	mPriority = LLViewerFetchedTexture::BOOST_ICON;
 	
 	LLRect rect = p.rect;
+	mDrawWidth  = llmax(32, rect.getWidth()) ;
+	mDrawHeight = llmax(32, rect.getHeight()) ;
 
 	static LLUICachedControl<S32> llavatariconctrl_symbol_hpad("UIAvatariconctrlSymbolHPad", 2);
 	static LLUICachedControl<S32> llavatariconctrl_symbol_vpad("UIAvatariconctrlSymbolVPad", 2);
@@ -193,7 +195,6 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
 		LLIconCtrl::setValue("default_profile_picture.j2c");
 	}
 
-
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 
 	registrar.add("AvatarIcon.Action", boost::bind(&LLAvatarIconCtrl::onAvatarIconContextMenuItemClicked, this, _2));
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 48b5fc11b740f50dcac0260a81da129e164513b7..7bc48185e681190f308b7b007158497e6225a2ca 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -51,7 +51,7 @@ public:
 	/*virtual*/ void	getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const 
 	{
 		// more label always spans width of text box
-		width = mEditor.getTextRect().getWidth(); 
+		width = mEditor.getTextRect().getWidth() - mEditor.getHPad(); 
 		height = llceil(mStyle->getFont()->getLineHeight());
 	}
 	/*virtual*/ S32		getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const 
@@ -153,6 +153,11 @@ void LLExpandableTextBox::LLTextBoxEx::showExpandText()
 {
 	if (!mExpanderVisible)
 	{
+		// make sure we're scrolled to top when collapsing
+		if (mScroller)
+		{
+			mScroller->goToTop();
+		}
 		// get fully visible lines
 		std::pair<S32, S32> visible_lines = getVisibleLines(true);
 		S32 last_line = visible_lines.second - 1;
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index d45527aabb5f8b3d16fd0d628078aaae3762f58c..3fe646c29c6b7765dfbb875b6a6a939748ed58ee 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -68,16 +68,6 @@ protected:
 		 */
 		virtual S32 getVerticalTextDelta();
 
-		/**
-		 * Returns text vertical padding
-		 */
-		virtual S32 getVPad() { return mVPad; }
-
-		/**
-		 * Returns text horizontal padding
-		 */
-		virtual S32 getHPad() { return mHPad; }
-
 		/**
 		 * Shows "More" link
 		 */
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index d734b327d95f86c7e90b69c573da4f82101d67ea..2b134c8c3148c4eac66a7258a3677aceb6407b66 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -246,7 +246,7 @@ protected:
 
 	//atlas
 	LLPointer<LLTextureAtlasSlot> mAtlasInfop ;
-	BOOL                              mUsingAtlas ;
+	BOOL                          mUsingAtlas ;
 	
 protected:
 	static BOOL	sSafeRenderSelect;
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index 216bca8262ceb96bff83b02da00dcefa146f0771..fc8790c1722f664ce1a7235693a6cf735e6d1adb 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -704,7 +704,7 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
 	}
 
 	if (volume->mLODChanged || volume->mFaceMappingChanged ||
-		volume->mVolumeChanged)
+		volume->mVolumeChanged || drawable->isState(LLDrawable::REBUILD_MATERIAL))
 	{
 		volume->regenFaces();
 		volume->mDrawable->setState(LLDrawable::REBUILD_VOLUME);
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 4c83530f43b9784de5a9efdbca99618f02a7dc9b..bd9798c18e144c33fd037dd05c30951c2dbca779 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -34,6 +34,7 @@
 #include "llviewerprecompiledheaders.h"
 #include "llfloatersearch.h"
 #include "llmediactrl.h"
+#include "llagent.h"
 
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
@@ -117,6 +118,14 @@ void LLFloaterSearch::search(const LLSD &key)
 	std::string search_text = key.has("id") ? key["id"].asString() : "";
 	url += std::string("?q=") + search_text;
 
+	// append the maturity and teen capabilities for this agent
+	BOOL godlike = gAgent.isGodlike();
+	bool mature_enabled = gAgent.canAccessMature() || godlike;
+	bool adult_enabled = gAgent.canAccessAdult() || godlike;
+	std::string mature = (mature_enabled) ? "True" : "False";
+	std::string teen = (!adult_enabled) ? "True" : "False";
+	url += "&t=" + teen + "&m=" + mature;
+
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);
 }
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 9a058128475d594e54a819be343c3131ccdd8a35..e63daac4afbff23efa2dedf7c59d47216eb0d1eb 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -517,8 +517,8 @@ void	LLNavigationBar::showTeleportHistoryMenu()
 	// *TODO: why to draw/update anything before showing the menu?
 	mTeleportHistoryMenu->buildDrawLabels();
 	mTeleportHistoryMenu->updateParent(LLMenuGL::sMenuContainer);
-	LLRect btnBackRect = mBtnBack->getRect();
-	LLMenuGL::showPopup(this, mTeleportHistoryMenu, btnBackRect.mLeft, btnBackRect.mBottom);
+	const S32 MENU_SPAWN_PAD = -1;
+	LLMenuGL::showPopup(mBtnBack, mTeleportHistoryMenu, 0, MENU_SPAWN_PAD);
 
 	// *HACK pass the mouse capturing to the drop-down menu
 	gFocusMgr.setMouseCapture( NULL );
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 6a3617f008440f420b8a2ab223ed56ba006d1f6d..a198499b47ede597beb9122cb7e7abfe2bd49392 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -134,6 +134,11 @@ void LLPanelMediaSettingsGeneral::draw()
 		LLPluginClassMedia* media_plugin = mPreviewMedia->getMediaPlugin();
 		if( media_plugin )
 		{
+			// turn off volume (if we can) for preview. Note: this really only
+			// works for QuickTime movies right now - no way to control the 
+			// volume of a flash app embedded in a page for example
+			media_plugin->setVolume( 0 );
+
 			// some controls are only appropriate for time or browser type plugins
 			// so we selectively enable/disable them - need to do it in draw
 			// because the information from plugins arrives assynchronously
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index aa6909560dd59a2372a609eed38f79b89a0af220..6181531f82e1968ed1b2109409527144e91360f1 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -73,10 +73,10 @@ LLPanelPicks::LLPanelPicks()
 	mPopupMenu(NULL),
 	mProfilePanel(NULL),
 	mPickPanel(NULL),
-	mPicksList(NULL)
-	, mPanelPickInfo(NULL)
-	, mPanelPickEdit(NULL)
-	, mOverflowMenu(NULL)
+	mPicksList(NULL),
+	mPanelPickInfo(NULL),
+	mPanelPickEdit(NULL),
+	mOverflowMenu(NULL)
 {
 }
 
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index dace3f875f553c44598c9f84c31d3d86a6645821..9ca2d3f61d8e18b7551366cfe184b31aa88a90cd 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -80,6 +80,7 @@
 #include "llfloatermap.h"
 #include "llfloatermemleak.h"
 #include "llfloaternamedesc.h"
+#include "llfloaternearbymedia.h"
 #include "llfloaternotificationsconsole.h"
 #include "llfloateropenobject.h"
 #include "llfloaterpay.h"
@@ -187,6 +188,8 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("mute_object_by_name", "floater_mute_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGetBlockedObjectName>);
 	LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>);
 	LLFloaterReg::add("syswell_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLSysWellWindow>);
+
+	LLFloaterReg::add("nearby_media", "floater_nearby_media.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNearbyMedia>);
 	
 	LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
 
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index e2d9f5a2c9a7f6f872ec9964a8948f04eff80572..e89f17cf7298ae364e7393d71377aede5978f81f 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -168,8 +168,7 @@ public:
 		viewer_media_t mMediaImpl;
 		bool mInitialized;
 };
-typedef std::vector<LLViewerMediaImpl*> impl_list;
-static impl_list sViewerMediaImplList;
+static LLViewerMedia::impl_list sViewerMediaImplList;
 static LLTimer sMediaCreateTimer;
 static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f;
 static F32 sGlobalVolume = 1.0f;
@@ -183,8 +182,8 @@ static void add_media_impl(LLViewerMediaImpl* media)
 //////////////////////////////////////////////////////////////////////////////////////////
 static void remove_media_impl(LLViewerMediaImpl* media)
 {
-	impl_list::iterator iter = sViewerMediaImplList.begin();
-	impl_list::iterator end = sViewerMediaImplList.end();
+	LLViewerMedia::impl_list::iterator iter = sViewerMediaImplList.begin();
+	LLViewerMedia::impl_list::iterator end = sViewerMediaImplList.end();
 	
 	for(; iter != end; iter++)
 	{
@@ -203,6 +202,7 @@ class LLViewerMediaMuteListObserver : public LLMuteListObserver
 
 static LLViewerMediaMuteListObserver sViewerMediaMuteListObserver;
 static bool sViewerMediaMuteListObserverInitialized = false;
+static bool sInWorldMediaDisabled = false;
 
 
 //////////////////////////////////////////////////////////////////////////////////////////
@@ -428,15 +428,34 @@ void LLViewerMedia::muteListChanged()
 	}
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setInWorldMediaDisabled(bool disabled)
+{
+	sInWorldMediaDisabled = disabled;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::getInWorldMediaDisabled()
+{
+	return sInWorldMediaDisabled;
+}
+
+LLViewerMedia::impl_list &LLViewerMedia::getPriorityList()
+{
+	return sViewerMediaImplList;
+}
+
 // This is the predicate function used to sort sViewerMediaImplList by priority.
-static inline bool compare_impl_interest(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
+bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
 {
-	if(i1->mIsMuted || i1->mMediaSourceFailed)
+	if(i1->isForcedUnloaded())
 	{
 		// Muted or failed items always go to the end of the list, period.
 		return false;
 	}
-	else if(i2->mIsMuted || i2->mMediaSourceFailed)
+	else if(i2->isForcedUnloaded())
 	{
 		// Muted or failed items always go to the end of the list, period.
 		return true;
@@ -483,7 +502,7 @@ void LLViewerMedia::updateMedia()
 	}
 		
 	// Sort the static instance list using our interest criteria
-	std::stable_sort(sViewerMediaImplList.begin(), sViewerMediaImplList.end(), compare_impl_interest);
+	std::stable_sort(sViewerMediaImplList.begin(), sViewerMediaImplList.end(), priorityComparitor);
 
 	// Go through the list again and adjust according to priority.
 	iter = sViewerMediaImplList.begin();
@@ -493,6 +512,7 @@ void LLViewerMedia::updateMedia()
 	int impl_count_total = 0;
 	int impl_count_interest_low = 0;
 	int impl_count_interest_normal = 0;
+	int i = 0;
 
 #if 0	
 	LL_DEBUGS("PluginPriority") << "Sorted impls:" << llendl;
@@ -515,7 +535,7 @@ void LLViewerMedia::updateMedia()
 		
 		LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
 
-		if(pimpl->mIsMuted || pimpl->mMediaSourceFailed || (impl_count_total > (int)max_instances))
+		if(pimpl->isForcedUnloaded() || (impl_count_total > (int)max_instances))
 		{
 			// Never load muted or failed impls.
 			// Hard limit on the number of instances that will be loaded at one time
@@ -583,6 +603,17 @@ void LLViewerMedia::updateMedia()
 		}
 		
 		pimpl->setPriority(new_priority);
+		
+		if(pimpl->getUsedInUI())
+		{
+			// Any impls used in the UI should not be in the proximity list.
+			pimpl->mProximity = -1;
+		}
+		else
+		{
+			// Other impls just get the same ordering as the priority list (for now).
+			pimpl->mProximity = i;
+		}
 
 #if 0		
 		LL_DEBUGS("PluginPriority") << "    " << pimpl 
@@ -595,6 +626,8 @@ void LLViewerMedia::updateMedia()
 #endif
 
 		total_cpu += pimpl->getCPUUsage();
+		
+		i++;
 	}
 	
 	LL_DEBUGS("PluginPriority") << "Total reported CPU usage is " << total_cpu << llendl;
@@ -641,6 +674,8 @@ LLViewerMediaImpl::LLViewerMediaImpl(	  const LLUUID& texture_id,
 	mNeedsMuteCheck(false),
 	mPreviousMediaState(MEDIA_NONE),
 	mPreviousMediaTime(0.0f),
+	mIsDisabled(false),
+	mProximity(-1),
 	mIsUpdated(false)
 { 
 
@@ -1562,7 +1597,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
 
 
 //////////////////////////////////////////////////////////////////////////////////////////
-LLUUID LLViewerMediaImpl::getMediaTextureID()
+LLUUID LLViewerMediaImpl::getMediaTextureID() const
 {
 	return mTextureId;
 }
@@ -1649,6 +1684,27 @@ void LLViewerMediaImpl::resetPreviousMediaState()
 	mPreviousMediaTime = 0.0f;
 }
 
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isForcedUnloaded() const
+{
+	if(mIsMuted || mMediaSourceFailed || mIsDisabled)
+	{
+		return true;
+	}
+	
+	if(sInWorldMediaDisabled)
+	{
+		// When inworld media is disabled, all instances that aren't marked as "used in UI" will not be loaded.
+		if(!mUsedInUI)
+		{
+			return true;
+		}
+	}
+	
+	return false;
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event)
 {
@@ -2017,6 +2073,19 @@ const std::list< LLVOVolume* >* LLViewerMediaImpl::getObjectList() const
 	return &mObjectList ;
 }
 
+LLVOVolume *LLViewerMediaImpl::getSomeObject()
+{
+	LLVOVolume *result = NULL;
+	
+	std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ;
+	if(iter != mObjectList.end())
+	{
+		result = *iter;
+	}
+	
+	return result;
+}
+
 //////////////////////////////////////////////////////////////////////////////////////////
 //static
 void LLViewerMedia::toggleMusicPlay(void*)
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 5444abf854800050d91fe7137f9bb840567263e4..dac04820783c06c6d66bbc9b3e8eec885ba4e8ce 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -66,10 +66,15 @@ private:
 	observerListType mObservers;
 };
 
+class LLViewerMediaImpl;
+
 class LLViewerMedia
 {
 	LOG_CLASS(LLViewerMedia);
 	public:
+
+		typedef std::vector<LLViewerMediaImpl*> impl_list;
+
 		// Special case early init for just web browser component
 		// so we can show login screen.  See .cpp file for details. JC
 
@@ -97,6 +102,14 @@ class LLViewerMedia
 		static void mediaStop(void*);
 		static F32 getVolume();	
 		static void muteListChanged();
+		static void setInWorldMediaDisabled(bool disabled);
+		static bool getInWorldMediaDisabled();
+				
+		// Returns the priority-sorted list of all media impls.
+		static impl_list &getPriorityList();
+		
+		// This is the comparitor used to sort the list.
+		static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2);
 };
 
 // Implementation functions not exported into header file
@@ -159,7 +172,7 @@ public:
 	bool handleUnicodeCharHere(llwchar uni_char);
 	bool canNavigateForward();
 	bool canNavigateBack();
-	std::string getMediaURL() { return mMediaURL; }
+	std::string getMediaURL() const { return mMediaURL; }
 	std::string getCurrentMediaURL();
 	std::string getHomeURL() { return mHomeURL; }
     void setHomeURL(const std::string& home_url) { mHomeURL = home_url; };
@@ -168,7 +181,7 @@ public:
 
 	void update();
 	void updateImagesMediaStreams();
-	LLUUID getMediaTextureID();
+	LLUUID getMediaTextureID() const;
 	
 	void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; };
 	void setVisible(bool visible);
@@ -179,6 +192,12 @@ public:
 	bool hasMedia();
 	bool isMediaFailed() { return mMediaSourceFailed; };
 	void resetPreviousMediaState();
+	
+	void setDisabled(bool disabled) { mIsDisabled = disabled; };
+	bool isMediaDisabled() { return mIsDisabled; };
+
+	// returns true if this instance should not be loaded (disabled, muted object, crashed, etc.)
+	bool isForcedUnloaded() const;
 
 	ECursorType getLastSetCursor() { return mLastSetCursor; };
 	
@@ -231,6 +250,7 @@ public:
 	void addObject(LLVOVolume* obj) ;
 	void removeObject(LLVOVolume* obj) ;
 	const std::list< LLVOVolume* >* getObjectList() const ;
+	LLVOVolume *getSomeObject();
 	void setUpdated(BOOL updated) ;
 	BOOL isUpdated() ;
 	
@@ -238,6 +258,7 @@ public:
 	void calculateInterest();
 	F64 getInterest() const { return mInterest; };
 	F64 getApproximateTextureInterest();
+	S32 getProximity() { return mProximity; };
 	
 	// Mark this object as being used in a UI panel instead of on a prim
 	// This will be used as part of the interest sorting algorithm.
@@ -301,6 +322,8 @@ public:
 	bool mNeedsMuteCheck;
 	int mPreviousMediaState;
 	F64 mPreviousMediaTime;
+	bool mIsDisabled;
+	S32 mProximity;
 
 private:
 	BOOL mIsUpdated ;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index 0ef4679057e0404236e5acb1e4ae9809dd500991..2f7040aaa30b19ccb054c2e70e3019cf2c7299aa 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -50,6 +50,7 @@
 #include "llmediaentry.h"
 #include "llkeyboard.h"
 #include "lltoolmgr.h"
+#include "llvovolume.h"
 
 //
 // LLViewerMediaFocus
@@ -473,3 +474,46 @@ LLViewerObject* LLViewerMediaFocus::getHoverObject()
 {
 	return gObjectList.findObject(mHoverObjectID);
 }
+
+void LLViewerMediaFocus::focusZoomOnMedia(LLUUID media_id)
+{
+	LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(media_id);
+	
+	if(impl)
+	{	
+		// Get the first object from the media impl's object list.  This is completely arbitrary, but should suffice.
+		LLVOVolume *obj = impl->getSomeObject();
+		if(obj)
+		{
+			// This media is attached to at least one object.  Figure out which face it's on.
+			S32 face = obj->getFaceIndexWithMediaImpl(impl, -1);
+			
+			// We don't have a proper pick normal here, and finding a face's real normal is... complicated.
+			// For now, use +z to look at the top of the object.
+			LLVector3 normal(0.0f, 0.0f, 1.0f);
+			
+			// Attempt to focus/zoom on that face.
+			setFocusFace(obj, face, impl, normal);
+			
+			if(mMediaControls.get())
+			{
+				mMediaControls.get()->resetZoomLevel();
+				mMediaControls.get()->nextZoomLevel();
+			}
+		}
+	}
+}
+
+LLUUID LLViewerMediaFocus::getControlsMediaID()
+{
+	if(getFocusedMediaImpl())
+	{
+		return mFocusedImplID;
+	}
+	else if(getHoverMediaImpl())
+	{
+		return mHoverImplID;
+	}
+	
+	return LLUUID::null;
+}
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index c1179de39d30734a5633a9e5f3f2fa0017863870..e5f36d341c482f9b00250ea2e82d7498ed56c6fa 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -81,6 +81,12 @@ public:
 	LLViewerMediaImpl* getHoverMediaImpl();
 	LLViewerObject* getHoverObject();
 	S32 getHoverFace() { return mHoverObjectFace; }
+	
+	// Try to focus/zoom on the specified media (if it's on an object in world).
+	void focusZoomOnMedia(LLUUID media_id);
+	
+	// Return the ID of the media instance the controls are currently attached to (either focus or hover).
+	LLUUID getControlsMediaID();
 
 protected:
 	/*virtual*/ void	onFocusReceived();
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index e5c53c91c90b03feff444d15dee23a9337dffedf..758bf8c1aa012d501fe5e7a6cceba660788b76e9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -93,6 +93,7 @@ BOOL LLViewerTexture::sUseTextureAtlas        = FALSE ;
 
 const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by
 const F32 desired_discard_bias_max = 1.5f; // max number of levels to reduce image quality by
+const F64 log_2 = log(2.0);
 
 //----------------------------------------------------------------------------------------------
 //namespace: LLViewerTextureAccess
@@ -134,7 +135,7 @@ LLViewerMediaTexture*  LLViewerTextureManager::getMediaTexture(const LLUUID& id,
 	return tex ;
 }
 
-LLViewerFetchedTexture* LLViewerTextureManager::staticCastToFetchedTexture(LLViewerTexture* tex, BOOL report_error)
+LLViewerFetchedTexture* LLViewerTextureManager::staticCastToFetchedTexture(LLTexture* tex, BOOL report_error)
 {
 	if(!tex)
 	{
@@ -415,6 +416,7 @@ void LLViewerTexture::init(bool firstinit)
 	mDontDiscard = FALSE;
 	mMaxVirtualSize = 0.f;
 	mNeedsResetMaxVirtualSize = FALSE ;
+	mParcelMedia = NULL ;
 }
 
 //virtual 
@@ -522,6 +524,12 @@ F32 LLViewerTexture::getMaxVirtualSize()
 	return mMaxVirtualSize ;
 }
 
+//virtual 
+void LLViewerTexture::setKnownDrawSize(S32 width, S32 height)
+{
+	//nothing here.
+}
+
 //virtual
 void LLViewerTexture::addFace(LLFace* facep) 
 {
@@ -852,6 +860,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
 
 	mKnownDrawWidth = 0;
 	mKnownDrawHeight = 0;
+	mKnownDrawSizeChanged = FALSE ;
 
 	if (firstinit)
 	{
@@ -1084,10 +1093,17 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
 }
 
 // Call with 0,0 to turn this feature off.
+//virtual
 void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)
 {
-	mKnownDrawWidth = width;
-	mKnownDrawHeight = height;
+	if(mKnownDrawWidth != width || mKnownDrawHeight != height)
+	{
+		mKnownDrawWidth = width;
+		mKnownDrawHeight = height;
+
+		mKnownDrawSizeChanged = TRUE ;
+		mFullyLoaded = FALSE ;
+	}
 	addTextureStats((F32)(width * height));
 }
 
@@ -1104,13 +1120,26 @@ void LLViewerFetchedTexture::processTextureStats()
 		mDesiredDiscardLevel = 	getMaxDiscardLevel() ;
 	}
 	else
-	{
-		mDesiredDiscardLevel = 0;
-		if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+	{	
+		if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight)
 		{
-			mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+			if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT)
+			{
+				mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048
+			}
+			else
+			{
+				mDesiredDiscardLevel = 0;
+			}
 		}
-
+		else if(mKnownDrawSizeChanged)//known draw size is set
+		{			
+			mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2, 
+					                             log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;
+			mDesiredDiscardLevel = 	llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ;
+		}
+		mKnownDrawSizeChanged = FALSE ;
+		
 		if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel))
 		{
 			mFullyLoaded = TRUE ;
@@ -1121,8 +1150,6 @@ void LLViewerFetchedTexture::processTextureStats()
 //texture does not have any data, so we don't know the size of the image, treat it like 32 * 32.
 F32 LLViewerFetchedTexture::calcDecodePriorityForUnknownTexture(F32 pixel_priority)
 {
-	static const F64 log_2 = log(2.0);
-
 	F32 desired = (F32)(log(32.0/pixel_priority) / log_2);
 	S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired + 1;
 	ddiscard = llclamp(ddiscard, 1, 9);
@@ -1169,7 +1196,7 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
 		// Don't decode anything we don't need
 		priority = -1.0f;
 	}
-	else if (mBoostLevel == LLViewerTexture::BOOST_UI && !have_all_data)
+	else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data)
 	{
 		priority = 1.f;
 	}
@@ -2121,22 +2148,29 @@ void LLViewerMediaTexture::updateClass()
 {
 	static const F32 MAX_INACTIVE_TIME = 30.f ;
 
+#if 0
+	//force to play media.
+	gSavedSettings.setBOOL("AudioSteamingMedia", true) ;
+	gSavedSettings.setBOOL("AudioStreamingVideo", true) ;
+#endif
+
 	for(media_map_t::iterator iter = sMediaMap.begin() ; iter != sMediaMap.end(); )
 	{
 		LLViewerMediaTexture* mediap = iter->second;	
-
-		//
-		//Note: delay some time to delete the media textures to stop endlessly creating and immediately removing media texture.
-		//
-		if(mediap->getNumRefs() == 1 && mediap->getLastReferencedTimer()->getElapsedTimeF32() > MAX_INACTIVE_TIME) //one by sMediaMap
-		{
-			media_map_t::iterator cur = iter++ ;
-			sMediaMap.erase(cur) ;
-		}
-		else
+		
+		if(mediap->getNumRefs() == 1) //one reference by sMediaMap
 		{
-			++iter ;
+			//
+			//Note: delay some time to delete the media textures to stop endlessly creating and immediately removing media texture.
+			//
+			if(mediap->getLastReferencedTimer()->getElapsedTimeF32() > MAX_INACTIVE_TIME)
+			{
+				media_map_t::iterator cur = iter++ ;
+				sMediaMap.erase(cur) ;
+				continue ;
+			}
 		}
+		++iter ;
 	}
 }
 
@@ -2189,11 +2223,22 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
 	mIsPlaying = FALSE ;
 
 	setMediaImpl() ;
+
+	LLViewerTexture* tex = gTextureList.findImage(mID) ;
+	if(tex) //this media is a parcel media for tex.
+	{
+		tex->setParcelMedia(this) ;
+	}
 }
 
 //virtual 
 LLViewerMediaTexture::~LLViewerMediaTexture() 
 {	
+	LLViewerTexture* tex = gTextureList.findImage(mID) ;
+	if(tex) //this media is a parcel media for tex.
+	{
+		tex->setParcelMedia(NULL) ;
+	}
 }
 
 void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)
@@ -2244,10 +2289,9 @@ BOOL LLViewerMediaTexture::findFaces()
 	mMediaFaceList.clear() ;
 
 	BOOL ret = TRUE ;
-
-	//for parcel media
-	LLViewerTexture* tex = gTextureList.findImage(mID) ;	
-	if(tex)
+	
+	LLViewerTexture* tex = gTextureList.findImage(mID) ;
+	if(tex) //this media is a parcel media for tex.
 	{
 		const ll_face_list_t* face_list = tex->getFaceList() ;
 		for(ll_face_list_t::const_iterator iter = face_list->begin(); iter != face_list->end(); ++iter)
@@ -2358,7 +2402,7 @@ void LLViewerMediaTexture::addFace(LLFace* facep)
 		mTextureList.push_back(facep->getTexture()) ; //a parcel media.
 		return ;
 	}
-
+	
 	llerrs << "The face does not have a valid texture before media texture." << llendl ;
 }
 
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 480e1c1cbcc2d38bd429210f6e0fea26a85063ca..020478beef2c6026ebebe3a9d694df1ff1236f82 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -163,6 +163,7 @@ public:
 	
 	S32 getFullWidth() const { return mFullWidth; }
 	S32 getFullHeight() const { return mFullHeight; }	
+	/*virtual*/ void setKnownDrawSize(S32 width, S32 height);
 
 	virtual void addFace(LLFace* facep) ;
 	virtual void removeFace(LLFace* facep) ; 
@@ -220,6 +221,10 @@ public:
 	BOOL getDontDiscard() const { return mDontDiscard; }
 	//-----------------	
 	
+	void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;}
+	BOOL hasParcelMedia() const { return mParcelMedia != NULL;}
+	LLViewerMediaTexture* getParcelMedia() const { return mParcelMedia;}
+
 	/*virtual*/ void updateBindStatsForTester() ;
 protected:
 	void cleanup() ;
@@ -246,6 +251,9 @@ protected:
 	LLPointer<LLImageGL> mGLTexturep ;
 	S8 mDontDiscard;			// Keep full res version of this image (for UI, etc)
 
+	//do not use LLPointer here.
+	LLViewerMediaTexture* mParcelMedia ;
+
 protected:
 	typedef enum 
 	{
@@ -357,7 +365,7 @@ public:
 	// Override the computation of discard levels if we know the exact output
 	// size of the image.  Used for UI textures to not decode, even if we have
 	// more data.
-	void setKnownDrawSize(S32 width, S32 height);
+	/*virtual*/ void setKnownDrawSize(S32 width, S32 height);
 
 	void setIsMissingAsset();
 	/*virtual*/ BOOL isMissingAsset()	const		{ return mIsMissingAsset; }
@@ -406,6 +414,8 @@ private:
 	BOOL  mFullyLoaded;
 
 protected:		
+	std::string mLocalFileName;
+
 	S32 mOrigWidth;
 	S32 mOrigHeight;
 
@@ -413,8 +423,7 @@ protected:
 	// Used for UI textures to not decode, even if we have more data.
 	S32 mKnownDrawWidth;
 	S32	mKnownDrawHeight;
-
-	std::string mLocalFileName;
+	BOOL mKnownDrawSizeChanged ;
 
 	S8  mDesiredDiscardLevel;			// The discard level we'd LIKE to have - if we have it and there's space	
 	S8  mMinDesiredDiscardLevel;	// The minimum discard level we'd like to have
@@ -570,7 +579,7 @@ public:
 	static LLTexturePipelineTester* sTesterp ;
 
 	//returns NULL if tex is not a LLViewerFetchedTexture nor derived from LLViewerFetchedTexture.
-	static LLViewerFetchedTexture*    staticCastToFetchedTexture(LLViewerTexture* tex, BOOL report_error = FALSE) ;
+	static LLViewerFetchedTexture*    staticCastToFetchedTexture(LLTexture* tex, BOOL report_error = FALSE) ;
 
 	//
 	//"find-texture" just check if the texture exists, if yes, return it, otherwise return null.
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index ba32e0746429892dd6fb17a8c62dc02a9858c83a..b574a9c110d1e9215d6a125d67cf04442d5112b3 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -2424,19 +2424,35 @@ void LLViewerWindow::updateUI()
 	BOOL handled_by_top_ctrl = FALSE;
 	LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
 	LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
+	LLView* captor_view = dynamic_cast<LLView*>(mouse_captor);
+
+	//FIXME: only include captor and captor's ancestors if mouse is truly over them --RN
 
 	//build set of views containing mouse cursor by traversing UI hierarchy and testing 
 	//screen rect against mouse cursor
 	view_handle_set_t mouse_hover_set;
 
-	// start at current mouse captor (if is a view) or UI root
-	LLView* root_view = NULL;
-	root_view = dynamic_cast<LLView*>(mouse_captor);
+	// constraint mouse enter events to children of mouse captor
+	LLView* root_view = captor_view;
+
+	// if mouse captor doesn't exist or isn't a LLView
+	// then allow mouse enter events on entire UI hierarchy
 	if (!root_view)
 	{
 		root_view = mRootView;
 	}
 
+	// include all ancestors of captor_view as automatically having mouse
+	if (captor_view)
+	{
+		LLView* captor_parent_view = captor_view->getParent();
+		while(captor_parent_view)
+		{
+			mouse_hover_set.insert(captor_parent_view->getHandle());
+			captor_parent_view = captor_parent_view->getParent();
+		}
+	}
+
 	// aggregate visible views that contain mouse cursor in display order
 
 	// while the top_ctrl contains the mouse cursor, only it and its descendants will receive onMouseEnter events
diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp
index 17b502ae80e9c51f914fd99948a2c79b0648a638..5624f19c8d040fffc9e74db8387f8949c699a68c 100644
--- a/indra/newview/llvoavatardefines.cpp
+++ b/indra/newview/llvoavatardefines.cpp
@@ -68,9 +68,9 @@ LLVOAvatarDictionary::Textures::Textures()
 	addEntry(TEX_EYES_ALPHA,                  new TextureEntry("eyes_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
 	addEntry(TEX_HAIR_ALPHA,                  new TextureEntry("hair_alpha",       TRUE,  BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID",     WT_ALPHA));
 
-	addEntry(TEX_HEAD_TATTOO,                 new TextureEntry("head_tattoo",      TRUE,  BAKED_NUM_INDICES, "UIImgDefaultTattooUUID",     WT_TATTOO));
-	addEntry(TEX_UPPER_TATTOO,                new TextureEntry("upper_tattoo",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultTattooUUID",     WT_TATTOO));
-	addEntry(TEX_LOWER_TATTOO,                new TextureEntry("lower_tattoo",     TRUE,  BAKED_NUM_INDICES, "UIImgDefaultTattooUUID",     WT_TATTOO));
+	addEntry(TEX_HEAD_TATTOO,                 new TextureEntry("head_tattoo",      TRUE,  BAKED_NUM_INDICES, "",     WT_TATTOO));
+	addEntry(TEX_UPPER_TATTOO,                new TextureEntry("upper_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     WT_TATTOO));
+	addEntry(TEX_LOWER_TATTOO,                new TextureEntry("lower_tattoo",     TRUE,  BAKED_NUM_INDICES, "",     WT_TATTOO));
 
 	addEntry(TEX_HEAD_BAKED,                  new TextureEntry("head-baked",       FALSE, BAKED_HEAD));
 	addEntry(TEX_UPPER_BAKED,                 new TextureEntry("upper-baked",      FALSE, BAKED_UPPER));
@@ -248,8 +248,6 @@ EBakedTextureIndex LLVOAvatarDictionary::findBakedByRegionName(std::string name)
 //static
 const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index)
 {
-	/* switch( index )
-		case TEX_UPPER_SHIRT:		return LLUUID( gSavedSettings.getString("UIImgDefaultShirtUUID") ); */
 	const TextureEntry *texture_dict = getInstance()->getTexture(index);
 	const std::string &default_image_name = texture_dict->mDefaultImageName;
 	if (default_image_name == "")
@@ -265,9 +263,6 @@ const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index)
 // static
 EWearableType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index )
 {
-	/* switch(index)
-		case TEX_UPPER_SHIRT:
-			return WT_SHIRT; */
 	return getInstance()->getTexture(index)->mWearableType;
 }
 
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 7585842623bee5b7886487e6473cf9db12ff07c3..143cd2d9c63a3d5540041c0884f428ada43d2418 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -249,6 +249,12 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 		facep->mCenterLocal = part->mPosAgent;
 		facep->setFaceColor(part->mColor);
 		facep->setTexture(part->mImagep);
+			
+		//check if this particle texture is replaced by a parcel media texture.
+		if(part->mImagep.notNull() && part->mImagep->hasParcelMedia()) 
+		{
+			part->mImagep->getParcelMedia()->addMediaToFace(facep) ;
+		}
 
 		mPixelArea = tot_area * pixel_meter_ratio;
 		const F32 area_scale = 10.f; // scale area to increase priority a bit
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 6e22472153c9760606999e22c1fa27d9e7af5f67..1e0da1316285f7e2e48bde1a9247f9f126c79788 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -65,6 +65,9 @@
 	<color
 	 name="Blue"
 	 value="0 0 1 1" />
+	<color
+	 name="Yellow"
+	 value="1 1 0 1" />
 	<color
 	 name="Unused?"
 	 value="1 0 1 1" />
@@ -411,7 +414,7 @@
      reference="Green" />
     <color
      name="MapAvatarFriendColor"
-     reference="Unused?" />
+     reference="Yellow" />
     <color
      name="MapAvatarSelfColor"
      value="0.53125 0 0.498047 1" />
diff --git a/indra/newview/skins/default/textures/icons/ForSale_Badge.png b/indra/newview/skins/default/textures/icons/ForSale_Badge.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bee570ceec1a244255e9ae06fb6370bca1fe3f1
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/ForSale_Badge.png differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Object_Small.png b/indra/newview/skins/default/textures/icons/Generic_Object_Small.png
new file mode 100644
index 0000000000000000000000000000000000000000..223874e631ad021ce7617e6dcb4399d171081b09
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Generic_Object_Small.png differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.png b/indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2ae828efce3a91bf2b53d792f8c696ad6e16657
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Inv_LookFolderClosed.png differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.png b/indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.png
new file mode 100644
index 0000000000000000000000000000000000000000..d454d4cd4813337daca2cf0286be8f5111cfa8d4
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Inv_LookFolderOpen.png differ
diff --git a/indra/newview/skins/default/textures/icons/YouAreHere_Badge.png b/indra/newview/skins/default/textures/icons/YouAreHere_Badge.png
new file mode 100644
index 0000000000000000000000000000000000000000..c057e9743d08febb5beb3a5a80f46a4db2aeed56
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/YouAreHere_Badge.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index fdc7deab1c047de08f2e8041881e3d869aa98bde..82c994b150e4de11d13319a370f24e553317bc95 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -93,11 +93,15 @@
   <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" />
   <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" />
 
+  <texture name="ForSale_Badge" file_name="icons/ForSale_Badge.png" preload="false" />
   <texture name="ForwardArrow_Off" file_name="icons/ForwardArrow_Off.png" preload="false" />
   <texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
 
   <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_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" />
 
@@ -161,6 +165,8 @@
   <texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
   <texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
   <texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
+  <texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
+  <texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
   <texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
   <texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
   <texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
@@ -254,6 +260,42 @@
   <texture name="Overhead_M" file_name="world/Overhead_M.png" preload="false" />
   <texture name="Overhead_S" file_name="world/Overhead_S.png" preload="false" />
 
+  <texture name="parcel_drk_Build" file_name="icons/parcel_drk_Build.png" preload="false" />
+ <texture name="parcel_drk_BuildNo" file_name="icons/parcel_drk_BuildNo.png" preload="false" />
+ <texture name="parcel_drk_Damage" file_name="icons/parcel_drk_Damage.png" preload="false" />
+ <texture name="parcel_drk_DamageNo" file_name="icons/parcel_drk_DamageNo.png" preload="false" />
+ <texture name="parcel_drk_Fly" file_name="icons/parcel_drk_Fly.png" preload="false" />
+ <texture name="parcel_drk_FlyNo" file_name="icons/parcel_drk_FlyNo.png" preload="false" />
+ <texture name="parcel_drk_ForSale" file_name="icons/parcel_drk_ForSale.png" preload="false" />
+ <texture name="parcel_drk_ForSaleNo" file_name="icons/parcel_drk_ForSaleNo.png" preload="false" />
+ <texture name="parcel_drk_M" file_name="icons/parcel_drk_M.png" preload="false" />
+ <texture name="parcel_drk_PG" file_name="icons/parcel_drk_PG.png" preload="false" />
+ <texture name="parcel_drk_Push" file_name="icons/parcel_drk_Push.png" preload="false" />
+ <texture name="parcel_drk_PushNo" file_name="icons/parcel_drk_PushNo.png" preload="false" />
+ <texture name="parcel_drk_R" file_name="icons/parcel_drk_R.png" preload="false" />
+ <texture name="parcel_drk_Scripts" file_name="icons/parcel_drk_Scripts.png" preload="false" />
+ <texture name="parcel_drk_ScriptsNo" file_name="icons/parcel_drk_ScriptsNo.png" preload="false" />
+ <texture name="parcel_drk_Voice" file_name="icons/parcel_drk_Voice.png" preload="false" />
+ <texture name="parcel_drk_VoiceNo" file_name="icons/parcel_drk_VoiceNo.png" preload="false" />
+
+ <texture name="parcel_lght_Build" file_name="icons/parcel_lght_Build.png" preload="false" />
+ <texture name="parcel_lght_BuildNo" file_name="icons/parcel_lght_BuildNo.png" preload="false" />
+ <texture name="parcel_lght_Damage" file_name="icons/parcel_lght_Damage.png" preload="false" />
+ <texture name="parcel_lght_DamageNo" file_name="icons/parcel_lght_DamageNo.png" preload="false" />
+ <texture name="parcel_lght_Fly" file_name="icons/parcel_lght_Fly.png" preload="false" />
+ <texture name="parcel_lght_FlyNo" file_name="icons/parcel_lght_FlyNo.png" preload="false" />
+ <texture name="parcel_lght_ForSale" file_name="icons/parcel_lght_ForSale.png" preload="false" />
+ <texture name="parcel_lght_ForSaleNo" file_name="icons/parcel_lght_ForSaleNo.png" preload="false" />
+ <texture name="parcel_lght_M" file_name="icons/parcel_lght_M.png" preload="false" />
+ <texture name="parcel_lght_PG" file_name="icons/parcel_lght_PG.png" preload="false" />
+ <texture name="parcel_lght_Push" file_name="icons/parcel_lght_Push.png" preload="false" />
+ <texture name="parcel_lght_PushNo" file_name="icons/parcel_lght_PushNo.png" preload="false" />
+ <texture name="parcel_lght_R" file_name="icons/parcel_lght_R.png" preload="false" />
+ <texture name="parcel_lght_Scripts" file_name="icons/parcel_lght_Scripts.png" preload="false" />
+ <texture name="parcel_lght_ScriptsNo" file_name="icons/parcel_lght_ScriptsNo.png" preload="false" />
+ <texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" />
+ <texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" />
+
   <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
   <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
   <texture name="Progress_3" file_name="icons/Progress_3.png" preload="false" />
@@ -433,15 +475,17 @@
   <texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" />
   <texture name="Widget_UpArrow" file_name="icons/Widget_UpArrow.png" preload="true" />
 
-  <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true" 
+  <texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
            scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
-  <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true" 
+  <texture name="Window_Foreground" file_name="windows/Window_Foreground.png" preload="true"
            scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
   <texture name="Window_NoTitle_Background" file_name="windows/Window_NoTitle_Background.png" preload="true"
            scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
   <texture name="Window_NoTitle_Foreground" file_name="windows/Window_NoTitle_Foreground.png" preload="true"
            scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
 
+  <texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
+
   <!--WARNING OLD ART *do not use*-->
 
  <texture name="Banner_ForSale" file_name="Banner_ForSale.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index a59a8b065ff342d8d68e2f2032e8d26c905981d9..3f63f493b14b581254b85c79beb0a7e24104ecf9 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -167,6 +167,18 @@
              function="Floater.Toggle"
              parameter="active_speakers" />
         </menu_item_check>
+        <menu_item_check
+         label="Nearby Media"
+         layout="topleft"
+         name="Nearby Media"
+         shortcut="control|alt|N">
+            <menu_item_check.on_check
+             function="Floater.Visible"
+             parameter="nearby_media" />
+            <menu_item_check.on_click
+             function="Floater.Toggle"
+             parameter="nearby_media" />
+        </menu_item_check>
         <!--menu_item_check
          label="Block List"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 9bf684f1fdeecf43d8f2a6c14912e639e66c1fc2..9bf3458d298d275e7a88fbe62b7c5195cb647667 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -10,6 +10,7 @@
  left="0"
  name="bottom_tray"
  top="28"
+ chrome="true" 
  border_visible="false"
  width="1000">
     <layout_stack
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index 1074dd46276bd12fa044f412de3d77ebd7f28ff7..38ea6b6196e4665a30e78bd22f13890d41385782 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -57,7 +57,7 @@
      use_ellipses="false"
      width="197"
      word_wrap="false" />
-    <text
+    <expandable_text
      follows="top|left|right"
      font="SansSerifSmall"
      height="40"
diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
index 319beac291ee3491fe29af03bc6a4292ceedbb5b..f59c46b2f5c6a0e963ef8654d858face13c41684 100644
--- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
@@ -3,7 +3,7 @@
  max_height="300" >
  <textbox
    more_label="More" 
-  follows="left|top"
+  follows="left|top|right"
   name="text"
    allow_scroll="true" 
   use_ellipses="true"
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 1bd5a5bda26c69745ed6570ca2d384d9e17446f1..7262c0dc5c54c7dbf40fb8596a42ebf2cf7e0cca 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -7,4 +7,5 @@
 <panel bg_opaque_color="PanelFocusBackgroundColor"
        bg_alpha_color="PanelDefaultBackgroundColor"
        background_visible="false"
-       background_opaque="false"/>
+       background_opaque="false"
+       chrome="false"/>
\ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6b49f832fd75272b4e872116aecf6985c0fa393e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- See also settings.xml UIFloater* settings for configuration -->
+<tool_tip name="tooltip"
+          max_width="200"
+          padding="4"
+          wrap="true"
+          font="SansSerif"
+          bg_opaque_color="ToolTipBgColor"
+          background_visible="true"
+ />