diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index a55915af359ac77e973b74d4cdb5d9fe26b25180..0199fe3f57cfd49ae1f99f26810d1524b1824685 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1565,25 +1565,13 @@ void LLFloater::draw()
 	// draw background
 	if( isBackgroundVisible() )
 	{
+		drawShadow(this);
+
 		S32 left = LLPANEL_BORDER_WIDTH;
 		S32 top = getRect().getHeight() - LLPANEL_BORDER_WIDTH;
 		S32 right = getRect().getWidth() - LLPANEL_BORDER_WIDTH;
 		S32 bottom = LLPANEL_BORDER_WIDTH;
 
-		static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
-		static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
-		LLColor4 shadow_color = shadow_color_cached;
-		F32 shadow_offset = (F32)shadow_offset_S32;
-
-		if (!isBackgroundOpaque())
-		{
-			shadow_offset *= 0.2f;
-			shadow_color.mV[VALPHA] *= 0.5f;
-		}
-		gl_drop_shadow(left, top, right, bottom, 
-			shadow_color % alpha, 
-			llround(shadow_offset));
-
 		LLUIImage* image = NULL;
 		LLColor4 color;
 		if (isBackgroundOpaque())
@@ -1666,6 +1654,29 @@ void LLFloater::draw()
 	}
 }
 
+void	LLFloater::drawShadow(LLPanel* panel)
+{
+	F32 alpha = panel->getDrawContext().mAlpha;
+	S32 left = LLPANEL_BORDER_WIDTH;
+	S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH;
+	S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH;
+	S32 bottom = LLPANEL_BORDER_WIDTH;
+
+	static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
+	static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
+	LLColor4 shadow_color = shadow_color_cached;
+	F32 shadow_offset = (F32)shadow_offset_S32;
+
+	if (!panel->isBackgroundOpaque())
+	{
+		shadow_offset *= 0.2f;
+		shadow_color.mV[VALPHA] *= 0.5f;
+	}
+	gl_drop_shadow(left, top, right, bottom, 
+		shadow_color % alpha, 
+		llround(shadow_offset));
+}
+
 void	LLFloater::setCanMinimize(BOOL can_minimize)
 {
 	// if removing minimize/restore button programmatically,
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 2166d8db8ad28165889281f5781bf4183ba7d4d4..19e828880746553fe493c4b658bb1c84d41fe57d 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -222,6 +222,7 @@ friend class LLMultiFloater;
 	virtual BOOL	handleScrollWheel(S32 x, S32 y, S32 mask);
 	
 	virtual void	draw();
+	virtual void	drawShadow(LLPanel* panel);
 	
 	virtual void	onOpen(const LLSD& key) {}
 	virtual void	onClose(bool app_quitting) {}
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index dac4390fa7e0649299979ee9e216ab163b56a681..0a8ea7de39995e879e2246090aac810bc5f1f2a1 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -260,6 +260,10 @@ class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipan
 	 * @see sOnCurrentChannelChanged()
 	 */
 	static LLVoiceChannel* sCurrentVoiceCanel;
+
+	/* virtual */
+	LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+
 	boost::signals2::connection mVoiceChannelStateChangeConnection;
 };
 
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 81cc52528cf131deed8c1f868a77c1212e080478..cf5ac6b2e6d10b0f0151b869e22be642b5efee44 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -122,7 +122,7 @@ class LLChatHistoryHeader: public LLPanel
 	BOOL handleToolTip(S32 x, S32 y, MASK mask)
 	{
 		LLTextBase* name = getChild<LLTextBase>("user_name");
-		if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom)
+		if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && mFrom.size() && SYSTEM_FROM != mFrom)
 		{
 
 			// Spawn at right side of the name textbox.
@@ -179,12 +179,7 @@ class LLChatHistoryHeader: public LLPanel
 		}
 		else if (level == "add")
 		{
-			std::string name;
-			name.assign(getFirstName());
-			name.append(" ");
-			name.append(getLastName());
-
-			LLAvatarActions::requestFriendshipDialog(getAvatarId(), name);
+			LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom);
 		}
 		else if (level == "remove")
 		{
@@ -253,8 +248,6 @@ class LLChatHistoryHeader: public LLPanel
 	}
 
 	const LLUUID&		getAvatarId () const { return mAvatarID;}
-	const std::string&	getFirstName() const { return mFirstName; }
-	const std::string&	getLastName	() const { return mLastName; }
 
 	void setup(const LLChat& chat,const LLStyle::Params& style_params) 
 	{
@@ -264,7 +257,7 @@ class LLChatHistoryHeader: public LLPanel
 		gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
 
 		//*TODO overly defensive thing, source type should be maintained out there
-		if(chat.mFromID.isNull() || chat.mFromName == SYSTEM_FROM)
+		if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM)
 		{
 			mSourceType = CHAT_SOURCE_SYSTEM;
 		}
@@ -275,9 +268,11 @@ class LLChatHistoryHeader: public LLPanel
 		userName->setColor(style_params.color());
 		
 		userName->setValue(chat.mFromName);
+		mFrom = chat.mFromName;
 		if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
 		{
-			userName->setValue(LLTrans::getString("SECOND_LIFE"));
+			mFrom = LLTrans::getString("SECOND_LIFE");
+			userName->setValue(mFrom);
 		}
 
 
@@ -337,8 +332,7 @@ class LLChatHistoryHeader: public LLPanel
 	{
 		if (id != mAvatarID)
 			return;
-		mFirstName = first;
-		mLastName = last;
+		mFrom = first + " " + last;
 	}
 protected:
 	static const S32 PADDING = 20;
@@ -423,8 +417,6 @@ class LLChatHistoryHeader: public LLPanel
 
 	LLUUID			    mAvatarID;
 	EChatSourceType		mSourceType;
-	std::string			mFirstName;
-	std::string			mLastName;
 	std::string			mFrom;
 	LLUUID				mSessionID;
 
@@ -796,6 +788,12 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
 			}
 		}
 
+		if (irc_me && !use_plain_text_chat_history)
+		{
+			message = chat.mFromName + message;
+		}
+		
+
 		mEditor->appendText(message, FALSE, style_params);
 	}
 	mEditor->blockUndo();
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 2f248f3596d269be35fec66c4514b20bb43e254f..db7998fe6e57039700e5201d805a79fd841f5bc3 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -39,6 +39,7 @@
 #include "llavatariconctrl.h"
 #include "llgroupiconctrl.h"
 #include "llagent.h"
+#include "lltransientfloatermgr.h"
 
 //
 // LLIMFloaterContainer
@@ -47,9 +48,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
 :	LLMultiFloater(seed)
 {
 	mAutoResize = FALSE;
+	LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
 }
 
-LLIMFloaterContainer::~LLIMFloaterContainer(){}
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+	LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
+}
 
 BOOL LLIMFloaterContainer::postBuild()
 {
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 96ce01c05f559950963598cc16d0c557698fa1ff..f13445fa5dc86cf9024a6808eaa9fbe681d9628d 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -69,6 +69,8 @@ const static std::string MULTI_LINE_PREFIX(" ");
  *  Katar Ivercourt is Offline
  *  [3:00]  Katar Ivercourt is Offline
  *  [2009/11/20 3:01]  Corba ProductEngine is Offline
+ *
+ * Note: "You" was used as an avatar names in viewers of previous versions
  */
 const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
 
@@ -78,6 +80,9 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+
  */
 const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)");
 
+//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st"
+const static std::string NAME_TEXT_DIVIDER(": ");
+
 const static int IDX_TIMESTAMP = 1;
 const static int IDX_STUFF = 2;
 const static int IDX_NAME = 1;
@@ -160,10 +165,19 @@ void LLLogChat::saveHistory(const std::string& filename,
 	if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
 		 item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
 
-	item["from"]	= from;
 	item["from_id"]	= from_id;
 	item["message"]	= line;
 
+	//adding "Second Life:" for all system messages to make chat log history parsing more reliable
+	if (from.empty() && from_id.isNull())
+	{
+		item["from"] = SYSTEM_FROM; 
+	}
+	else
+	{
+		item["from"] = from;
+	}
+
 	file << LLChatLogFormatter(item) << std::endl;
 
 	file.close();
@@ -398,6 +412,18 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
 		im[IM_FROM_ID] = LLUUID::null;
 	}
 
+	//possibly a case of complex object names consisting of 3+ words
+	if (!has_name)
+	{
+		U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER);
+		if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length()))
+		{
+			im[IM_FROM] = stuff.substr(0, divider_pos);
+			im[IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length());
+			return true;
+		}
+	}
+
 	if (!has_name)
 	{
 		//text is mandatory
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 29e3c66684a7b30a1d3c1ddb0fcaaafc82c569ec..3c390c0281470b4ceb7274c92c468fdc36ece50c 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -282,7 +282,7 @@ void LLNearbyChatScreenChannel::showToastsBottom()
 				gFloaterView->sendChildToBack(toast);
 			}
 			
-			bottom = toast->getRect().mTop;
+			bottom = toast->getRect().mTop - toast->getTopPad();
 		}		
 	}
 }
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index b8e0892b02cddbe607599fcf61f19f401da13792..35569cfface6d511ef43fdd3df29f0b20af51cad 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -220,6 +220,7 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat
 	{
 		LLChat chat_msg(notification->getMessage());
 		chat_msg.mSourceType = type;
+		chat_msg.mFromName = SYSTEM_FROM;
 		nearby_chat->addMessage(chat_msg);
 	}
 }
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 7c2e7e3319ebcba88b31771821869f27eb2d5ba6..c75d90be6f34b472fbc46cb4c0cd68e77a68adbb 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -79,17 +79,12 @@ LLScreenChannelBase::~LLScreenChannelBase()
 
 bool  LLScreenChannelBase::isHovering()
 {
-	bool res = mHoveredToast != NULL;
-	if (!res)
+	if (!mHoveredToast)
 	{
-		return res;
+		return false;
 	}
 
-	S32 x, y;
-	mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
-			gViewerWindow->getCurrentMouseY(), &x, &y);
-	res = mHoveredToast->pointInView(x, y) == TRUE;
-	return res;
+	return mHoveredToast->isHovered();
 }
 
 void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
@@ -479,7 +474,8 @@ void LLScreenChannel::showToastsBottom()
 	{
 		if(it != mToastList.rbegin())
 		{
-			bottom = (*(it-1)).toast->getRect().mTop;
+			LLToast* toast = (*(it-1)).toast;
+			bottom = toast->getRect().mTop - toast->getTopPad();
 			toast_margin = gSavedSettings.getS32("ToastGap");
 		}
 
@@ -777,23 +773,16 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
 {
 	// because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
 	// we must check hovering directly to prevent incorrect setting for hovering in a channel
-	S32 x,y;
 	if (mouse_enter)
 	{
-		toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
-				gViewerWindow->getCurrentMouseY(), &x, &y);
-		bool hover = toast->pointInView(x, y) == TRUE;
-		if (hover)
+		if (toast->isHovered())
 		{
 			mHoveredToast = toast;
 		}
 	}
 	else if (mHoveredToast != NULL)
 	{
-		mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
-				gViewerWindow->getCurrentMouseY(), &x, &y);
-		bool hover = mHoveredToast->pointInView(x, y) == TRUE;
-		if (!hover)
+		if (!mHoveredToast->isHovered())
 		{
 			mHoveredToast = NULL;
 		}
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 50c47e293ef63d59c7d3fd43d243117af437c116..fba1503b4a3eb62d52d18796146be5ee9cc618cf 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -248,6 +248,11 @@ LLSideTray::LLSideTray(Params& params)
 	// panel_name should be specified via "parameter" attribute.
 	commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));
 	LLTransientFloaterMgr::getInstance()->addControlView(this);
+	LLView* side_bar_tabs  = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
+	if (side_bar_tabs != NULL)
+	{
+		LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+	}
 
 	LLPanel::Params p;
 	p.name = "buttons_panel";
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 110d158e2daa17b8da7a34560fc522718a058884..60a89c02e4c71c97f5b7e3e8c84cfa0d8148c294 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -68,12 +68,17 @@ LLToast::LLToast(const LLToast::Params& p)
 	mNotification(p.notification),
 	mIsHidden(false),
 	mHideBtnPressed(false),
-	mIsTip(p.is_tip)
+	mIsTip(p.is_tip),
+	mWrapperPanel(NULL)
 {
 	LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
 
 	setCanDrag(FALSE);
 
+	mWrapperPanel = getChild<LLPanel>("wrapper_panel");
+	mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
+	mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
+
 	if(mPanel)
 	{
 		insertPanel(mPanel);
@@ -83,6 +88,8 @@ LLToast::LLToast(const LLToast::Params& p)
 	{
 		mHideBtn = getChild<LLButton>("hide_btn");
 		mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
+		mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
+		mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
 	}
 
 	// init callbacks if present
@@ -174,6 +181,42 @@ void LLToast::hide()
 	mOnFadeSignal(this); 
 }
 
+void LLToast::onFocusLost()
+{
+	if(mWrapperPanel && !isBackgroundVisible())
+	{
+		// Lets make wrapper panel behave like a floater
+		setBackgroundOpaque(FALSE);
+	}
+}
+
+void LLToast::onFocusReceived()
+{
+	if(mWrapperPanel && !isBackgroundVisible())
+	{
+		// Lets make wrapper panel behave like a floater
+		setBackgroundOpaque(TRUE);
+	}
+}
+
+S32 LLToast::getTopPad()
+{
+	if(mWrapperPanel)
+	{
+		return getRect().getHeight() - mWrapperPanel->getRect().getHeight();
+	}
+	return 0;
+}
+
+S32 LLToast::getRightPad()
+{
+	if(mWrapperPanel)
+	{
+		return getRect().getWidth() - mWrapperPanel->getRect().getWidth();
+	}
+	return 0;
+}
+
 //--------------------------------------------------------------------------
 void LLToast::setCanFade(bool can_fade) 
 { 
@@ -199,22 +242,21 @@ void LLToast::reshapeToPanel()
 	if(!panel)
 		return;
 
-	LLRect panel_rect;
+	LLRect panel_rect = panel->getRect();
 
-	panel_rect = panel->getRect();
-	reshape(panel_rect.getWidth(), panel_rect.getHeight());
 	panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
-	panel->setRect(panel_rect);
+	panel->setShape(panel_rect);
 	
 	LLRect toast_rect = getRect();
-	toast_rect.setLeftTopAndSize(toast_rect.mLeft,toast_rect.mTop,panel_rect.getWidth(), panel_rect.getHeight());
-	setRect(toast_rect);
 
+	toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop,
+		panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad());
+	setShape(toast_rect);
 }
 
 void LLToast::insertPanel(LLPanel* panel)
 {
-	addChild(panel);	
+	mWrapperPanel->addChild(panel);	
 	reshapeToPanel();
 }
 
@@ -227,6 +269,19 @@ void LLToast::draw()
 	}
 
 	LLFloater::draw();
+
+	if(!isBackgroundVisible())
+	{
+		// Floater background is invisible, lets make wrapper panel look like a 
+		// floater - draw shadow.
+		drawShadow(mWrapperPanel);
+
+		// Shadow will probably overlap close button, lets redraw the button
+		if(mHideBtn)
+		{
+			drawChild(mHideBtn);
+		}
+	}
 }
 
 //--------------------------------------------------------------------------
@@ -261,43 +316,78 @@ void LLToast::setVisible(BOOL show)
 	}
 }
 
-//--------------------------------------------------------------------------
-void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)
+void LLToast::onToastMouseEnter()
 {
-	mOnToastHoverSignal(this, MOUSE_ENTER);
+	LLRect panel_rc = mWrapperPanel->calcScreenRect();
+	LLRect button_rc;
+	if(mHideBtn)
+	{
+		button_rc = mHideBtn->calcScreenRect();
+	}
 
-	setBackgroundOpaque(TRUE);
+	S32 x, y;
+	LLUI::getMousePositionScreen(&x, &y);
 
-	//toasts fading is management by Screen Channel
-	
-	sendChildToFront(mHideBtn);
-	if(mHideBtn && mHideBtn->getEnabled())
-		mHideBtn->setVisible(TRUE);
-	mOnMouseEnterSignal(this);
+	if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
+	{
+		mOnToastHoverSignal(this, MOUSE_ENTER);
+
+		setBackgroundOpaque(TRUE);
+
+		//toasts fading is management by Screen Channel
 
-	LLModalDialog::onMouseEnter(x, y, mask);
+		sendChildToFront(mHideBtn);
+		if(mHideBtn && mHideBtn->getEnabled())
+		{
+			mHideBtn->setVisible(TRUE);
+		}
+		mOnMouseEnterSignal(this);
+		mToastMouseEnterSignal(this, getValue());
+	}
 }
 
-//--------------------------------------------------------------------------
-void LLToast::onMouseLeave(S32 x, S32 y, MASK mask)
-{	
-	mOnToastHoverSignal(this, MOUSE_LEAVE);
+void LLToast::onToastMouseLeave()
+{
+	LLRect panel_rc = mWrapperPanel->calcScreenRect();
+	LLRect button_rc;
+	if(mHideBtn)
+	{
+		button_rc = mHideBtn->calcScreenRect();
+	}
 
-	//toasts fading is management by Screen Channel
+	S32 x, y;
+	LLUI::getMousePositionScreen(&x, &y);
 
-	if(mHideBtn && mHideBtn->getEnabled())
+	if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
 	{
-		if( mHideBtnPressed )
+		mOnToastHoverSignal(this, MOUSE_LEAVE);
+
+		//toasts fading is management by Screen Channel
+
+		if(mHideBtn && mHideBtn->getEnabled())
 		{
-			mHideBtnPressed = false;
-			return;
+			if( mHideBtnPressed )
+			{
+				mHideBtnPressed = false;
+				return;
+			}
+			mHideBtn->setVisible(FALSE);		
 		}
-		mHideBtn->setVisible(FALSE);		
+		mToastMouseLeaveSignal(this, getValue());
 	}
-
-	LLModalDialog::onMouseLeave(x, y, mask);
 }
 
+void LLToast::setBackgroundOpaque(BOOL b)
+{
+	if(mWrapperPanel && !isBackgroundVisible())
+	{
+		mWrapperPanel->setBackgroundOpaque(b);
+	}
+	else
+	{
+		LLModalDialog::setBackgroundOpaque(b);
+	}
+}
 
 void LLNotificationsUI::LLToast::stopFading()
 {
@@ -315,6 +405,13 @@ void LLNotificationsUI::LLToast::startFading()
 	}
 }
 
+bool LLToast::isHovered()
+{
+	S32 x, y;
+	LLUI::getMousePositionScreen(&x, &y);
+	return mWrapperPanel->calcScreenRect().pointInRect(x, y);
+}
+
 //--------------------------------------------------------------------------
 
 BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 3d25fd4f02d5011e8aa0d79d8f621c2fc1dc66c5..64855020a98143cdd18874e2c29652fd42003526 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -86,8 +86,6 @@ class LLToast : public LLModalDialog
 
 	// Toast handlers
 	virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
-	virtual void onMouseEnter(S32 x, S32 y, MASK mask);
-	virtual void onMouseLeave(S32 x, S32 y, MASK mask);
 
 	//Fading
 
@@ -97,6 +95,7 @@ class LLToast : public LLModalDialog
 	/** Start fading timer */
 	virtual void startFading();
 
+	bool isHovered();
 
 	// Operating with toasts
 	// insert a panel to a toast
@@ -118,10 +117,22 @@ class LLToast : public LLModalDialog
 	virtual void draw();
 	//
 	virtual void setVisible(BOOL show);
+
+	/*virtual*/ void setBackgroundOpaque(BOOL b);
 	//
 	virtual void hide();
 
+	/*virtual*/ void onFocusLost();
+
+	/*virtual*/ void onFocusReceived();
 
+	/**
+	 * Returns padding between floater top and wrapper_panel top.
+	 * This padding should be taken into account when positioning or reshaping toasts
+	 */
+	S32 getTopPad();
+
+	S32 getRightPad();
 
 	// get/set Toast's flags or states
 	// get information whether the notification corresponding to the toast is valid or not
@@ -154,9 +165,15 @@ class LLToast : public LLModalDialog
 	toast_hover_check_signal_t mOnToastHoverSignal;	
 	boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); }
 
+	boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };
+	boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };
 
 private:
 
+	void onToastMouseEnter();
+
+	void onToastMouseLeave();
+
 	void handleTipToastClick(S32 x, S32 y, MASK mask);
 
 	// check timer
@@ -168,6 +185,8 @@ class LLToast : public LLModalDialog
 	LLUUID				mSessionID;
 	LLNotificationPtr	mNotification;
 
+	LLPanel* mWrapperPanel;
+
 	// timer counts a lifetime of a toast
 	LLTimer		mTimer;
 	F32			mToastLifetime; // in seconds
@@ -184,6 +203,9 @@ class LLToast : public LLModalDialog
 	bool		mHideBtnPressed;
 	bool		mIsHidden;  // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
 	bool		mIsTip;
+
+	commit_signal_t mToastMouseEnterSignal;
+	commit_signal_t mToastMouseLeaveSignal;
 };
 
 }
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index bfe3cce7d0a949bc8b1f942969743fb21e6ab6c9..11069b3ac337edd88b3ab242b99a0f413ce70895 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -3,17 +3,25 @@
 
 <!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
 
+<!-- 
+     This floater is invisible. To make toast look like a floater we render wrapper_panel
+     like a floater(draw shadows and so on). This is done with one purpose - make close button
+     look like it is positioned out of floater and able to accept mouse clicks (see EXT-4246)
+-->
+
 <floater
- legacy_header_height="18"
+ legacy_header_height="0"
+ header_height="0"
  name="toast"
  title=""
  visible="false"
  layout="topleft"
- height="40"  
- width="305"
+ height="47"  
+ width="310"
  left="0"
  top="0"
  follows="right|bottom"
+ background_visible="false"
  bg_opaque_image="Toast_Over"
  bg_alpha_image="Toast_Background"
  can_minimize="false"
@@ -27,6 +35,21 @@
  drop_shadow_visible = "false"
  border = "false"
 >
+ <panel
+  background_opaque="false"
+  border_visible="false"
+  background_visible="true"
+  bg_opaque_image="Toast_Over"
+  bg_alpha_image="Toast_Background"
+  label="wrapper_panel"
+  layout="topleft"
+  left="0"
+  name="wrapper_panel"
+  top="7"
+  height="40"
+  follows="all" 
+  translate="false"
+  width="305">
   <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
   <text
     clip_partial="true" 
@@ -46,10 +69,11 @@
    width="260">
     Toast text;
   </text>
+ </panel>
   <button
     layout="topleft"
-    top="-14"
-    left="293"
+    top="0"
+    right="310"
     width="17"
     height="17"
     follows="top|right"