diff --git a/autobuild.xml b/autobuild.xml
index aca22f576f4bb0d41ae9a6b632e80e155022b04c..723b0bf6c14494072bcf4d3dbfdc16db6176f5fe 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -698,9 +698,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>66c308642234797ef82b1e22b96b5ae6</string>
+              <string>4390c5182b5d6c397ef0396828093600</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106497/930538/freetype-2.12.1.576084-darwin64-576084.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106585/931193/freetype-2.12.1.576132-darwin64-576132.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -722,9 +722,9 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fb161e641d4f4bfdeefed6021c192331</string>
+              <string>6ad01c23db703cd6ad2a491aae937379</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106496/930532/freetype-2.12.1.576084-windows-576084.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106586/931203/freetype-2.12.1.576132-windows-576132.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -734,16 +734,16 @@
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>fe29d0aa898b534f3083ad53f04afd40</string>
+              <string>db5f433b65a268a1ea601d7e29766cb1</string>
               <key>url</key>
-              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106495/930523/freetype-2.12.1.576084-windows64-576084.tar.bz2</string>
+              <string>https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/106587/931202/freetype-2.12.1.576132-windows64-576132.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows64</string>
           </map>
         </map>
         <key>version</key>
-        <string>2.12.1.576084</string>
+        <string>2.12.1.576132</string>
       </map>
       <key>glext</key>
       <map>
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 5db1411e124f2f3383a32dea2ea6f5be0292455d..4aa5a3a58e8c27e16189402e6ab0e13712de35f8 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.6.7
+6.6.8
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 82ecfbd4dceb04a7f394f075ec4dc51092ea78c9..dd8c9b2dde8343f226be7c9d97646c41557d36d1 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -451,26 +451,8 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
 
         LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) ));
         LLSD payload;
-        LLNotificationsUtil::add("PromptMFAToken", args, payload, [=](LLSD const & notif, LLSD const & response) {
-            bool continue_clicked = response["continue"].asBoolean();
-            std::string token = response["token"].asString();
-            LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
-
-            // strip out whitespace - SL-17034/BUG-231938
-            token = boost::regex_replace(token, boost::regex("\\s"), "");
-
-            if (continue_clicked && !token.empty())
-            {
-                LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
-
-                // Set the request data to true and retry login.
-                mRequestData["params"]["token"] = token;
-                reconnect();
-            } else {
-                LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
-                attemptComplete();
-            }
-        });
+        LLNotificationsUtil::add("PromptMFAToken", args, payload,
+            boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
     }
     else if(   reason_response == "key"
             || reason_response == "presence"
@@ -547,23 +529,59 @@ void LLLoginInstance::handleIndeterminate(const LLSD& event)
 
 bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key)
 {
-	if(accepted)
-	{	
-		LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: accepted" << LL_ENDL;
+    if(accepted)
+    {
+        LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: accepted " << LL_ENDL;
 
-		// Set the request data to true and retry login.
-		mRequestData["params"][key] = true; 
-		reconnect();
-	}
-	else
-	{
-		LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: attemptComplete" << LL_ENDL;
+        // Set the request data to true and retry login.
+        mRequestData["params"][key] = true;
 
-		attemptComplete();
-	}
+        if (!mRequestData["params"]["token"].asString().empty())
+        {
+            // SL-18511 this TOS failure happened while we are in the middle of an MFA challenge/response.
+            // the previously entered token is very likely expired, so prompt again
+            LLSD args(llsd::map( "MESSAGE", LLTrans::getString("LoginFailedAuthenticationMFARequired") ));
+            LLSD payload;
+            LLNotificationsUtil::add("PromptMFAToken", args, payload,
+                boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2));
+        }
+        else
+        {
+            reconnect();
+        }
+    }
+    else
+    {
+        LL_INFOS("LLLogin") << "LLLoginInstance::handleTOSResponse: attemptComplete" << LL_ENDL;
+
+        attemptComplete();
+    }
+
+    LLEventPumps::instance().obtain(TOS_REPLY_PUMP).stopListening(TOS_LISTENER_NAME);
+    return true;
+}
 
-	LLEventPumps::instance().obtain(TOS_REPLY_PUMP).stopListening(TOS_LISTENER_NAME);
-	return true;
+bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & response)
+{
+    bool continue_clicked = response["continue"].asBoolean();
+    std::string token = response["token"].asString();
+    LL_DEBUGS("LLLogin") << "PromptMFAToken: response: " << response << " continue_clicked" << continue_clicked << LL_ENDL;
+
+    // strip out whitespace - SL-17034/BUG-231938
+    token = boost::regex_replace(token, boost::regex("\\s"), "");
+
+    if (continue_clicked && !token.empty())
+    {
+        LL_INFOS("LLLogin") << "PromptMFAToken: token submitted" << LL_ENDL;
+
+        // Set the request data to true and retry login.
+        mRequestData["params"]["token"] = token;
+        reconnect();
+    } else {
+        LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL;
+        attemptComplete();
+    }
+    return true;
 }
 
 std::string construct_start_string()
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index b759b43474d560c865b288bb41c4ac0c59f1b006..ee3ef0e4b1110c576dc874ba03229e69d9000d98 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -84,6 +84,7 @@ class LLLoginInstance : public LLSingleton<LLLoginInstance>
 	void syncWithUpdater(ResponsePtr resp, const LLSD& notification, const LLSD& response);
 
 	bool handleTOSResponse(bool v, const std::string& key);
+    bool handleMFAChallenge(LLSD const & notif, LLSD const & response);
 
 	void attemptComplete() { mAttemptComplete = true; } // In the future an event?