diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 82676495b227ccbce423a6f2a4f090d2d4c7ca14..b33aa73df9888cb62b5b4d1727a9ee37b4511ae9 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -88,16 +88,21 @@ namespace {
     static const std::string VOICE_SERVER_TYPE = "Vivox";
 
     // Don't retry connecting to the daemon more frequently than this:
-    const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
+    const F32 DAEMON_CONNECT_THROTTLE_SECONDS = 1.0f;
 
     // Don't send positional updates more frequently than this:
     const F32 UPDATE_THROTTLE_SECONDS = 0.5f;
 
+    // Timeout for connection to Vivox 
+    const F32 CONNECT_ATTEMPT_TIMEOUT = 300.0f;
+    const F32 CONNECT_DNS_TIMEOUT = 5.0f;
+    const int CONNECT_RETRY_MAX = 3;
+
     const F32 LOGIN_ATTEMPT_TIMEOUT = 30.0f;
     const int LOGIN_RETRY_MAX = 3;
 
-    const int PROVISION_RETRY_MAX = 5;
     const F32 PROVISION_RETRY_TIMEOUT = 2.0;
+    const int PROVISION_RETRY_MAX = 5;
 
     // Cosine of a "trivially" small angle
     const F32 FOUR_DEGREES = 4.0f * (F_PI / 180.0f);
@@ -821,7 +826,7 @@ bool LLVivoxVoiceClient::startAndLaunchDaemon()
         LLVoiceVivoxStats::getInstance()->connectionAttemptEnd(mConnected);
         if (!mConnected)
         {
-            llcoro::suspendUntilTimeout(CONNECT_THROTTLE_SECONDS);
+            llcoro::suspendUntilTimeout(DAEMON_CONNECT_THROTTLE_SECONDS);
         }
     }
     
@@ -945,29 +950,59 @@ bool LLVivoxVoiceClient::establishVoiceConnection()
     if (!mVoiceEnabled && mIsInitialized)
         return false;
 
+    LLSD result;
+    bool connected(false);
+    bool giving_up(false);
+    int retries = 0;
     LLVoiceVivoxStats::getInstance()->establishAttemptStart();
     connectorCreate();
-
-    LLSD result;
     do
     {
         result = llcoro::suspendUntilEventOn(voiceConnectPump);
         LL_DEBUGS("Voice") << "event=" << ll_stream_notation_sd(result) << LL_ENDL;
-    } 
-    while (!result.has("connector"));
 
-    bool connected = result["connector"];
-    LLVoiceVivoxStats::getInstance()->establishAttemptEnd(connected);
+        if (result.has("connector"))
+        {
+            LLVoiceVivoxStats::getInstance()->establishAttemptEnd(connected);
+            bool connected = result["connector"];
+            if (!connected)
+            {
+                if (result.has("retry") && ++retries <= CONNECT_RETRY_MAX)
+                {
+                    F32 timeout = result["retry"];
+                    timeout *= retries;
+                    LL_INFOS("Voice") << "Retry Connection.Create in " << timeout << " seconds" << LL_ENDL;
+                    llcoro::suspendUntilTimeout(timeout);
 
-    if (!mVoiceEnabled && mIsInitialized)
-    {
-        connected = false;
-    }
-    else if (!connected)
+                    if (mVoiceEnabled && mIsInitialized)
+                    {
+                        // try again
+                        LLVoiceVivoxStats::getInstance()->establishAttemptStart();
+                        connectorCreate();
+                    }
+                    else
+                    {
+                        giving_up = true;
+                    }
+                }
+                else
+                {
+                    giving_up=true;
+                }
+            }
+        }
+    } while (!connected && !giving_up);
+
+    if (giving_up)
     {
         LLSD args;
         args["HOSTID"] = LLURI(mVoiceAccountServerURI).authority();
-        LLNotificationsUtil::add("NoVoiceConnectFinal", args);	
+        LLNotificationsUtil::add("NoVoiceConnect", args);
+    }
+
+    if (!mVoiceEnabled && mIsInitialized)
+    {
+        connected = false;
     }
 
     return connected;
@@ -1050,7 +1085,7 @@ bool LLVivoxVoiceClient::loginToVivox()
                     LLSD args;
                     args["HOSTID"] = LLURI(mVoiceAccountServerURI).authority();
                     mTerminateDaemon = true;
-                    LLNotificationsUtil::add("NoVoiceConnectFinal", args);
+                    LLNotificationsUtil::add("NoVoiceConnect", args);
 
                     mIsLoggingIn = false;
                     return false;
@@ -1064,11 +1099,6 @@ bool LLVivoxVoiceClient::loginToVivox()
 
                 // tell the user there is a problem
                 LL_WARNS("Voice") << "login " << loginresp << " will retry login in " << timeout << " seconds." << LL_ENDL;
-
-                LLSD args;
-                args["HOSTID"] = LLURI(mVoiceAccountServerURI).authority();
-                args["RETRY"] = int(timeout);
-                LLNotificationsUtil::add("NoVoiceConnectTrying", args);
                     
                 llcoro::suspendUntilTimeout(timeout);
             }
@@ -2944,16 +2974,7 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st
 {	
     LLSD result = LLSD::emptyMap();
 
-	if(statusCode != 0)
-	{
-		LL_WARNS("Voice") << "Connector.Create response failure ("<< statusCode << "): " << statusString << LL_ENDL;
-		LLSD args;
-		args["HOSTID"] = LLURI(mVoiceAccountServerURI).authority();
-		mTerminateDaemon = true;
-
-        result["connector"] = LLSD::Boolean(false);
-	}
-	else
+	if(statusCode == 0)
 	{
 		// Connector created, move forward.
         if (connectorHandle == LLVivoxSecurity::getInstance()->connectorHandle())
@@ -2967,13 +2988,38 @@ void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &st
         }
         else
         {
+            // This shouldn't happen - we are somehow out of sync with SLVoice
+            // or possibly there are two things trying to run SLVoice at once
+            // or someone is trying to hack into it.
             LL_WARNS("Voice") << "Connector.Create returned wrong handle "
                               << "(" << connectorHandle << ")"
                               << " expected (" << LLVivoxSecurity::getInstance()->connectorHandle() << ")"
                               << LL_ENDL;
             result["connector"] = LLSD::Boolean(false);
+            // Give up.
+            mTerminateDaemon = true;
         }
 	}
+    else if (statusCode == 10028) // web request timeout prior to login
+    {
+        // this is usually fatal, but a long timeout might work
+        result["retry"] = LLSD::Real(CONNECT_ATTEMPT_TIMEOUT);
+        
+        LL_WARNS("Voice") << "Connector.Create failed" << LL_ENDL;
+    }
+    else if (statusCode == 10006) // name resolution failure - a shorter retry may work
+    {
+        // some networks have slower DNS, but a short timeout might let it catch up
+        result["retry"] = LLSD::Real(CONNECT_DNS_TIMEOUT);
+        
+        LL_WARNS("Voice") << "Connector.Create lookup failed" << LL_ENDL;
+    }
+    else // unknown failure - give up
+    {
+        LL_WARNS("Voice") << "Connector.Create response failure ("<< statusCode << "): " << statusString << LL_ENDL;
+        mTerminateDaemon = true;
+        result["connector"] = LLSD::Boolean(false);
+    }
 
     LLEventPumps::instance().post("vivoxClientPump", result);
 }
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index f21df2bfd4487a3f42e381b9f8918818080ca83d..96113a4fbaca7c5062c9941f9d4b89f901dbe42e 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -8675,29 +8675,6 @@ Please check your network and firewall setup.
    icon="alertmodal.tga"
    name="NoVoiceConnect"
    type="alertmodal">
-We're having trouble connecting to your voice server:
-
-[HOSTID]
-
-Ports that must be allowed for voice are:
-:TCP: 80, 443
-:UDP: 3478, 3479, 5060, 5062, 6250, 12000-32000
-
-Please check your network and firewall setup.
-Disable any SIP ALG feature in your router.
-
-We will keep trying...
-    <tag>voice</tag>
-  <tag>fail</tag>
-    <usetemplate
-     name="okbutton"
-     yestext="OK"/>
-  </notification>
-
-  <notification
-   icon="alertmodal.tga"
-   name="NoVoiceConnectFinal"
-   type="alertmodal">
 We are unable to connect to the voice server:
 
 [HOSTID]