diff --git a/.hgtags b/.hgtags
index fe3aae1b9947d7a3e748715ec371654ea4aa6e56..2aa78a5ed06c82f46eb3f26846676985ccaaf3ef 100644
--- a/.hgtags
+++ b/.hgtags
@@ -420,3 +420,5 @@ b23419a2748483c98f3b84b630468a21c88feba5 DRTVWR-292
 0a5d409161ef2a89b28c9a741051dd2dedc707d6 DRTVWR-297
 852b69ef0b5fe6b13b69cc2217282cc64de6afab 3.4.5-beta5
 a49c715243a36a8a380504d14cb7416b3039c956 3.4.5-release
+279ef1dfc9b749a6cc499cf190fec0c090b6d682 DRTVWR-288
+9b19edaf1d8ddf435f60fbbb444dd25db8f63953 3.5.0-beta1
diff --git a/doc/contributions.txt b/doc/contributions.txt
index e86ef11a72bd58e85621a2482f45d812f8afe0df..10c935f9bbf2cc70d45cf5b7a3001b6436c33989 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -748,6 +748,7 @@ Marine Kelley
 MartinRJ Fayray
     STORM-1844
     STORM-1845
+    STORM-1934
 Matthew Anthony
 Matthew Dowd
 	VWR-1344
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 6a5ff314e4cbc31cf09073150a699a94d8cf2b06..1554e9e665fcd5f98699bd4c7762a7824595833b 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -28,8 +28,8 @@
 #define LL_LLVERSIONVIEWER_H
 
 const S32 LL_VERSION_MAJOR = 3;
-const S32 LL_VERSION_MINOR = 4;
-const S32 LL_VERSION_PATCH = 6;
+const S32 LL_VERSION_MINOR = 5;
+const S32 LL_VERSION_PATCH = 0;
 const S32 LL_VERSION_BUILD = 0;
 
 const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 7cee9f5b46215299909811a1343d8437eb16bcdf..4bb819a7f6b81d0bdc2466e9f5ca676d0aa2dcaa 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -1911,6 +1911,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
 	registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
 	registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
 	registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
+	registrar.add("Url.SendIM", boost::bind(&LLUrlAction::sendIM, url));
 	registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
 	registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
 	registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index fd9b3d9a6d33f6d26b89f7482dcf1b09841cf3d6..fd872eca4bfe4a633abf8a21229b6c7d125c1908 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -157,3 +157,17 @@ void LLUrlAction::showProfile(std::string url)
 		}
 	}
 }
+
+void LLUrlAction::sendIM(std::string url)
+{
+	LLURI uri(url);
+	LLSD path_array = uri.pathArray();
+	if (path_array.size() == 4)
+	{
+		std::string id_str = path_array.get(2).asString();
+		if (LLUUID::validate(id_str))
+		{
+			executeSLURL("secondlife:///app/agent/" + id_str + "/im");
+		}
+	}
+}
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index c34960b82622345aeccc014335f9a01dd5df204a..f5f2ceba728daa686544c0b9976de3e650947ac8 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -76,6 +76,7 @@ class LLUrlAction
 
 	/// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile
 	static void showProfile(std::string url);
+	static void sendIM(std::string url);
 
 	/// specify the callbacks to enable this class's functionality
 	typedef boost::function<void (const std::string&)> url_callback_t;
diff --git a/indra/newview/llconversationview.cpp b/indra/newview/llconversationview.cpp
index 882ef647151f9942ec80a26cd3a9cf632c7fa323..74b348cd81abc3b81751d56c4929b64648afb101 100755
--- a/indra/newview/llconversationview.cpp
+++ b/indra/newview/llconversationview.cpp
@@ -567,6 +567,7 @@ BOOL LLConversationViewParticipant::handleMouseDown( S32 x, S32 y, MASK mask )
 
     		LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container");
     		LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id);
+			im_container->setSelectedSession(session_id);
 			im_container->flashConversationItemWidget(session_id,false);
 			im_container->selectFloater(session_floater);
 			im_container->collapseMessagesPane(false);
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 59c2f15dd981bc28c68ee57f0054c2806a8bc029..4b0d3b361d55368130ede7598cd1a9d3805670df 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -577,6 +577,12 @@ F32 LLDrawable::updateXform(BOOL undamped)
 			mVObjp->dirtySpatialGroup();
 		}
 	}
+	else if (!isRoot() &&
+			((dist_vec_squared(old_pos, target_pos) > 0.f)
+			|| (1.f - dot(old_rot, target_rot)) > 0.f))
+	{ //fix for BUG-840, MAINT-2275, MAINT-1742, MAINT-2247
+			gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE);
+	}
 	else if (!getVOVolume() && !isAvatar())
 	{
 		movePartition();
@@ -643,18 +649,9 @@ BOOL LLDrawable::updateMove()
 		return FALSE;
 	}
 	
-	BOOL done;
+	makeActive();
 
-	if (isState(MOVE_UNDAMPED))
-	{
-		done = updateMoveUndamped();
-	}
-	else
-	{
-		makeActive();
-		done = updateMoveDamped();
-	}
-	return done;
+	return isState(MOVE_UNDAMPED) ? updateMoveUndamped() : updateMoveDamped();
 }
 
 BOOL LLDrawable::updateMoveUndamped()
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index 429ea09f565db032353f53c7d3726054ea793b21..1da3f52bf815ce40ca026e73234badf94762b8bd 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -758,11 +758,21 @@ void LLFloaterIMContainer::assignResizeLimits()
 	// between the panels are merged into one
     S32 number_of_visible_borders = llmin((is_conv_pane_expanded? 2 : 0) + (is_msg_pane_expanded? 2 : 0), 3);
     S32 summary_width_of_visible_borders = number_of_visible_borders * LLPANEL_BORDER_WIDTH;
-	S32 conv_pane_current_width = is_msg_pane_expanded
-			? mConversationsPane->getRect().getWidth()
-			: (is_conv_pane_expanded? mConversationsPane->getExpandedMinDim() : mConversationsPane->getMinDim());
+	S32 conv_pane_target_width = is_conv_pane_expanded?
+			(is_msg_pane_expanded?
+					mConversationsPane->getRect().getWidth()
+					: mConversationsPane->getExpandedMinDim())
+			: mConversationsPane->getMinDim();
 	S32 msg_pane_min_width  = is_msg_pane_expanded ? mMessagesPane->getExpandedMinDim() : 0;
-	S32 new_min_width = conv_pane_current_width + msg_pane_min_width + summary_width_of_visible_borders;
+	S32 new_min_width = conv_pane_target_width + msg_pane_min_width + summary_width_of_visible_borders;
+
+    if (is_conv_pane_expanded)
+    {
+    	// Save the conversations pane width.
+	    gSavedPerAccountSettings.setS32(
+	            "ConversationsListPaneWidth",
+                mConversationsPane->getRect().getWidth());
+    }
 
 	setResizeLimits(new_min_width, getMinHeight());
 }
@@ -1951,10 +1961,10 @@ void LLFloaterIMContainer::closeFloater(bool app_quitting/* = false*/)
 	// Most of the time the user will never see this state.
 	setMinimized(FALSE);
 
-	S32 conv_pane_width = mConversationsPane->getRect().getWidth();
-
-	// Save the conversations pane width before collapsing it.
-	gSavedPerAccountSettings.setS32("ConversationsListPaneWidth", conv_pane_width);
+	// Save the conversations pane width.
+	gSavedPerAccountSettings.setS32(
+			"ConversationsListPaneWidth",
+			mConversationsPane->getRect().getWidth());
 
 	LLFloater::closeFloater(app_quitting);
 }
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index 02f54e76db779a4381b8161cc3b43bf0245581e8..dfaf4bbdd60173592ef50486aa8ec831182f9d00 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -353,6 +353,13 @@ BOOL LLFloaterIMNearbyChat::handleKeyHere( KEY key, MASK mask )
 		sendChat(CHAT_TYPE_SHOUT);
 		handled = TRUE;
 	}
+	else if (KEY_RETURN == key && mask == MASK_SHIFT)
+	{
+		// whisper
+		sendChat(CHAT_TYPE_WHISPER);
+		handled = TRUE;
+	}
+
 
 	if((mask == MASK_ALT) && isTornOff())
 	{
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index d69bd89f136a74099400a1ef0d7655abe545f0ce..8f3f5145a96c7e6c9ede10bb9820575f2f669fae 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -273,7 +273,7 @@ void on_new_message(const LLSD& msg)
 		}
     }
 
-    else if("openconversations" == action && !session_floater_is_open)
+    else if("openconversations" == action)
     {
         //User is not focused on conversation containing the message
         if(session_floater_not_focused)
@@ -291,7 +291,8 @@ void on_new_message(const LLSD& msg)
             //useMostItrusiveIMNotification will be called to notify user a message exists
             if(session_id.notNull() 
                 && participant_id.notNull()
-                && gAgent.isDoNotDisturb())
+                && gAgent.isDoNotDisturb()
+				&& !session_floater_is_open)
             {
                 LLAvatarNameCache::get(participant_id, boost::bind(&on_avatar_name_cache_toast, _1, _2, msg));
 			}
diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml
index 73f0fa79797a6d88e84f093afddf48d646581001..88ae441bd387550080e9db490afdaa29f9048bc0 100644
--- a/indra/newview/skins/default/xui/en/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml
@@ -2,6 +2,13 @@
 <context_menu
  layout="topleft"
  name="Url Popup">
+    <menu_item_call
+     label="Send IM"
+     layout="topleft"
+     name="show_agent">
+        <menu_item_call.on_click
+         function="Url.SendIM" />        
+    </menu_item_call>
     <menu_item_call
      label="Show Resident Profile"
      layout="topleft"