diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index f167e2a2dead5ac999e2f678fc48e7f67c26570f..450f6c996154026bcc25da1a19ec89755ef29d06 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -1039,5 +1039,16 @@
       <key>Value</key>
       <string>8dcd4a48-2d37-4909-9f78-f7a9eb4ef903</string>
     </map>
+    <key>VoiceMultiInstance</key>
+    <map>
+      <key>Comment</key>
+      <string>Enables using voice in multiple simultaneous viewer instances</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
   </map>
 </llsd>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 417f9d6aa28ac5fb9d9a664664d783de21b0819a..c5371064fd4abc961349c06f1996ba344ad60cca 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2879,7 +2879,7 @@ bool LLAppViewer::initConfiguration()
 		// This is the second instance of SL. Turn off voice support,
 		// but make sure the setting is *not* persisted.
 		LLControlVariable* disable_voice = gSavedSettings.getControl("CmdLineDisableVoice");
-		if(disable_voice)
+        if (disable_voice && !gSavedSettings.getBOOL("VoiceMultiInstance"))
 		{
 			const BOOL DO_NOT_PERSIST = FALSE;
 			disable_voice->setValue(LLSD(TRUE), DO_NOT_PERSIST);
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index b751f9f7c4197a654bca6d28c1e5df9ce2c749b5..1b498c341fc7d29faf2bd7e92b8a992843896c59 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -536,6 +536,7 @@ void LLVivoxVoiceClient::connectorCreate()
 		<< "<ClientName>V2 SDK</ClientName>"
 		<< "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>"
 		<< "<Mode>Normal</Mode>"
+        << (gSavedSettings.getBOOL("VoiceMultiInstance") ? "<MinimumPort>30000</MinimumPort><MaximumPort>50000</MaximumPort>" : "")
 #ifndef LL_LINUX
         << "<ConnectorHandle>" << LLVivoxSecurity::getInstance()->connectorHandle() << "</ConnectorHandle>"
 #endif
@@ -965,6 +966,18 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
             params.args.add("-ll");
             params.args.add(loglevel);
 
+			if (gSavedSettings.getBOOL("VoiceMultiInstance"))
+            {
+                S32 port_nr = 30000 + ll_rand(20000);
+                LLControlVariable* voice_port = gSavedSettings.getControl("VivoxVoicePort");
+                if (voice_port)
+                {
+                    voice_port->setValue(LLSD(port_nr), false);
+                    params.args.add("-i");
+                    params.args.add(llformat("127.0.0.1:%u", gSavedSettings.getU32("VivoxVoicePort")));
+                }
+            }
+
             std::string log_folder = gSavedSettings.getString("VivoxLogDirectory");
 
             if (log_folder.empty())