diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 8f35db1007e3fa94206dc491ca47f49b1d0ef56e..6a0d8ef3d65d1d07bb1d9ea1784afc6b6d8c4ce5 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -257,6 +257,8 @@ public:
 
 	void		setForcePressedState(bool b) { mForcePressedState = b; }
 	
+	void 		setAutoResize(bool auto_resize) { mAutoResize = auto_resize; }
+
 protected:
 	LLPointer<LLUIImage> getImageUnselected() const	{ return mImageUnselected; }
 	LLPointer<LLUIImage> getImageSelected() const	{ return mImageSelected; }
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index cf5ac6b2e6d10b0f0151b869e22be642b5efee44..8fb9decf7bc422901db76780c2966acd4ce10220 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -721,22 +721,26 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
 			notify_box->setFollowsRight();
 			notify_box->setFollowsTop();
 
-			LLButton* accept_button = notify_box->getChild<LLButton> ("Accept",
-					TRUE);
-			if (accept_button != NULL)
+			ctrl_list_t ctrls = notify_box->getControlPanel()->getCtrlList();
+			S32 offset = 0;
+			for (ctrl_list_t::iterator it = ctrls.begin(); it != ctrls.end(); it++)
 			{
-				accept_button->setFollowsNone();
-				accept_button->setOrigin(2*HPAD, accept_button->getRect().mBottom);
-			}
-
-			LLButton* decline_button = notify_box->getChild<LLButton> (
-					"Decline", TRUE);
-			if (accept_button != NULL && decline_button != NULL)
-			{
-				decline_button->setFollowsNone();
-				decline_button->setOrigin(4*HPAD
-						+ accept_button->getRect().getWidth(),
-						decline_button->getRect().mBottom);
+				LLButton * button = dynamic_cast<LLButton*> (*it);
+				if (button != NULL)
+				{
+					button->setOrigin( offset,
+							button->getRect().mBottom);
+					button->setLeftHPad(2 * HPAD);
+					button->setRightHPad(2 * HPAD);
+					// set zero width before perform autoResize()
+					button->setRect(LLRect(button->getRect().mLeft,
+							button->getRect().mTop, button->getRect().mLeft,
+							button->getRect().mBottom));
+					button->setAutoResize(true);
+					button->autoResize();
+					offset += 2 * HPAD + button->getRect().getWidth();
+					button->setFollowsNone();
+				}
 			}
 
 			LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE);
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 5f4768e321c43e09b7ffdc11dbcc86bc381ff461..0d5c431d752da09717cd5edc447e90765cdbb066 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -334,11 +334,6 @@ public:
 	 * Adds notification panel to the IM floater.
 	 */
 	static void addNotifPanelToIM(const LLNotificationPtr& notification);
-
-	/**
-	 * Reloads IM floater messages.
-	 */
-	static void reloadIMFloaterMessages(const LLNotificationPtr& notification);
 };
 
 }
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index 35569cfface6d511ef43fdd3df29f0b20af51cad..c30a4fb25348a460aca7263c6f9aff93d31948b4 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -94,7 +94,8 @@ bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)
 // static
 bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)
 {
-	return OFFER_FRIENDSHIP == notification->getName();
+	return OFFER_FRIENDSHIP == notification->getName()
+					|| USER_GIVE_ITEM == notification->getName();
 }
 
 
@@ -269,27 +270,3 @@ void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification)
 
 	LLIMFloater::show(session_id);
 }
-
-// static
-void LLHandlerUtil::reloadIMFloaterMessages(
-		const LLNotificationPtr& notification)
-{
-	LLUUID from_id = notification->getPayload()["from_id"];
-	LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
-	LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
-			"impanel", session_id);
-	if (im_floater != NULL)
-	{
-		LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession(
-				session_id);
-		if(session != NULL)
-		{
-			session->mMsgs.clear();
-			std::list<LLSD> chat_history;
-			LLLogChat::loadAllHistory(session->mHistoryFileName, chat_history);
-			session->addMessagesFromHistory(chat_history);
-		}
-
-		im_floater->reloadMessages();
-	}
-}
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 8c13b0fafa3d55c5190cace37e3e5615712c5458..8ebd5de258f7df11887ab61a06cd0587f5e0292b 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -155,10 +155,6 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 		}
 		else
 		{
-			if (LLHandlerUtil::canAddNotifPanelToIM(notification))
-			{
-				LLHandlerUtil::reloadIMFloaterMessages(notification);
-			}
 			mChannel->killToastByNotificationID(notification->getID());
 		}
 	}
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index ef3535042c69d73e82972e7ba128f82bd40c7928..c47c017143aaf41d7e46177f05840895032e96cf 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -346,4 +346,7 @@ void LLToastNotifyPanel::onClickButton(void* data)
 		response[button_name] = true;
 	}
 	self->mNotification->respond(response);
+
+	// disable all buttons
+	self->mControlPanel->setEnabled(FALSE);
 }
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index 3d57c50386d5d3a9837dc4010d46cc39cc41c789..e791eea469c12d4be1c6e5ef39708be34c2d23fa 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -55,6 +55,7 @@ class LLToastNotifyPanel: public LLToastPanel
 public:
 	LLToastNotifyPanel(LLNotificationPtr&);
 	virtual ~LLToastNotifyPanel();
+	LLPanel * getControlPanel() { return mControlPanel; }
 
 protected:
 	LLButton* createButton(const LLSD& form_element, BOOL is_option);