diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 2d9d3241d8c2b87e99cd267b7e347e1ea3c4254f..c4b226b70b2783601c4c94b57235242e1fc8ba50 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -113,7 +113,8 @@ LLToast::LLToast(const LLToast::Params& p)
 	mHideBtnPressed(false),
 	mIsTip(p.is_tip),
 	mWrapperPanel(NULL),
-	mIsFading(false)
+	mIsFading(false),
+	mIsHovered(false)
 {
 	mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs));
 
@@ -122,8 +123,6 @@ LLToast::LLToast(const LLToast::Params& p)
 	setCanDrag(FALSE);
 
 	mWrapperPanel = getChild<LLPanel>("wrapper_panel");
-	mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
-	mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
 
 	setBackgroundOpaque(TRUE); // *TODO: obsolete
 	updateTransparency();
@@ -137,8 +136,6 @@ 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
@@ -331,6 +328,55 @@ void LLToast::draw()
 			drawChild(mHideBtn);
 		}
 	}
+
+	updateHoveredState();
+
+	LLToastLifeTimer* timer = getTimer();
+	if (!timer)
+	{
+		return;
+	}
+
+	// Started timer means the mouse had left the toast previously.
+	// If toast is hovered in the current frame we should handle
+	// a mouse enter event.
+	if(timer->getStarted() && mIsHovered)
+	{
+		mOnToastHoverSignal(this, MOUSE_ENTER);
+
+		updateTransparency();
+
+		//toasts fading is management by Screen Channel
+
+		sendChildToFront(mHideBtn);
+		if(mHideBtn && mHideBtn->getEnabled())
+		{
+			mHideBtn->setVisible(TRUE);
+		}
+		mToastMouseEnterSignal(this, getValue());
+	}
+	// Stopped timer means the mouse had entered the toast previously.
+	// If the toast is not hovered in the current frame we should handle
+	// a mouse leave event.
+	else if(!timer->getStarted() && !mIsHovered)
+	{
+		mOnToastHoverSignal(this, MOUSE_LEAVE);
+
+		updateTransparency();
+
+		//toasts fading is management by Screen Channel
+
+		if(mHideBtn && mHideBtn->getEnabled())
+		{
+			if( mHideBtnPressed )
+			{
+				mHideBtnPressed = false;
+				return;
+			}
+			mHideBtn->setVisible(FALSE);
+		}
+		mToastMouseLeaveSignal(this, getValue());
+	}
 }
 
 //--------------------------------------------------------------------------
@@ -378,37 +424,11 @@ void LLToast::setVisible(BOOL show)
 	}
 }
 
-void LLToast::onToastMouseEnter()
+void LLToast::updateHoveredState()
 {
-	LLRect panel_rc = mWrapperPanel->calcScreenRect();
-	LLRect button_rc;
-	if(mHideBtn)
-	{
-		button_rc = mHideBtn->calcScreenRect();
-	}
-
 	S32 x, y;
 	LLUI::getMousePositionScreen(&x, &y);
 
-	if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
-	{
-		mOnToastHoverSignal(this, MOUSE_ENTER);
-
-		updateTransparency();
-
-		//toasts fading is management by Screen Channel
-
-		sendChildToFront(mHideBtn);
-		if(mHideBtn && mHideBtn->getEnabled())
-		{
-			mHideBtn->setVisible(TRUE);
-		}
-		mToastMouseEnterSignal(this, getValue());
-	}
-}
-
-void LLToast::onToastMouseLeave()
-{
 	LLRect panel_rc = mWrapperPanel->calcScreenRect();
 	LLRect button_rc;
 	if(mHideBtn)
@@ -416,25 +436,32 @@ void LLToast::onToastMouseLeave()
 		button_rc = mHideBtn->calcScreenRect();
 	}
 
-	S32 x, y;
-	LLUI::getMousePositionScreen(&x, &y);
-
-	mOnToastHoverSignal(this, MOUSE_LEAVE);
+	if (!panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
+	{
+		// mouse is not over this toast
+		mIsHovered = false;
+		return;
+	}
 
-	updateTransparency();
+	bool is_overlapped_by_other_floater = false;
 
-	//toasts fading is management by Screen Channel
+	const child_list_t* child_list = gFloaterView->getChildList();
 
-	if(mHideBtn && mHideBtn->getEnabled())
+	// find this toast in gFloaterView child list to check whether any floater
+	// with higher Z-order is visible under the mouse pointer overlapping this toast
+	child_list_const_reverse_iter_t r_iter = std::find(child_list->rbegin(), child_list->rend(), this);
+	if (r_iter != child_list->rend())
 	{
-		if( mHideBtnPressed )
+		// skip this toast and proceed to views above in Z-order
+		for (++r_iter; r_iter != child_list->rend(); ++r_iter)
 		{
-			mHideBtnPressed = false;
-			return;
+			LLView* view = *r_iter;
+			is_overlapped_by_other_floater = view->isInVisibleChain() && view->calcScreenRect().pointInRect(x, y);
+			if (is_overlapped_by_other_floater) break;
 		}
-		mHideBtn->setVisible(FALSE);
 	}
-	mToastMouseLeaveSignal(this, getValue());
+
+	mIsHovered = !is_overlapped_by_other_floater;
 }
 
 void LLToast::setBackgroundOpaque(BOOL b)
@@ -492,37 +519,6 @@ void LLNotificationsUI::LLToast::startTimer()
 	}
 }
 
-bool LLToast::isHovered()
-{
-	S32 x, y;
-	LLUI::getMousePositionScreen(&x, &y);
-
-	if (!mWrapperPanel->calcScreenRect().pointInRect(x, y))
-	{
-		// mouse is not over this toast
-		return false;
-	}
-
-	bool is_overlapped_by_other_floater = false;
-
-	const child_list_t* child_list = gFloaterView->getChildList();
-
-	// find this toast in gFloaterView child list to check whether any floater
-	// with higher Z-order is visible under the mouse pointer overlapping this toast
-	child_list_const_reverse_iter_t r_iter = std::find(child_list->rbegin(), child_list->rend(), this);
-	if (r_iter != child_list->rend())
-	{
-		// skip this toast and proceed to views above in Z-order
-		for (++r_iter; r_iter != child_list->rend(); ++r_iter)
-		{
-			LLView* view = *r_iter;
-			is_overlapped_by_other_floater = view->isInVisibleChain() && view->calcScreenRect().pointInRect(x, y);
-			if (is_overlapped_by_other_floater) break;
-		}
-	}
-	return !is_overlapped_by_other_floater;
-}
-
 //--------------------------------------------------------------------------
 
 BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 380c2c391ab8ae8ff6401a18c92080521313f30d..77229e7beb56bb55c91651862e09bd864f33f353 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -120,7 +120,7 @@ class LLToast : public LLModalDialog
 	/** Start lifetime/fading timer */
 	virtual void startTimer();
 
-	bool isHovered();
+	bool isHovered() { return mIsHovered; }
 
 	// Operating with toasts
 	// insert a panel to a toast
@@ -202,10 +202,7 @@ class LLToast : public LLModalDialog
 	void updateTransparency();
 
 private:
-
-	void onToastMouseEnter();
-
-	void onToastMouseLeave();
+	void updateHoveredState();
 
 	void expire();
 
@@ -236,6 +233,7 @@ class LLToast : public LLModalDialog
 	bool		mIsHidden;  // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
 	bool		mIsTip;
 	bool		mIsFading;
+	bool		mIsHovered;
 
 	commit_signal_t mToastMouseEnterSignal;
 	commit_signal_t mToastMouseLeaveSignal;