diff --git a/indra/llmessage/llcoproceduremanager.cpp b/indra/llmessage/llcoproceduremanager.cpp
index be014e7b1e385a947b02fec00e2ffd5927d7c9f2..d310cefd1e598690b49e546813261984900c95fb 100644
--- a/indra/llmessage/llcoproceduremanager.cpp
+++ b/indra/llmessage/llcoproceduremanager.cpp
@@ -47,7 +47,10 @@ static const std::map<std::string, U32> DefaultPoolSizes{
 };
 
 static const U32 DEFAULT_POOL_SIZE = 5;
-const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 4096;
+// SL-14399: When we teleport to a brand-new simulator, the coprocedure queue
+// gets absolutely slammed with fetch requests. Make this queue effectively
+// unlimited.
+const U32 LLCoprocedureManager::DEFAULT_QUEUE_SIZE = 1024*1024;
 
 //=========================================================================
 class LLCoprocedurePool: private boost::noncopyable
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index 70065cb5a049698ba081585cd3cdf9076711d33a..aa9ff012c30d36af790f6d52a8b6872f14314d27 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -134,14 +134,6 @@ LLViewerAssetStorage::~LLViewerAssetStorage()
         // This class has dedicated coroutine pool, clean it up, otherwise coroutines will crash later. 
         LLCoprocedureManager::instance().close(VIEWER_ASSET_STORAGE_CORO_POOL);
     }
-
-    while (mCoroWaitList.size() > 0)
-    {
-        CoroWaitList &request = mCoroWaitList.front();
-        // Clean up pending downloads, delete request and trigger callbacks
-        removeAndCallbackPendingDownloads(request.mId, request.mType, request.mId, request.mType, LL_ERR_NOERR, LLExtStat::NONE);
-        mCoroWaitList.pop_front();
-    }
 }
 
 // virtual 
@@ -346,28 +338,6 @@ void LLViewerAssetStorage::storeAssetData(
     }
 }
 
-void LLViewerAssetStorage::checkForTimeouts()
-{
-    LLAssetStorage::checkForTimeouts();
-
-    // Restore requests
-    LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
-    while (mCoroWaitList.size() > 0
-           && manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
-    {
-        CoroWaitList &request = mCoroWaitList.front();
-        
-        bool with_http = true;
-        bool is_temp = false;
-        LLViewerAssetStatsFF::record_enqueue(request.mType, with_http, is_temp);
-
-        manager->enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
-            boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, request.mRequest, request.mId, request.mType, request.mCallback, request.mUserData));
-
-        mCoroWaitList.pop_front();
-    }
-}
-
 /**
  * @brief Allocate and queue an asset fetch request for the viewer
  *
@@ -424,21 +394,18 @@ void LLViewerAssetStorage::queueRequestHttp(
     // This is the same as the current UDP logic - don't re-request a duplicate.
     if (!duplicate)
     {
-        // Coroutine buffer has fixed size (synchronization buffer, so we have no alternatives), so buffer any request above limit
         LLCoprocedureManager* manager = LLCoprocedureManager::getInstance();
-        if (manager->count(VIEWER_ASSET_STORAGE_CORO_POOL) < (LLCoprocedureManager::DEFAULT_QUEUE_SIZE - 1))
-        {
-            bool with_http = true;
-            bool is_temp = false;
-            LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
-
-            manager->enqueueCoprocedure(VIEWER_ASSET_STORAGE_CORO_POOL, "LLViewerAssetStorage::assetRequestCoro",
-                boost::bind(&LLViewerAssetStorage::assetRequestCoro, this, req, uuid, atype, callback, user_data));
-        }
-        else
-        {
-            mCoroWaitList.emplace_back(req, uuid, atype, callback, user_data);
-        }
+        bool with_http = true;
+        bool is_temp = false;
+        LLViewerAssetStatsFF::record_enqueue(atype, with_http, is_temp);
+        manager->enqueueCoprocedure(
+            VIEWER_ASSET_STORAGE_CORO_POOL,
+            "LLViewerAssetStorage::assetRequestCoro",
+            [this, req, uuid, atype, callback, user_data]
+            (LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t&, const LLUUID&)
+            {
+                assetRequestCoro(req, uuid, atype, callback, user_data);
+            });
     }
 }
 
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index 0965a17ce186c3c3cf5997f5d5bbdd957d44197d..c3719d0918df862b4df77d058c1160d36d13fa26 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -65,8 +65,6 @@ class LLViewerAssetStorage : public LLAssetStorage
 		bool user_waiting=FALSE,
 		F64Seconds timeout=LL_ASSET_STORAGE_TIMEOUT) override;
 
-    void checkForTimeouts() override;
-
 protected:
 	void _queueDataRequest(const LLUUID& uuid,
 						   LLAssetType::EType type,
@@ -118,8 +116,6 @@ class LLViewerAssetStorage : public LLAssetStorage
         LLGetAssetCallback mCallback;
         void *mUserData;
     };
-    typedef std::list<CoroWaitList> wait_list_t;
-    wait_list_t mCoroWaitList;
 
     std::string mViewerAssetUrl;
     S32 mCountRequests;