diff --git a/indra/llcommon/lleventdispatcher.h b/indra/llcommon/lleventdispatcher.h
index c8c4fe0c3ca38935be3e6ebd8ad44889602f420e..1e625bcee8b47d60cc1c6f1050289e4b470e3b23 100644
--- a/indra/llcommon/lleventdispatcher.h
+++ b/indra/llcommon/lleventdispatcher.h
@@ -139,6 +139,9 @@ class LL_COMMON_API LLEventDispatcher
     /// Get information about a specific Callable
     LLSD getMetadata(const std::string& name) const;
 
+    /// Retrieve the LLSD key we use for one-arg <tt>operator()</tt> method
+    std::string getDispatchKey() const { return mKey; }
+
 private:
     template <class CLASS, typename METHOD>
     void addMethod(const std::string& name, const std::string& desc,
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 7b7a3139a4302224591dace4ee2637e4841fd8e1..3754d155cff3781004c6f633da5dc973fe9fe5ab 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -66,7 +66,7 @@ const LLRect& LLFlatListView::getItemsRect() const
 	return mItemsPanel->getRect(); 
 }
 
-bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*/, EAddPosition pos /*= ADD_BOTTOM*/)
+bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*/, EAddPosition pos /*= ADD_BOTTOM*/,bool rearrange /*= true*/)
 {
 	if (!item) return false;
 	if (value.isUndefined()) return false;
@@ -97,8 +97,11 @@ bool LLFlatListView::addItem(LLPanel * item, const LLSD& value /*= LLUUID::null*
 	// Children don't accept the focus
 	item->setTabStop(false);
 
-	rearrangeItems();
-	notifyParentItemsRectChanged();
+	if (rearrange)
+	{
+		rearrangeItems();
+		notifyParentItemsRectChanged();
+	}
 	return true;
 }
 
@@ -980,7 +983,86 @@ S32 LLFlatListView::notify(const LLSD& info)
 			return 1;
 		}
 	}
+	else if (info.has("rearrange"))
+	{
+		rearrangeItems();
+		notifyParentItemsRectChanged();
+		return 1;
+	}
 	return 0;
 }
 
+void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
+{
+	LLSD action;
+	action.with("detach", LLSD());
+	// Clear detached_items list
+	detached_items.clear();
+	// Go through items and detach valid items, remove them from items panel
+	// and add to detached_items.
+	for (pairs_iterator_t
+			 iter = mItemPairs.begin(),
+			 iter_end = mItemPairs.end();
+		 iter != iter_end; ++iter)
+	{
+		LLPanel* pItem = (*iter)->first;
+		if (1 == pItem->notify(action))
+		{
+			selectItemPair((*iter), false);
+			mItemsPanel->removeChild(pItem);
+			detached_items.push_back(pItem);
+		}
+	}
+	if (!detached_items.empty())
+	{
+		// Some items were detached, clean ourself from unusable memory
+		if (detached_items.size() == mItemPairs.size())
+		{
+			// This way will be faster if all items were disconnected
+			for (pairs_iterator_t
+					 iter = mItemPairs.begin(),
+					 iter_end = mItemPairs.end();
+				 iter != iter_end; ++iter)
+			{
+				(*iter)->first = NULL;
+				delete *iter;
+			}
+			mItemPairs.clear();
+			// Also set items panel height to zero.
+			// Reshape it to allow reshaping of non-item children.
+			LLRect rc = mItemsPanel->getRect();
+			rc.mBottom = rc.mTop;
+			mItemsPanel->reshape(rc.getWidth(), rc.getHeight());
+			mItemsPanel->setRect(rc);
+			setNoItemsCommentVisible(true);
+		}
+		else
+		{
+			for (std::vector<LLPanel*>::const_iterator
+					 detached_iter = detached_items.begin(),
+					 detached_iter_end = detached_items.end();
+				 detached_iter != detached_iter_end; ++detached_iter)
+			{
+				LLPanel* pDetachedItem = *detached_iter;
+				for (pairs_iterator_t
+						 iter = mItemPairs.begin(),
+						 iter_end = mItemPairs.end();
+					 iter != iter_end; ++iter)
+				{
+					item_pair_t* item_pair = *iter;
+					if (item_pair->first == pDetachedItem)
+					{
+						mItemPairs.erase(iter);
+						item_pair->first = NULL;
+						delete item_pair;
+						break;
+					}
+				}
+			}
+			rearrangeItems();
+		}
+		notifyParentItemsRectChanged();
+	}
+}
+
 //EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index a488b00854d2d4ab21d951c55c506c203341ec80..5999e79f61bc9ee3ee49da615b70e5a543d81a41 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -133,7 +133,7 @@ class LLFlatListView : public LLScrollContainer
 	 * Adds and item and LLSD value associated with it to the list at specified position
 	 * @return true if the item was added, false otherwise 
 	 */
-	virtual bool addItem(LLPanel * item, const LLSD& value = LLUUID::null, EAddPosition pos = ADD_BOTTOM);
+	virtual bool addItem(LLPanel * item, const LLSD& value = LLUUID::null, EAddPosition pos = ADD_BOTTOM, bool rearrange = true);
 
 	/**
 	 * Insert item_to_add along with associated value to the list right after the after_item.
@@ -270,6 +270,15 @@ class LLFlatListView : public LLScrollContainer
 	/** Removes all items from the list */
 	virtual void clear();
 
+	/**
+	 * Removes all items that can be detached from the list but doesn't destroy
+	 * them, caller responsible to manage items after they are detached.
+	 * Detachable item should accept "detach" action via notify() method,
+	 * where it disconnect all callbacks, does other valuable routines and
+	 * return 1.
+	 */
+	void detachItems(std::vector<LLPanel*>& detached_items);
+
 	/**
 	 * Set comparator to use for future sorts.
 	 * 
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index d7a692ec9badf7eced4ee6dd39d3dad8b8d71566..845203b420ebb7e29ef5a70372462f6ba61948c1 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -2148,6 +2148,11 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
 	if (give_focus && !gFocusMgr.childHasKeyboardFocus(child))
 	{
 		child->setFocus(TRUE);
+		// floater did not take focus, so relinquish focus to world
+		if (!child->hasFocus())
+		{
+			gFocusMgr.setKeyboardFocus(NULL);
+		}
 	}
 }
 
diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp
index 629964c322f4b647d5c195491ed9b5d57d21630e..ee6ec0f88f11afcc67ec52e4d3095ec8433bd407 100644
--- a/indra/llui/llnotificationslistener.cpp
+++ b/indra/llui/llnotificationslistener.cpp
@@ -188,9 +188,10 @@ class LLNotificationsListener::Forwarder: public LLEventTrackable
         LLNotificationChannelPtr channelptr(llnotifications.getChannel(channel));
         if (channelptr)
         {
-            // Try connecting at the front of the 'changed' signal. That way
-            // we shouldn't get starved by preceding listeners.
-            channelptr->connectAtFrontChanged(boost::bind(&Forwarder::handle, this, _1));
+            // Insert our processing as a "passed filter" listener. This way
+            // we get to run before all the "changed" listeners, and we get to
+            // swipe it (hide it from the other listeners) if desired.
+            channelptr->connectPassedFilter(boost::bind(&Forwarder::handle, this, _1));
         }
     }
 
@@ -251,6 +252,7 @@ bool LLNotificationsListener::Forwarder::handle(const LLSD& notification) const
     if (notification["sigtype"].asString() == "delete")
     {
         LL_INFOS("LLNotificationsListener") << "ignoring delete" << LL_ENDL;
+        // let other listeners see the "delete" operation
         return false;
     }
     LLNotificationPtr note(mNotifications.find(notification["id"]));
@@ -262,6 +264,8 @@ bool LLNotificationsListener::Forwarder::handle(const LLSD& notification) const
     if (! matchType(mTypes, note->getType()))
     {
         LL_INFOS("LLNotificationsListener") << "didn't match types " << mTypes << LL_ENDL;
+        // We're not supposed to intercept this particular notification. Let
+        // other listeners process it.
         return false;
     }
     LL_INFOS("LLNotificationsListener") << "sending via '" << mPumpName << "'" << LL_ENDL;
@@ -282,7 +286,11 @@ bool LLNotificationsListener::Forwarder::handle(const LLSD& notification) const
             mNotifications.cancel(note);
         }
     }
-    return false;                   // let other listeners get same notification
+    // If we've auto-responded to this notification, then it's going to be
+    // deleted. Other listeners would get the change operation, try to look it
+    // up and be baffled by lookup failure. So when we auto-respond, suppress
+    // this notification: don't pass it to other listeners.
+    return mRespond;
 }
 
 bool LLNotificationsListener::Forwarder::matchType(const LLSD& filter, const std::string& type) const
@@ -314,7 +322,7 @@ bool LLNotificationsListener::Forwarder::matchType(const LLSD& filter, const std
 LLSD LLNotificationsListener::asLLSD(LLNotificationPtr note)
 {
     LLSD notificationInfo(note->asLLSD());
-    // For some reason the following aren't included in asLLSD().
+    // For some reason the following aren't included in LLNotification::asLLSD().
     notificationInfo["summary"] = note->summarize();
     notificationInfo["id"]      = note->id();
     notificationInfo["type"]    = note->getType();
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f3d399c616b425cb6d1d8b8a9f697ac6039ffe70..7d8e9268e58d514689f78bd49edead416f08693b 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1397,12 +1397,29 @@ if (WINDOWS)
     # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.
     # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
     # and have the build deps get tracked *please* tell me about it.
+
+    if(LLKDU_LIBRARY)
+      # Configure a var for llkdu which may not exist for all builds.
+      set(LLKDU_DLL_SOURCE ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llkdu.dll)
+    endif(LLKDU_LIBRARY)
+
+    if(USE_GOOGLE_PERFTOOLS)
+      # Configure a var for tcmalloc location, if used.
+      # Note the need to specify multiple names explicitly.
+      set(GOOGLE_PERF_TOOLS_SOURCE
+        ${SHARED_LIB_STAGING_DIR}/Release/libtcmalloc_minimal.dll
+	${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll
+	${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
+	)
+    endif(USE_GOOGLE_PERFTOOLS)
+	  
+
     set(COPY_INPUT_DEPENDECIES
       # The following commented dependencies are determined at variably at build time. Can't do this here.
-      #llkdu.dll => llkdu.dll
       #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
       ${CMAKE_SOURCE_DIR}/../etc/message.xml
       ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
+      ${LLKDU_DLL_SOURCE}
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
@@ -1426,6 +1443,7 @@ if (WINDOWS)
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
       ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
+      ${GOOGLE_PERF_TOOLS_SOURCE}
       ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
       ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
       ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
@@ -1501,7 +1519,7 @@ if (WINDOWS)
     
     if(LLKDU_LIBRARY)
       # kdu may not exist!
-      add_dependencies(${VIEWER_BINARY_NAME} llkdu)
+      add_dependencies(copy_w_viewer_manifest llkdu)
     endif(LLKDU_LIBRARY)
 
     if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts)
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 5c5c4e5b3c81f2574f555dcafabdf8aa66066eb3..cc8f6780e3cbf54a2fc16d8bbe7b22787862a4b3 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -157,7 +157,7 @@ Intel Bear Lake					.*Intel.*Bear Lake.*				0		0
 Intel Broadwater 				.*Intel.*Broadwater.*				0		0
 Intel Brookdale					.*Intel.*Brookdale.*				0		0
 Intel Cantiga					.*Intel.*Cantiga.*					0		0
-Intel Eaglelake					.*Intel.*Eaglelake.*				0		0
+Intel Eaglelake					.*Intel.*Eaglelake.*				0		1
 Intel Montara					.*Intel.*Montara.*					0		0
 Intel Springdale				.*Intel.*Springdale.*				0		0
 Matrox							.*Matrox.*							0		0
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 4d5d416907458a53b3294f2bb544477a94740e03..976b31250935be56f769cb3ac3d15631994b4d0a 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -148,6 +148,12 @@ void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& nam
 {
 	if (!getChicletPanel()) return;
 
+	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (!session) return;
+
+	// no need to spawn chiclets for participants in P2P calls called through Avaline
+	if (session->isP2P() && session->isOtherParticipantAvaline()) return;
+
 	if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
 
 	LLIMChiclet* chiclet = createIMChiclet(session_id);
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index d209060b5887020631b7614acbc4bee519a7d0cc..e2e3524f74fdacd25628421350e1ec4e3640c5de 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -483,6 +483,17 @@ bool LLIMModel::LLIMSession::isAdHoc()
 	return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID));
 }
 
+bool LLIMModel::LLIMSession::isP2P()
+{
+	return IM_NOTHING_SPECIAL == mType;
+}
+
+bool LLIMModel::LLIMSession::isOtherParticipantAvaline()
+{
+	return !mOtherParticipantIsAvatar;
+}
+
+
 void LLIMModel::processSessionInitializedReply(const LLUUID& old_session_id, const LLUUID& new_session_id)
 {
 	LLIMSession* session = findIMSession(old_session_id);
@@ -1500,7 +1511,7 @@ bool LLOutgoingCallDialog::lifetimeHasExpired()
 	if (mLifetimeTimer.getStarted())
 	{
 		F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32();
-		if (elapsed_time > LIFETIME) 
+		if (elapsed_time > mLifetime) 
 		{
 			return true;
 		}
@@ -1521,6 +1532,13 @@ void LLOutgoingCallDialog::show(const LLSD& key)
 	// hide all text at first
 	hideAllText();
 
+	// init notification's lifetime
+	std::istringstream ss( getString("lifetime") );
+	if (!(ss >> mLifetime))
+	{
+		mLifetime = DEFAULT_LIFETIME;
+	}
+
 	// customize text strings
 	// tell the user which voice channel they are leaving
 	if (!mPayload["old_channel_name"].asString().empty())
@@ -1630,6 +1648,43 @@ LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
 LLCallDialog(payload)
 {
 }
+void LLIncomingCallDialog::draw()
+{
+	if (lifetimeHasExpired())
+	{
+		onLifetimeExpired();
+	}
+	LLDockableFloater::draw();
+}
+
+bool LLIncomingCallDialog::lifetimeHasExpired()
+{
+	if (mLifetimeTimer.getStarted())
+	{
+		F32 elapsed_time = mLifetimeTimer.getElapsedTimeF32();
+		if (elapsed_time > mLifetime) 
+		{
+			return true;
+		}
+	}
+	return false;
+}
+
+void LLIncomingCallDialog::onLifetimeExpired()
+{
+	// check whether a call is valid or not
+	if (LLVoiceClient::getInstance()->findSession(mPayload["caller_id"].asUUID()))
+	{
+		// restart notification's timer if call is still valid
+		mLifetimeTimer.start();
+	}
+	else
+	{
+		// close invitation if call is already not valid
+		mLifetimeTimer.stop();
+		closeFloater();
+	}
+}
 
 BOOL LLIncomingCallDialog::postBuild()
 {
@@ -1639,6 +1694,13 @@ BOOL LLIncomingCallDialog::postBuild()
 	LLSD caller_id = mPayload["caller_id"];
 	std::string caller_name = mPayload["caller_name"].asString();
 	
+	// init notification's lifetime
+	std::istringstream ss( getString("lifetime") );
+	if (!(ss >> mLifetime))
+	{
+		mLifetime = DEFAULT_LIFETIME;
+	}
+
 	std::string call_type;
 	if (gAgent.isInGroup(session_id))
 	{
@@ -1676,6 +1738,16 @@ BOOL LLIncomingCallDialog::postBuild()
 	childSetAction("Start IM", onStartIM, this);
 	childSetFocus("Accept");
 
+	if(mPayload["notify_box_type"] != "VoiceInviteGroup" && mPayload["notify_box_type"] != "VoiceInviteAdHoc")
+	{
+		// starting notification's timer for P2P and AVALINE invitations
+		mLifetimeTimer.start();
+	}
+	else
+	{
+		mLifetimeTimer.stop();
+	}
+
 	return TRUE;
 }
 
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 3f46b0d75463c3ae6de25f4abf16aae4ef64c830..d0ac819161ee2bb16a145bf4cfa682091b8bed67 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -75,6 +75,8 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 		static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
 
 		bool isAdHoc();
+		bool isP2P();
+		bool isOtherParticipantAvaline();
 
 		LLUUID mSessionID;
 		std::string mName;
@@ -487,6 +489,14 @@ class LLCallDialog : public LLDockableFloater
 	virtual BOOL postBuild();
 
 protected:
+	// lifetime timer for a notification
+	LLTimer	mLifetimeTimer;
+	// notification's lifetime in seconds
+	S32		mLifetime;
+	static const S32 DEFAULT_LIFETIME = 5;
+	virtual bool lifetimeHasExpired() {return false;};
+	virtual void onLifetimeExpired() {};
+
 	virtual void getAllowedRect(LLRect& rect);
 	LLSD mPayload;
 };
@@ -499,11 +509,16 @@ class LLIncomingCallDialog : public LLCallDialog
 	/*virtual*/ BOOL postBuild();
 	/*virtual*/ void onOpen(const LLSD& key);
 
+	// check timer state
+	/*virtual*/ void draw();
+
 	static void onAccept(void* user_data);
 	static void onReject(void* user_data);
 	static void onStartIM(void* user_data);
 
 private:
+	/*virtual*/ bool lifetimeHasExpired();
+	/*virtual*/ void onLifetimeExpired();
 	void processCallResponse(S32 response);
 };
 
@@ -522,15 +537,10 @@ class LLOutgoingCallDialog : public LLCallDialog
 	/*virtual*/ void draw();
 
 private:
-
 	// hide all text boxes
 	void hideAllText();
-	// lifetime timer for NO_ANSWER notification
-	LLTimer	mLifetimeTimer;
-	// lifetime duration for NO_ANSWER notification
-	static const S32 LIFETIME = 5;
-	bool lifetimeHasExpired();
-	void onLifetimeExpired();
+	/*virtual*/ bool lifetimeHasExpired();
+	/*virtual*/ void onLifetimeExpired();
 };
 
 // Globals
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 3f309b3bf583939d3cb7b995102a159bd5a8086e..a8a75a1feb6156826da406bff415eda0f6a53893 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -65,7 +65,11 @@ void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
 
 void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
 {
-	bool is_call_started = ( new_state >= LLVoiceChannel::STATE_CALL_STARTED );
+	updateButtons(new_state >= LLVoiceChannel::STATE_CALL_STARTED);
+}
+
+void LLPanelChatControlPanel::updateButtons(bool is_call_started)
+{
 	childSetVisible("end_call_btn", is_call_started);
 	childSetVisible("voice_ctrls_btn", is_call_started);
 	childSetVisible("call_btn", ! is_call_started);
@@ -112,6 +116,9 @@ void LLPanelChatControlPanel::setSessionId(const LLUUID& session_id)
 	if(voice_channel)
 	{
 		mVoiceChannelStateChangeConnection = voice_channel->setStateChangedCallback(boost::bind(&LLPanelChatControlPanel::onVoiceChannelStateChanged, this, _1, _2));
+		
+		//call (either p2p, group or ad-hoc) can be already in started state
+		updateButtons(voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
 	}
 }
 
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 711340efc77111ad73c1616b3caae286fa958f03..c18be5a6df95ab27d6216cdade180400bd07b2f2 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -57,6 +57,8 @@ class LLPanelChatControlPanel : public LLPanel
 
 	virtual void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
 
+	void updateButtons(bool is_call_started);
+
 	virtual void setSessionId(const LLUUID& session_id);
 	const LLUUID& getSessionId() { return mSessionId; }
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index e5846c7318a6485d4ef20de9ff59eac6163c67cd..374af5c0590e15a1def80a2600bc1dad22110792 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -984,6 +984,8 @@ void LLPanelPeople::onTabSelected(const LLSD& param)
 	mNearbyListUpdater->setActive(tab_name == NEARBY_TAB_NAME);
 	updateButtons();
 
+	showFriendsAccordionsIfNeeded();
+
 	if (GROUP_TAB_NAME == tab_name)
 		mFilterEditor->setLabel(getString("groups_filter_label"));
 	else
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 596bd2909a0cfb558e9d8bd44bdfb7aec91ec7c9..03b616d28055123521ebb20aa5119dc9ad27e629 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -60,13 +60,18 @@ class LLTeleportHistoryFlatItem : public LLPanel
 {
 public:
 	LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name, const std::string &hl);
-	virtual ~LLTeleportHistoryFlatItem() {};
+	virtual ~LLTeleportHistoryFlatItem();
 
 	virtual BOOL postBuild();
 
+	/*virtual*/ S32 notify(const LLSD& info);
+
 	S32 getIndex() { return mIndex; }
 	void setIndex(S32 index) { mIndex = index; }
 	const std::string& getRegionName() { return mRegionName;}
+	void setRegionName(const std::string& name);
+	void setHighlightedText(const std::string& text);
+	void updateTitle();
 
 	/*virtual*/ void setValue(const LLSD& value);
 
@@ -75,18 +80,51 @@ class LLTeleportHistoryFlatItem : public LLPanel
 	virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
 
 	static void showPlaceInfoPanel(S32 index);
+
+	LLHandle<LLTeleportHistoryFlatItem> getItemHandle()	{ mItemHandle.bind(this); return mItemHandle; }
+
 private:
 	void onProfileBtnClick();
 
 	LLButton* mProfileBtn;
+	LLTextBox* mTitle;
 	
 	LLTeleportHistoryPanel::ContextMenu *mContextMenu;
 
 	S32 mIndex;
 	std::string mRegionName;
 	std::string mHighlight;
+	LLRootHandle<LLTeleportHistoryFlatItem> mItemHandle;
+};
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+class LLTeleportHistoryFlatItemStorage: public LLSingleton<LLTeleportHistoryFlatItemStorage> {
+protected:
+	typedef std::vector< LLHandle<LLTeleportHistoryFlatItem> > flat_item_list_t;
+
+public:
+	LLTeleportHistoryFlatItem* getFlatItemForPersistentItem (
+		LLTeleportHistoryPanel::ContextMenu *context_menu,
+		const LLTeleportHistoryPersistentItem& persistent_item,
+		const S32 cur_item_index,
+		const std::string &hl);
+
+	void removeItem(LLTeleportHistoryFlatItem* item);
+
+	void purge();
+
+private:
+
+	flat_item_list_t mItems;
 };
 
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
 LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistoryPanel::ContextMenu *context_menu, const std::string &region_name, const std::string &hl)
 :	LLPanel(),
 	mIndex(index),
@@ -97,18 +135,37 @@ LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistor
 	LLUICtrlFactory::getInstance()->buildPanel(this, "panel_teleport_history_item.xml");
 }
 
+LLTeleportHistoryFlatItem::~LLTeleportHistoryFlatItem()
+{
+}
+
 //virtual
 BOOL LLTeleportHistoryFlatItem::postBuild()
 {
-	LLTextUtil::textboxSetHighlightedVal(getChild<LLTextBox>("region"), LLStyle::Params(), mRegionName, mHighlight);
+	mTitle = getChild<LLTextBox>("region");
 
 	mProfileBtn = getChild<LLButton>("profile_btn");
         
 	mProfileBtn->setClickedCallback(boost::bind(&LLTeleportHistoryFlatItem::onProfileBtnClick, this));
 
+	updateTitle();
+
 	return true;
 }
 
+S32 LLTeleportHistoryFlatItem::notify(const LLSD& info)
+{
+	if(info.has("detach"))
+	{
+		delete mMouseDownSignal;
+		mMouseDownSignal = NULL;
+		delete mRightMouseDownSignal;
+		mRightMouseDownSignal = NULL;
+		return 1;
+	}
+	return 0;
+}
+
 void LLTeleportHistoryFlatItem::setValue(const LLSD& value)
 {
 	if (!value.isMap()) return;;
@@ -116,6 +173,25 @@ void LLTeleportHistoryFlatItem::setValue(const LLSD& value)
 	childSetVisible("selected_icon", value["selected"]);
 }
 
+void LLTeleportHistoryFlatItem::setHighlightedText(const std::string& text)
+{
+	mHighlight = text;
+}
+
+void LLTeleportHistoryFlatItem::setRegionName(const std::string& name)
+{
+	mRegionName = name;
+}
+
+void LLTeleportHistoryFlatItem::updateTitle()
+{
+	LLTextUtil::textboxSetHighlightedVal(
+		mTitle,
+		LLStyle::Params(),
+		mRegionName,
+		mHighlight);
+}
+
 void LLTeleportHistoryFlatItem::onMouseEnter(S32 x, S32 y, MASK mask)
 {
 	childSetVisible("hovered_icon", true);
@@ -155,6 +231,82 @@ void LLTeleportHistoryFlatItem::onProfileBtnClick()
 	LLTeleportHistoryFlatItem::showPlaceInfoPanel(mIndex);
 }
 
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+LLTeleportHistoryFlatItem*
+LLTeleportHistoryFlatItemStorage::getFlatItemForPersistentItem (
+	LLTeleportHistoryPanel::ContextMenu *context_menu,
+	const LLTeleportHistoryPersistentItem& persistent_item,
+	const S32 cur_item_index,
+	const std::string &hl)
+{
+	LLTeleportHistoryFlatItem* item = NULL;
+	if ( cur_item_index < (S32) mItems.size() )
+	{
+		item = mItems[cur_item_index].get();
+		if (item->getParent() == NULL)
+		{
+			item->setIndex(cur_item_index);
+			item->setRegionName(persistent_item.mTitle);
+			item->setHighlightedText(hl);
+			item->setVisible(TRUE);
+			item->updateTitle();
+		}
+		else
+		{
+			// Item already added to parent
+			item = NULL;
+		}
+	}
+
+	if ( !item )
+	{
+		item = new LLTeleportHistoryFlatItem(cur_item_index,
+											 context_menu,
+											 persistent_item.mTitle,
+											 hl);
+		mItems.push_back(item->getItemHandle());
+	}
+
+	return item;
+}
+
+void LLTeleportHistoryFlatItemStorage::removeItem(LLTeleportHistoryFlatItem* item)
+{
+	if (item)
+	{
+		flat_item_list_t::iterator item_iter = std::find(mItems.begin(),
+														 mItems.end(),
+														 item->getItemHandle());
+		if (item_iter != mItems.end())
+		{
+			mItems.erase(item_iter);
+		}
+	}
+}
+
+void LLTeleportHistoryFlatItemStorage::purge()
+{
+	for ( flat_item_list_t::iterator
+			  it = mItems.begin(),
+			  it_end = mItems.end();
+		  it != it_end; ++it )
+	{
+		LLHandle <LLTeleportHistoryFlatItem> item_handle = *it;
+		if ( !item_handle.isDead() && item_handle.get()->getParent() == NULL )
+		{
+			item_handle.get()->die();
+		}
+	}
+	mItems.clear();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
 LLTeleportHistoryPanel::ContextMenu::ContextMenu() :
 	mMenu(NULL)
 {
@@ -236,6 +388,7 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel()
 
 LLTeleportHistoryPanel::~LLTeleportHistoryPanel()
 {
+	LLTeleportHistoryFlatItemStorage::instance().purge();
 	LLView::deleteViewByHandle(mGearMenuHandle);
 }
 
@@ -319,8 +472,11 @@ void LLTeleportHistoryPanel::draw()
 // virtual
 void LLTeleportHistoryPanel::onSearchEdit(const std::string& string)
 {
-	sFilterSubString = string;
-	showTeleportHistory();
+	if (sFilterSubString != string)
+	{
+		sFilterSubString = string;
+		showTeleportHistory();
+	}
 }
 
 // virtual
@@ -478,16 +634,15 @@ void LLTeleportHistoryPanel::refresh()
 	while (mCurrentItem >= 0)
 	{
 		// Filtering
-		std::string landmark_title = items[mCurrentItem].mTitle;
-		LLStringUtil::toUpper(landmark_title);
-
-		std::string::size_type match_offset = sFilterSubString.size() ? landmark_title.find(sFilterSubString) : std::string::npos;
-		bool passed = sFilterSubString.size() == 0 || match_offset != std::string::npos;
-
-		if (!passed)
+		if (!sFilterSubString.empty())
 		{
-			mCurrentItem--;
-			continue;
+			std::string landmark_title(items[mCurrentItem].mTitle);
+			LLStringUtil::toUpper(landmark_title);
+			if( std::string::npos == landmark_title.find(sFilterSubString) )
+			{
+				mCurrentItem--;
+				continue;
+			}
 		}
 
 		// Checking whether date of item is earlier, than tab_boundary_date.
@@ -521,9 +676,14 @@ void LLTeleportHistoryPanel::refresh()
 
 		if (curr_flat_view)
 		{
-			LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(mCurrentItem, &mContextMenu, items[mCurrentItem].mTitle, sFilterSubString);
-			curr_flat_view->addItem(item);
-
+			LLTeleportHistoryFlatItem* item =
+				LLTeleportHistoryFlatItemStorage::instance()
+				.getFlatItemForPersistentItem(&mContextMenu,
+											  items[mCurrentItem],
+											  mCurrentItem,
+											  sFilterSubString);
+			if ( !curr_flat_view->addItem(item, LLUUID::null, ADD_BOTTOM, false) )
+				llerrs << "Couldn't add flat item to teleport history." << llendl;
 			if (mLastSelectedItemIndex == mCurrentItem)
 				curr_flat_view->selectItem(item, true);
 		}
@@ -534,6 +694,16 @@ void LLTeleportHistoryPanel::refresh()
 			break;
 	}
 
+	for (S32 n = mItemContainers.size() - 1; n >= 0; --n)
+	{
+		LLAccordionCtrlTab* tab = mItemContainers.get(n);
+		LLFlatListView* fv = getFlatListViewFromTab(tab);
+		if (fv)
+		{
+			fv->notify(LLSD().with("rearrange", LLSD()));
+		}
+	}
+
 	mHistoryAccordion->arrange();
 
 	updateVerbs();
@@ -566,11 +736,12 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
 	}
 
 	const LLTeleportHistoryStorage::slurl_list_t& history_items = mTeleportHistory->getItems();
-	LLTeleportHistoryFlatItem* item = new LLTeleportHistoryFlatItem(history_items.size(), // index will be decremented inside loop below
-									&mContextMenu,
-									history_items[history_items.size() - 1].mTitle, // Most recent item, it was
-									sFilterSubString);
-															 // added instead of removed
+	LLTeleportHistoryFlatItem* item = LLTeleportHistoryFlatItemStorage::instance()
+		.getFlatItemForPersistentItem(&mContextMenu,
+									  history_items[history_items.size() - 1], // Most recent item, it was added instead of removed
+									  history_items.size(), // index will be decremented inside loop below
+									  sFilterSubString);
+
 	fv->addItem(item, LLUUID::null, ADD_TOP);
 
 	// Index of each item, from last to removed item should be decremented
@@ -598,6 +769,8 @@ void LLTeleportHistoryPanel::replaceItem(S32 removed_index)
 
 			if (item->getIndex() == removed_index)
 			{
+				LLTeleportHistoryFlatItemStorage::instance().removeItem(item);
+
 				fv->removeItem(item);
 
 				// If flat list becames empty, then accordion tab should be hidden
@@ -629,10 +802,12 @@ void LLTeleportHistoryPanel::showTeleportHistory()
 
 		LLFlatListView* fv = getFlatListViewFromTab(tab);
 		if (fv)
-			fv->clear();
+		{
+			// Detached panels are managed by LLTeleportHistoryFlatItemStorage
+			std::vector<LLPanel*> detached_items;
+			fv->detachItems(detached_items);
+		}
 	}
-
-	refresh();
 }
 
 void LLTeleportHistoryPanel::handleItemSelect(LLFlatListView* selected)
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 8c6ea59407b9ef2bf02efb4be569ab84ea570e68..3cddf6d902cd542a77055ffaf070ef6c8a4dfb28 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -743,9 +743,13 @@ BOOL LLIMWellWindow::postBuild()
 void LLIMWellWindow::sessionAdded(const LLUUID& session_id,
 								   const std::string& name, const LLUUID& other_participant_id)
 {
-	if (mMessageList->getItemByValue(session_id)) return;
+	LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (!session) return;
+
+	// no need to spawn chiclets for participants in P2P calls called through Avaline
+	if (session->isP2P() && session->isOtherParticipantAvaline()) return;
 
-	if (!gIMMgr->hasSession(session_id)) return;
+	if (mMessageList->getItemByValue(session_id)) return;
 
 	addIMRow(session_id, 0, name, other_participant_id);	
 	reshapeWindow();
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index e6857ea780064fceaa9931c88d83a1f12b183932..1940d65ae4d9ec5ee4b07a1ecb1b40eb4d029722 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -334,7 +334,6 @@ void LLWorldMapView::draw()
 	gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
 	gGL.setColorMask(true, true);
 
-#if 1
 	// Draw the image tiles
 	drawMipmap(width, height);
 	gGL.flush();
@@ -452,7 +451,7 @@ void LLWorldMapView::draw()
 		// Draw the region name in the lower left corner
 		if (sMapScale >= DRAW_TEXT_THRESHOLD)
 		{
-			LLFontGL* font = LLFontGL::getFontSansSerifSmall();
+			LLFontGL* font = LLFontGL::getFont(LLFontDescriptor("SansSerif", "Small", LLFontGL::BOLD));
 			std::string mesg;
 			if (info->isDown())
 			{
@@ -468,14 +467,13 @@ void LLWorldMapView::draw()
 					mesg, 0,
 					llfloor(left + 3), llfloor(bottom + 2),
 					LLColor4::white,
-					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
+					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW);
 			}
 		}
 	}
-	#endif
 
 
-	#if 1
+
 	// Draw background rectangle
 	LLGLSUIDefault gls_ui;
 	{
@@ -566,7 +564,7 @@ void LLWorldMapView::draw()
 			drawTracking( LLWorldMap::getInstance()->getTrackedPositionGlobal(), loading_color, TRUE, getString("Loading"), "");
 		}
 	}
-	#endif
+
 
 	// turn off the scissor
 	LLGLDisable no_scissor(GL_SCISSOR_TEST);
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 81c54ae55e729e915dbd2e1e19811185d7342957..b9ce11600fff06134d30af297f4d3702b0f426c6 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -10,6 +10,10 @@
  help_topic="incoming_call"
  title="UNKNOWN PERSON IS CALLING"
  width="410">
+    <floater.string
+     name="lifetime">
+        5
+    </floater.string>
     <floater.string
      name="localchat">
         Nearby Voice Chat
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index c6bc093c6c9aa233b29815abba36e26b9570e6c0..104ac2143f9913177fded6484fce6e2ab0e605ba 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -10,6 +10,10 @@
  help_topic="outgoing_call"
  title="CALLING"
  width="410">
+    <floater.string
+     name="lifetime">
+        5
+    </floater.string>
     <floater.string
      name="localchat">
         Nearby Voice Chat
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 32eae9d11da1dd1c275e0cd5f18c3ceb1794ddd3..f004c95aca886f987d1765f70ef704edfbabedde 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2907,7 +2907,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
     Joining voice call...
   </string>
   <string name="connected-im">
-    Connected, click End Call to hang up
+    Connected, click Leave Call to hang up
   </string>
   <string name="hang_up-im">
     Left voice call