diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 8b3391726a7fab80e84b21a74ed38d2f7f666027..a199da3b00c001a920e5e2963df3f89c920aee9c 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -1043,11 +1043,15 @@ void LLFloaterPreference::onClickSetKey()
 void LLFloaterPreference::setKey(KEY key)
 {
 	childSetValue("modifier_combo", LLKeyboard::stringFromKey(key));
+	// update the control right away since we no longer wait for apply
+	getChild<LLUICtrl>("modifier_combo")->onCommit();
 }
 
 void LLFloaterPreference::onClickSetMiddleMouse()
 {
 	childSetValue("modifier_combo", "MiddleMouse");
+	// update the control right away since we no longer wait for apply
+	getChild<LLUICtrl>("modifier_combo")->onCommit();
 }
 
 void LLFloaterPreference::onClickSkipDialogs()
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index d68897b64f6a79465af1d0a8048a5fdc920d1fa9..759c86f3a028d67d002e3297d91a06f2489c1384 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -801,6 +801,8 @@ LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32
 		return NULL;
 	}
 
+	mHoverObjects->mPrimaryObject = objectp; 
+
 	objectp = objectp->getRootEdit();
 
 	// is the requested object the same as the existing hover object root?
@@ -834,6 +836,11 @@ LLSelectNode *LLSelectMgr::getHoverNode()
 	return mHoverObjects->getFirstRootNode();
 }
 
+LLSelectNode *LLSelectMgr::getPrimaryHoverNode()
+{
+	return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject];
+}
+
 void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
 {
 	if (!objectp)
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 6e757ef976fc05bc6a2e315adf07788bc7997e70..2050a73f2675c8518fcc3d6957389623bcbd6753 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -404,6 +404,7 @@ public:
 
 	LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);
 	LLSelectNode *getHoverNode();
+	LLSelectNode *getPrimaryHoverNode();
 
 	void highlightObjectOnly(LLViewerObject *objectp);
 	void highlightObjectAndFamily(LLViewerObject *objectp);
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 304f1dffaf009f7a248b2f771cd4e6b9a13bb4b2..0a9e72506b45ea3513edbd6e51bef3bd4b1f709d 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -598,6 +598,9 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
 
 static bool needs_tooltip(LLSelectNode* nodep)
 {
+	if (!nodep) 
+		return false;
+
 	LLViewerObject* object = nodep->getObject();
 	LLViewerObject *parent = (LLViewerObject *)object->getParent();
 	if (object->flagHandleTouch()
@@ -773,7 +776,10 @@ BOOL LLToolPie::handleToolTip(S32 local_x, S32 local_y, MASK mask)
 					}
 				}
 				
-				bool needs_tip = needs_tooltip(nodep);
+				// also check the primary node since sometimes it can have an action even though
+				// the root node doesn't
+				bool needs_tip = needs_tooltip(nodep) || 
+					             needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode());
 
 				if (show_all_object_tips || needs_tip)
 				{
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 91dcdce23bb8bc44165f72e9584f21d49d50ba55..b8fc72b7549cd3a49605bce7f1ed3f840c0baf01 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -240,8 +240,8 @@ Avatars:
      width="256"
      top_pad="5"/>
     <radio_group
-	 enabled_control="ShowScriptErrors"
-	 control_name="ShowScriptErrorsLocation"
+     enabled_control="ShowScriptErrors"
+     control_name="ShowScriptErrorsLocation"
      follows="top|left"
      draw_border="false"
      height="40"
@@ -269,6 +269,8 @@ Avatars:
     </radio_group>
      <check_box
      follows="top|left"
+     enabled_control="EnableVoiceChat"
+     control_name="PushToTalkToggle"
      height="20"
      label="Use Push-to-talk in toggle mode"
      layout="topleft"
@@ -279,6 +281,9 @@ Avatars:
      tool_tip="When in toggle mode, press and release the push-to-talk trigger to switch your microphone on and off. When not in toggle mode, the microphone is active only when the trigger is held down."/>
     <line_editor
      follows="top|left"
+     control_name="PushToTalkButton"
+     enabled="false" 
+     enabled_control="EnableVoiceChat"
      height="19"
      left_delta="50"
      max_length="254"
@@ -287,22 +292,30 @@ Avatars:
      top_pad="0"
      width="280" />
     <button
-	follows="top|left"
-	height="20"
-	label="Set Key"
-	left_delta="0"
-        name="set_voice_hotkey_button"
-	width="115"
-	top_pad="5" />
+     follows="top|left"
+     enabled_control="EnableVoiceChat"
+     height="20"
+     label="Set Key"
+     left_delta="0"
+     name="set_voice_hotkey_button"
+     width="115"
+     top_pad="5">
+          <button.commit_callback
+          function="Pref.VoiceSetKey" />
+    </button>
     <button
-        bottom_delta="0"
-	follows="left"
-	font="SansSerif"
-	halign="center"
-	height="20"
-	label="Middle Mouse Button"
-	left_delta="120"
-	mouse_opaque="true"
-	name="set_voice_middlemouse_button"
-	width="160" />
+     bottom_delta="0"
+     enabled_control="EnableVoiceChat"
+     follows="left"
+     font="SansSerif"
+     halign="center"
+     height="20"
+     label="Middle Mouse Button"
+     left_delta="120"
+     mouse_opaque="true"
+     name="set_voice_middlemouse_button"
+     width="160">
+          <button.commit_callback
+          function="Pref.VoiceSetMiddleMouse" />
+    </button>
 </panel>