diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index d4c3cfb7b6c3fb91d7fc9ac02504dbe292ed1428..831ac66d061f1ecaf0a28d5fa784023a55768b3f 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -932,7 +932,7 @@ void LLFlatListView::onFocusLost()
 }
 
 //virtual 
-void LLFlatListView::notify(const LLSD& info)
+S32 LLFlatListView::notify(const LLSD& info)
 {
 	if(info.has("action"))
 	{
@@ -941,13 +941,16 @@ void LLFlatListView::notify(const LLSD& info)
 		{
 			setFocus(true);
 			selectFirstItem();
+			return 1;
 		}
 		else if(str_action == "select_last")
 		{
 			setFocus(true);
 			selectLastItem();
+			return 1;
 		}
 	}
+	return 0;
 }
 
 //EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 9e1e0f90fc80465a246a10e1744389e0a287c777..ba824ff2df5bab45750abef4858827f606174393 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -283,7 +283,7 @@ class LLFlatListView : public LLScrollContainer
 	void selectFirstItem	();
 	void selectLastItem		();
 
-	virtual void	notify(const LLSD& info) ;
+	virtual S32	notify(const LLSD& info) ;
 
 protected:
 
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index 23e4131e6d023cd5e61cbc5ac7d4257f8b60628e..d8ebe15dc001ab9dcdd4874ef3ddbde9088e1e23 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -2848,18 +2848,21 @@ LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const
 	return *mDefaultWidgets;
 }
 
-void	LLView::notifyParent(const LLSD& info)
+S32	LLView::notifyParent(const LLSD& info)
 {
 	LLView* parent = getParent();
 	if(parent)
-		parent->notifyParent(info);
+		return parent->notifyParent(info);
+	return 0;
 }
-void	LLView::notifyChildren(const LLSD& info)
+bool	LLView::notifyChildren(const LLSD& info)
 {
+	bool ret = false;
 	for ( child_list_iter_t child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
 	{
-		(*child_it)->notifyChildren(info);
+		ret |= (*child_it)->notifyChildren(info);
 	}
+	return ret;
 }
 
 // convenient accessor for draw context
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index c611e4c85f821aa060881c5f8b736f2e74fb6927..f8460f536168daa5fccad9a05ba47f4171072e0b 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -511,10 +511,15 @@ class LLView : public LLMouseHandler, public LLMortician, public LLFocusableElem
 	virtual void	handleReshape(const LLRect& rect, bool by_user);
 	virtual void	dirtyRect();
 
-	virtual void	notifyParent(const LLSD& info);
-	virtual void	notifyChildren(const LLSD& info);
+	//send custom notification to LLView parent
+	virtual S32	notifyParent(const LLSD& info);
 
-	virtual void	notify(const LLSD& info) {};
+	//send custom notification to all view childrend
+	// return true if _any_ children return true. otherwise false.
+	virtual bool	notifyChildren(const LLSD& info);
+
+	//send custom notification to current view
+	virtual S32	notify(const LLSD& info) { return 0;};
 
 	static const LLViewDrawContext& getDrawContext();
 
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index 046118cf75b2e066de006c6a825a94bf45ba51f3..4e21268a8a9d49db0126fa391793d619efe57360 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -71,7 +71,7 @@ void LLPanelMe::onOpen(const LLSD& key)
 	LLPanelProfile::onOpen(key);
 }
 
-void LLPanelMe::notifyChildren(const LLSD& info)
+bool LLPanelMe::notifyChildren(const LLSD& info)
 {
 	if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
 	{
@@ -104,10 +104,10 @@ void LLPanelMe::notifyChildren(const LLSD& info)
 		if (on_default_view)
 			LLSideTray::getInstance()->collapseSideBar();
 
-		return; // this notification is only supposed to be handled by task panels 
+		return true; // this notification is only supposed to be handled by task panels 
 	}
 
-	LLPanel::notifyChildren(info);
+	return LLPanel::notifyChildren(info);
 }
 
 void LLPanelMe::buildEditPanel()
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
index 17d367132edb82b6d7e2f768a4ffb190705cf1ae..1325192bbf311ac59b36b527748b4e2ed52598b1 100644
--- a/indra/newview/llpanelme.h
+++ b/indra/newview/llpanelme.h
@@ -54,7 +54,7 @@ class LLPanelMe : public LLPanelProfile
 	LLPanelMe();
 
 	/*virtual*/ void onOpen(const LLSD& key);
-	/*virtual*/ void notifyChildren(const LLSD& info);
+	/*virtual*/ bool notifyChildren(const LLSD& info);
 
 	/*virtual*/ BOOL postBuild();
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 1743df52fc629fd38b1e055d1b13da27871f56cc..9c7e3952f56e7e3f3897b0c7612e170648dbd8c4 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -1284,7 +1284,7 @@ void	LLPanelPeople::onOpen(const LLSD& key)
 		reSelectedCurrentTab();
 }
 
-void LLPanelPeople::notifyChildren(const LLSD& info)
+bool LLPanelPeople::notifyChildren(const LLSD& info)
 {
 	if (info.has("task-panel-action") && info["task-panel-action"].asString() == "handle-tri-state")
 	{
@@ -1292,7 +1292,7 @@ void LLPanelPeople::notifyChildren(const LLSD& info)
 		if (!container)
 		{
 			llwarns << "Cannot find People panel container" << llendl;
-			return;
+			return true;
 		}
 
 		if (container->getCurrentPanelIndex() > 0) 
@@ -1303,10 +1303,10 @@ void LLPanelPeople::notifyChildren(const LLSD& info)
 		else
 			LLSideTray::getInstance()->collapseSideBar();
 
-		return; // this notification is only supposed to be handled by task panels
+		return true; // this notification is only supposed to be handled by task panels
 	}
 
-	LLPanel::notifyChildren(info);
+	return LLPanel::notifyChildren(info);
 }
 
 void LLPanelPeople::showAccordion(const std::string name, bool show)
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 5ac5bcc1d7e3ff5041d213eb6781b83c8f52f3fd..bd1b155947008e90416247247176212ddcf37a71 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -51,7 +51,7 @@ class LLPanelPeople : public LLPanel
 
 	/*virtual*/ BOOL 	postBuild();
 	/*virtual*/ void	onOpen(const LLSD& key);
-	/*virtual*/ void	notifyChildren(const LLSD& info);
+	/*virtual*/ bool	notifyChildren(const LLSD& info);
 
 	// internals
 	class Updater;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 1830d00f6831f48b13692697fe78499be038cb45..327482017465e21fe932a1e3f90a5793e0233786 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -220,15 +220,15 @@ void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params)
 	panel->setRect(new_rect);
 }
 
-void LLPanelProfile::notifyParent(const LLSD& info)
+S32 LLPanelProfile::notifyParent(const LLSD& info)
 {
 	std::string action = info["action"];
 	// lets update Picks list after Pick was saved
 	if("save_new_pick" == action)
 	{
 		onOpen(info);
-		return;
+		return 1;
 	}
 
-	LLPanel::notifyParent(info);
+	return LLPanel::notifyParent(info);
 }
diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h
index 067beb248b9f27054cb8f8a82c3888e8fd181ae1..bcf4bdd0ec27fb7d9030d74ba8342edf43571757 100644
--- a/indra/newview/llpanelprofile.h
+++ b/indra/newview/llpanelprofile.h
@@ -55,7 +55,7 @@ class LLPanelProfile : public LLPanel
 
 	virtual void openPanel(LLPanel* panel, const LLSD& params);
 
-	void notifyParent(const LLSD& info);
+	S32 notifyParent(const LLSD& info);
 
 protected: