diff --git a/autobuild.xml b/autobuild.xml
index 738c77b30bc85bd704716d506072aeac030f3e64..283eeabbeb5572ed9121deb7637d33beaf284184 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -3204,9 +3204,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>d15ad6b86c0e1ef4a1fc46478da65929</string>
+              <string>c5ab9d9d7482e48cd76f4bf391900a8c</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54837/510043/viewer_manager-2.0.538967-darwin64-538967.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/43369/385585/viewer_manager-2.0.531000-darwin64-531000.tar.bz2</string>
             </map>
             <key>name</key>
             <string>darwin64</string>
@@ -3228,9 +3228,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
             <key>archive</key>
             <map>
               <key>hash</key>
-              <string>856d1e4b60ef57135ecd99cd608e76bd</string>
+              <string>6b10d7407686d9e12e63576256581e3e</string>
               <key>url</key>
-              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54960/511732/viewer_manager-2.0.538967-windows-538967.tar.bz2</string>
+              <string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/43370/385592/viewer_manager-2.0.531000-windows-531000.tar.bz2</string>
             </map>
             <key>name</key>
             <string>windows</string>
@@ -3241,7 +3241,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
         <key>source_type</key>
         <string>hg</string>
         <key>version</key>
-        <string>2.0.538967</string>
+        <string>2.0.531000</string>
       </map>
       <key>vlc-bin</key>
       <map>
diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index a7bd836c4dd9e90ef78283d287e463156ad7e13c..42c19e3b1c8c4991e92a704e41b7fd922918fa07 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -280,11 +280,14 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
     mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
     mCoroMapping()
 {
-    // store in our LLTempBoundListener so that when the LLCoprocedurePool is
-    // destroyed, we implicitly disconnect from this LLEventPump
-    mStatusListener = LLEventPumps::instance().obtain("LLApp").listen(
-        poolName,
-        [pendingCoprocs=mPendingCoprocs, poolName](const LLSD& status)
+    try
+    {
+        // store in our LLTempBoundListener so that when the LLCoprocedurePool is
+        // destroyed, we implicitly disconnect from this LLEventPump
+        // Monitores application status
+        mStatusListener = LLEventPumps::instance().obtain("LLApp").listen(
+            poolName + "_pool", // Make sure it won't repeat names from lleventcoro
+            [pendingCoprocs = mPendingCoprocs, poolName](const LLSD& status)
         {
             auto& statsd = status["status"];
             if (statsd.asString() != "running")
@@ -298,6 +301,19 @@ LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
             }
             return false;
         });
+    }
+    catch (const LLEventPump::DupListenerName &)
+    {
+        // This shounldn't be possible since LLCoprocedurePool is supposed to have unique names,
+        // yet it somehow did happen, as result pools got '_pool' suffix and this catch.
+        //
+        // If this somehow happens again it is better to crash later on shutdown due to pump
+        // not stopping coroutine and see warning in logs than on startup or during login.
+        LL_WARNS("CoProcMgr") << "Attempted to register dupplicate listener name: " << poolName
+                              << "_pool. Failed to start listener." << LL_ENDL;
+
+        llassert(0); // Fix Me! Ignoring missing listener!
+    }
 
     for (size_t count = 0; count < mPoolSize; ++count)
     {
diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt
index 3d05e8cfb4bb7a65f37b7237d6ef45f6075ec7f5..3c43d71599b1fa135536542d5d59826b27376126 100644
--- a/indra/newview/VIEWER_VERSION.txt
+++ b/indra/newview/VIEWER_VERSION.txt
@@ -1 +1 @@
-6.4.6
+6.4.7
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index b933060155c26392848203ccbad41c0cbb71082b..32df6ea32a2463eb8201a04a7f1094af043c8dab 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -3099,8 +3099,15 @@ LLSD LLAppViewer::getViewerInfo() const
 
 	// return a URL to the release notes for this viewer, such as:
 	// https://releasenotes.secondlife.com/viewer/2.1.0.123456.html
-	std::string url = versionInfo.getReleaseNotes();
-	info["VIEWER_RELEASE_NOTES_URL"] = url.empty()? LLTrans::getString("RetrievingData") : url;
+	std::string url = versionInfo.getReleaseNotes(); // VVM supplied
+    if (url.empty())
+    {
+        url = LLTrans::getString("RELEASE_NOTES_BASE_URL");
+        if (!LLStringUtil::endsWith(url, "/"))
+            url += "/";
+        url += LLURI::escape(versionInfo.getVersion()) + ".html";
+    }
+	info["VIEWER_RELEASE_NOTES_URL"] = url;
 
 	// Position
 	LLViewerRegion* region = gAgent.getRegion();
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 4b65ead236d464ff383d77d38350d0e431185ec5..38ed022c441badad758c68816a36adb7732c1db8 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2301,29 +2301,13 @@ void login_callback(S32 option, void *userdata)
 void show_release_notes_if_required()
 {
     static bool release_notes_shown = false;
-    // We happen to know that instantiating LLVersionInfo implicitly
-    // instantiates the LLEventMailDrop named "relnotes", which we (might) use
-    // below. If viewer release notes stop working, might be because that
-    // LLEventMailDrop got moved out of LLVersionInfo and hasn't yet been
-    // instantiated.
     if (!release_notes_shown && (LLVersionInfo::instance().getChannelAndVersion() != gLastRunVersion)
         && LLVersionInfo::instance().getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
         && gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
         && !gSavedSettings.getBOOL("FirstLoginThisInstall"))
     {
-        // Instantiate a "relnotes" listener which assumes any arriving event
-        // is the release notes URL string. Since "relnotes" is an
-        // LLEventMailDrop, this listener will be invoked whether or not the
-        // URL has already been posted. If so, it will fire immediately;
-        // otherwise it will fire whenever the URL is (later) posted. Either
-        // way, it will display the release notes as soon as the URL becomes
-        // available.
-        LLEventPumps::instance().obtain("relnotes").listen(
-            "showrelnotes",
-            [](const LLSD& url){
-                LLWeb::loadURLInternal(url.asString());
-                return false;
-            });
+        LLSD info(LLAppViewer::instance()->getViewerInfo());
+        LLWeb::loadURLInternal(info["VIEWER_RELEASE_NOTES_URL"]);
         release_notes_shown = true;
     }
 }
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index e0b64403eff83099168a429174f36443ad7d82dc..b295fa2977c7638e708146f4d8ff593f3b2fdabf 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -49,6 +49,8 @@
 /// LLViewerAssetRequest
 ///----------------------------------------------------------------------------
 
+static const std::string VIEWER_ASSET_STORAGE_CORO_POOL = "VAssetStorage";
+
 /**
  * @brief Local class to encapsulate asset fetch requests with a timestamp.
  *
@@ -127,6 +129,15 @@ LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *
 {
 }
 
+LLViewerAssetStorage::~LLViewerAssetStorage()
+{
+    if (!LLCoprocedureManager::wasDeleted())
+    {
+        // This class has dedicated coroutine pool, clean it up, otherwise coroutines will crash later. 
+        LLCoprocedureManager::instance().close(VIEWER_ASSET_STORAGE_CORO_POOL);
+    }
+}
+
 // virtual 
 void LLViewerAssetStorage::storeAssetData(
     const LLTransactionID& tid,
@@ -399,7 +410,7 @@ void LLViewerAssetStorage::queueRequestHttp(
         bool is_temp = false;
         LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
 
-        LLCoprocedureManager::instance().enqueueCoprocedure("AssetStorage","LLViewerAssetStorage::assetRequestCoro",
+        LLCoprocedureManager::instance().enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL,"LLViewerAssetStorage::assetRequestCoro",
             boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, req, uuid, atype, callback, user_data));
     }
 }
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index cefe2154315d96ac4a92f8d2e2048cb73cf9bb63..ef01d179b7bac20179ba983c0e3823d10fdf82fe 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -43,6 +43,8 @@ class LLViewerAssetStorage : public LLAssetStorage
 	LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
 				   LLVFS *vfs, LLVFS *static_vfs);
 
+	~LLViewerAssetStorage();
+
 	virtual void storeAssetData(
 		const LLTransactionID& tid,
 		LLAssetType::EType atype,