diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 80d277893470d2309f5e7bfb054a29d46456d6a8..b7d4db853eb878c604c91a5a0591738c6c717a35 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1733,6 +1733,9 @@ void LLIncomingCallDialog::onLifetimeExpired()
 	{
 		// close invitation if call is already not valid
 		mLifetimeTimer.stop();
+		LLUUID session_id = mPayload["session_id"].asUUID();
+		gIMMgr->clearPendingAgentListUpdates(session_id);
+		gIMMgr->clearPendingInvitation(session_id);
 		closeFloater();
 	}
 }
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 050cfcc3d92272f9619d37f8be91a6d5ae3cd460..0e93e28f2da12cbd1bdb85f5a8ebea42f6ea647a 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -153,6 +153,23 @@ class LLRemoveLandmarkObserver : public LLInventoryObserver
 	LLLocationInputCtrl* mInput;
 };
 
+class LLParcelChangeObserver : public LLParcelObserver
+{
+public:
+	LLParcelChangeObserver(LLLocationInputCtrl* input) : mInput(input) {}
+
+private:
+	/*virtual*/ void changed()
+	{
+		if (mInput)
+		{
+			mInput->refreshParcelIcons();
+		}
+	}
+
+	LLLocationInputCtrl* mInput;
+};
+
 //============================================================================
 
 
@@ -335,7 +352,10 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	mAddLandmarkObserver	= new LLAddLandmarkObserver(this);
 	gInventory.addObserver(mRemoveLandmarkObserver);
 	gInventory.addObserver(mAddLandmarkObserver);
-	
+
+	mParcelChangeObserver = new LLParcelChangeObserver(this);
+	LLViewerParcelMgr::getInstance()->addObserver(mParcelChangeObserver);
+
 	mAddLandmarkTooltip = LLTrans::getString("LocationCtrlAddLandmarkTooltip");
 	mEditLandmarkTooltip = LLTrans::getString("LocationCtrlEditLandmarkTooltip");
 	getChild<LLView>("Location History")->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip"));
@@ -349,6 +369,9 @@ LLLocationInputCtrl::~LLLocationInputCtrl()
 	delete mRemoveLandmarkObserver;
 	delete mAddLandmarkObserver;
 
+	LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangeObserver);
+	delete mParcelChangeObserver;
+
 	mParcelMgrConnection.disconnect();
 	mLocationHistoryConnection.disconnect();
 }
@@ -673,15 +696,41 @@ void LLLocationInputCtrl::refreshParcelIcons()
 	if (show_properties)
 	{
 		LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+
+		LLViewerRegion* agent_region = gAgent.getRegion();
 		LLParcel* agent_parcel = vpm->getAgentParcel();
-		bool allow_buy      = vpm->canAgentBuyParcel( agent_parcel, false);
-		bool allow_voice	= vpm->allowAgentVoice();
-		bool allow_fly		= vpm->allowAgentFly();
-		bool allow_push		= vpm->allowAgentPush();
-		bool allow_build	= agent_parcel && agent_parcel->getAllowModify(); // true when anyone is allowed to build. See EXT-4610.
-		bool allow_scripts	= vpm->allowAgentScripts();
-		bool allow_damage	= vpm->allowAgentDamage();
-		
+		if (!agent_region || !agent_parcel)
+			return;
+
+		LLParcel* current_parcel;
+		LLViewerRegion* selection_region = vpm->getSelectionRegion();
+		LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel();
+
+		// If agent is in selected parcel we use its properties because
+		// they are updated more often by LLViewerParcelMgr than agent parcel properties.
+		// See LLViewerParcelMgr::processParcelProperties().
+		// This is needed to reflect parcel restrictions changes without having to leave
+		// the parcel and then enter it again. See EXT-2987
+		if (selected_parcel && selected_parcel->getLocalID() == agent_parcel->getLocalID()
+				&& selection_region == agent_region)
+		{
+			current_parcel = selected_parcel;
+		}
+		else
+		{
+			current_parcel = agent_parcel;
+		}
+
+		bool allow_buy      = vpm->canAgentBuyParcel(current_parcel, false);
+		bool allow_voice	= agent_region->isVoiceEnabled() && current_parcel->getParcelFlagAllowVoice();
+		bool allow_fly		= !agent_region->getBlockFly() && current_parcel->getAllowFly();
+		bool allow_push		= !agent_region->getRestrictPushObject() && !current_parcel->getRestrictPushObject();
+		bool allow_build	= current_parcel->getAllowModify(); // true when anyone is allowed to build. See EXT-4610.
+		bool allow_scripts	= !(agent_region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) &&
+							  !(agent_region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) &&
+							  current_parcel->getAllowOtherScripts();
+		bool allow_damage	= agent_region->getAllowDamage() || current_parcel->getAllowDamage();
+
 		// Most icons are "block this ability"
 		mForSaleBtn->setVisible(allow_buy);
 		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 607ccd4da6237237f57248568a959389486d6905..a830b33f6f91929fb7decb1c224f13c1ffd34f2e 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -42,6 +42,7 @@ class LLLandmark;
 // internals
 class LLAddLandmarkObserver;
 class LLRemoveLandmarkObserver;
+class LLParcelChangeObserver;
 class LLMenuGL;
 class LLTeleportHistoryItem;
 
@@ -56,6 +57,7 @@ class LLLocationInputCtrl
 	LOG_CLASS(LLLocationInputCtrl);
 	friend class LLAddLandmarkObserver;
 	friend class LLRemoveLandmarkObserver;
+	friend class LLParcelChangeObserver;
 
 public:
 	struct Params 
@@ -164,6 +166,7 @@ class LLLocationInputCtrl
 
 	LLAddLandmarkObserver*		mAddLandmarkObserver;
 	LLRemoveLandmarkObserver*	mRemoveLandmarkObserver;
+	LLParcelChangeObserver*		mParcelChangeObserver;
 
 	boost::signals2::connection	mParcelMgrConnection;
 	boost::signals2::connection	mLocationHistoryConnection;
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 8d689b2c5e4c37d6c8ae2f9df2f91b6fc47d4263..9b31ef23a26cfd879df373db46dc860675b298b9 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -341,7 +341,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
 	std::string off = getString("off");
 
 	// Processing parcel characteristics
-	if (parcel->getParcelFlagAllowVoice())
+	if (region->isVoiceEnabled() && parcel->getParcelFlagAllowVoice())
 	{
 		mVoiceIcon->setValue(icon_voice);
 		mVoiceText->setText(on);
@@ -385,9 +385,9 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
 		mBuildText->setText(off);
 	}
 
-	if((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
-	   (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
-	   !parcel->getAllowOtherScripts())
+	if ((region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS) ||
+	    (region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS) ||
+	    !parcel->getAllowOtherScripts())
 	{
 		mScriptsIcon->setValue(icon_scripts_no);
 		mScriptsText->setText(off);
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 9d7ccd99c66fa38b06a4f77d5ed91323013bb5ef..b85b42c710034aa495ac1efcbd2be50b3b480989 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1591,6 +1591,14 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 				instance->mTeleportInProgress = FALSE;
 				instance->mTeleportFinishedSignal(gAgent.getPositionGlobal());
 			}
+
+			// HACK: This makes agents drop from the sky if they enter a parcel
+			// which is set to no fly.
+			BOOL was_flying = gAgent.getFlying();
+			if (was_flying && !parcel->getAllowFly())
+			{
+				gAgent.setFlying(gAgent.canFly());
+			}
 		}
 	}
 
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index e2480479308e1dae4d97eb8c425a703d16de1589..219b3dbeb62abea37fc93a16c776ac0b39826136 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -97,7 +97,7 @@
      value="1 0.82 0.46 1" />
     <color
      name="AlertCautionTextColor"
-     reference="Black" />
+     reference="Yellow" />
     <color
      name="AgentLinkColor"
      reference="White" />