diff --git a/indra/newview/app_settings/key_bindings.xml b/indra/newview/app_settings/key_bindings.xml
index 2ec9a2586c693bbefcc4b4ff1cfd0e7320024489..4f6deb1f9853c968b0552d4bd21a20a9a171baf6 100644
--- a/indra/newview/app_settings/key_bindings.xml
+++ b/indra/newview/app_settings/key_bindings.xml
@@ -32,7 +32,7 @@
     <binding key="ENTER" mask="NONE" command="start_chat"/>
     <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
 
-    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>
+    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
   </first_person>
   <third_person>
     <binding key="A" mask="NONE" command="turn_left"/>
@@ -125,7 +125,7 @@
     <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/>
     <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/>
 
-    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>
+    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
     <binding key="" mask="NONE" mouse="LMB" command="walk_to"/>
   </third_person>
   <sitting>
@@ -223,7 +223,7 @@
     <binding key="ENTER" mask="NONE" command="start_chat"/>
     <binding key="DIVIDE" mask="NONE" command="start_gesture"/>
 
-    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>
+    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
   </sitting>
   <edit_avatar>
     <!--Avatar editing camera controls-->
@@ -250,6 +250,6 @@
     <binding key="PAD_ENTER" mask="NONE" command="start_chat"/>
     <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/>
 
-    <binding key="" mask="NONE" mouse="MMB" command="voice_follow_key"/>
+    <binding key="" mask="NONE" mouse="MMB" command="toggle_voice"/>
   </edit_avatar>
 </keys>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 952b36adea0f626519ebf92406fff8e25b774040..eeb7e6f0aabeb4c88db6966e2e5595c9d668d035 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8308,13 +8308,13 @@
     <key>PushToTalkToggle</key>
     <map>
       <key>Comment</key>
-      <string>Should the push-to-talk toolbar button behave as a toggle</string>
+      <string>Should the push-to-talk button behave as a toggle</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
       <string>Boolean</string>
       <key>Value</key>
-      <integer>0</integer>
+      <integer>1</integer>
     </map>
     <key>QAMode</key>
     <map>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 573cca248cb40e0847f4a2ea00bb6bc64fbba708..ecd62cadf875404bca7f9233dac1a9747766c83a 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -4562,6 +4562,11 @@ void LLAppViewer::loadKeyBindings()
 			LLKeyboard::keyFromString(key_string, &key);
 		}
 
+		value = gSavedSettings.getBOOL("PushToTalkToggle");
+		std::string control_name = value ? "toggle_voice" : "voice_follow_key";
+		third_person_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
+		sitting_view.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
+
 		if (third_person_view.hasUnsavedChanges())
 		{
 			// calls loadBindingsXML()
@@ -4573,6 +4578,25 @@ void LLAppViewer::loadKeyBindings()
 			// calls loadBindingsXML()
 			sitting_view.saveToSettings();
 		}
+
+		// in case of voice we need to repeat this in other modes
+
+		for (U32 i = 0; i < LLKeyConflictHandler::MODE_COUNT - 1; ++i)
+		{
+			// edit and first person modes; MODE_SAVED_SETTINGS not in use at the moment
+			if (i != LLKeyConflictHandler::MODE_THIRD_PERSON && i != LLKeyConflictHandler::MODE_SITTING)
+			{
+				LLKeyConflictHandler handler((LLKeyConflictHandler::ESourceMode)i);
+
+				handler.registerControl(control_name, 0, mouse, key, MASK_NONE, true);
+
+				if (handler.hasUnsavedChanges())
+				{
+					// calls loadBindingsXML()
+					handler.saveToSettings();
+				}
+			}
+		}
 	}
 	// since something might have gone wrong or there might have been nothing to save
 	// (and because otherwise following code will have to be encased in else{}),
diff --git a/indra/newview/llkeyconflict.cpp b/indra/newview/llkeyconflict.cpp
index 52e14d48f7f87117b0e87adb6f7000870251baa8..b6107eeedf13ceff9fcdd15aebe4d63883d8bd93 100644
--- a/indra/newview/llkeyconflict.cpp
+++ b/indra/newview/llkeyconflict.cpp
@@ -644,6 +644,7 @@ void LLKeyConflictHandler::saveToSettings(bool temporary)
             data = getControl("voice_follow_key", 0);
         }
 
+        gSavedSettings.setBOOL("PushToTalkToggle", can_toggle);
         if (data.isEmpty())
         {
             // legacy viewer has a bug that might crash it if NONE value is assigned.