diff --git a/common/lib/xmodule/xmodule/modulestore/__init__.py b/common/lib/xmodule/xmodule/modulestore/__init__.py
index eb439a8aa575f6c40d48bb281374b551c7b58cd4..a5aef65facef2f34d0b7b87b4a5fb8f651920994 100644
--- a/common/lib/xmodule/xmodule/modulestore/__init__.py
+++ b/common/lib/xmodule/xmodule/modulestore/__init__.py
@@ -12,7 +12,7 @@ from collections import defaultdict
 from contextlib import contextmanager
 import threading
 from operator import itemgetter
-from sortedcontainers import SortedListWithKey
+from sortedcontainers import SortedKeyList
 
 from abc import ABCMeta, abstractmethod
 from contracts import contract, new_contract
@@ -509,7 +509,7 @@ class IncorrectlySortedList(Exception):
     pass
 
 
-class SortedAssetList(SortedListWithKey):
+class SortedAssetList(SortedKeyList):
     """
     List of assets that is sorted based on an asset attribute.
     """
@@ -549,12 +549,11 @@ class SortedAssetList(SortedListWithKey):
         """
         metadata_to_insert = asset_md.to_storable()
         asset_idx = self.find(asset_md.asset_id)
-        if asset_idx is None:
-            # Add new metadata sorted into the list.
-            self.add(metadata_to_insert)
-        else:
-            # Replace existing metadata.
-            self[asset_idx] = metadata_to_insert
+        if asset_idx is not None:
+            # Delete existing metadata.
+            del self[asset_idx]
+        # Add new metadata sorted into the list.
+        self.add(metadata_to_insert)
 
 
 class ModuleStoreAssetBase(object):
@@ -575,10 +574,7 @@ class ModuleStoreAssetBase(object):
             - the index of asset in list (None if asset does not exist)
         """
         course_assets = self._find_course_assets(asset_key.course_key)
-        all_assets = SortedAssetList(iterable=[])
-        # Assets should be pre-sorted, so add them efficiently without sorting.
-        # extend() will raise a ValueError if the passed-in list is not sorted.
-        all_assets.extend(course_assets.setdefault(asset_key.block_type, []))
+        all_assets = SortedAssetList(iterable=course_assets.setdefault(asset_key.block_type, []))
         idx = all_assets.find(asset_key)
 
         return course_assets, idx
diff --git a/common/lib/xmodule/xmodule/modulestore/mongo/base.py b/common/lib/xmodule/xmodule/modulestore/mongo/base.py
index 123c6999999018b0eedaec1ef980bba81ce64eff..eec7eed2b417063b0326773995d17a6a1deef31c 100644
--- a/common/lib/xmodule/xmodule/modulestore/mongo/base.py
+++ b/common/lib/xmodule/xmodule/modulestore/mongo/base.py
@@ -1856,7 +1856,7 @@ class MongoModuleStore(ModuleStoreDraftAndPublished, ModuleStoreWriteBase, Mongo
         # Build an update set with potentially multiple embedded fields.
         updates_by_type = {}
         for asset_type, assets in assets_by_type.iteritems():
-            updates_by_type[self._make_mongo_asset_key(asset_type)] = assets.as_list()
+            updates_by_type[self._make_mongo_asset_key(asset_type)] = list(assets)
 
         # Update the document.
         self.asset_collection.update(
diff --git a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py
index 2acd3a52e3a3ca43a1c5c8537aea3d5993b286be..93e2ff1510ec2a3f877674bd1bdc184aede710ba 100644
--- a/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py
+++ b/common/lib/xmodule/xmodule/modulestore/split_mongo/split.py
@@ -2856,14 +2856,11 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase):
             course_assets = new_structure.setdefault('assets', {})
 
             asset_type = asset_key.asset_type
-            all_assets = SortedAssetList(iterable=[])
-            # Assets should be pre-sorted, so add them efficiently without sorting.
-            # extend() will raise a ValueError if the passed-in list is not sorted.
-            all_assets.extend(course_assets.setdefault(asset_type, []))
+            all_assets = SortedAssetList(iterable=course_assets.setdefault(asset_type, []))
             asset_idx = all_assets.find(asset_key)
 
             all_assets_updated = update_function(all_assets, asset_idx)
-            new_structure['assets'][asset_type] = all_assets_updated.as_list()
+            new_structure['assets'][asset_type] = list(all_assets_updated)
 
             # update index if appropriate and structures
             self.update_structure(asset_key.course_key, new_structure)
@@ -2894,7 +2891,7 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase):
             )
 
             for asset_type, assets in assets_by_type.iteritems():
-                new_structure['assets'][asset_type] = assets.as_list()
+                new_structure['assets'][asset_type] = list(assets)
 
             # update index if appropriate and structures
             self.update_structure(course_key, new_structure)
@@ -2935,7 +2932,7 @@ class SplitMongoModuleStore(SplitBulkWriteMixin, ModuleStoreWriteBase):
             mdata.update(attr_dict)
 
             # Generate a Mongo doc from the metadata and update the course asset info.
-            all_assets[asset_idx] = mdata.to_storable()
+            all_assets.insert_or_update(mdata)
             return all_assets
 
         self._update_course_assets(user_id, asset_key, _internal_method)
diff --git a/requirements/edx/base.in b/requirements/edx/base.in
index f38b4d09daed32a118bfd2280f320d4801790032..bcb4a556773f79d233332d0ac2148ae45477d4bd 100644
--- a/requirements/edx/base.in
+++ b/requirements/edx/base.in
@@ -141,7 +141,7 @@ sailthru-client==2.2.3              # For Sailthru integration
 Shapely==1.2.16                     # Geometry library, used for image click regions in capa
 six                                 # Utilities for supporting Python 2 & 3 in the same codebase
 sorl-thumbnail==12.3                # Image thumbnail management
-sortedcontainers==0.9.2             # Provides SortedListWithKey, used for lists of XBlock assets
+sortedcontainers                    # Provides SortedKeyList, used for lists of XBlock assets
 sqlparse                            # Required by Django to run migrations.RunSQL
 stevedore                           # Support for runtime plugins, used for XBlocks and edx-platform Django app plugins
 unicodecsv                          # Easier support for CSV files with unicode text
diff --git a/requirements/edx/base.txt b/requirements/edx/base.txt
index 8323f25e55adbb6993d1b86459e207d77175f1a5..c80d046734cae98e6d85f9136dd624d2081efc4d 100644
--- a/requirements/edx/base.txt
+++ b/requirements/edx/base.txt
@@ -225,7 +225,7 @@ slumber==0.7.1            # via edx-rest-api-client
 social-auth-app-django==2.1.0
 social-auth-core==1.7.0
 sorl-thumbnail==12.3
-sortedcontainers==0.9.2
+sortedcontainers==2.1.0
 soupsieve==1.8            # via beautifulsoup4
 sqlparse==0.2.4
 stevedore==1.30.0
diff --git a/requirements/edx/development.txt b/requirements/edx/development.txt
index b03cce5f961a03d8fd5faa8fa5bf7ca090e45eda..11423952e49856492bf01c4cf144bd9cf8f007ef 100644
--- a/requirements/edx/development.txt
+++ b/requirements/edx/development.txt
@@ -317,7 +317,7 @@ snowballstemmer==1.2.1    # via sphinx
 social-auth-app-django==2.1.0
 social-auth-core==1.7.0
 sorl-thumbnail==12.3
-sortedcontainers==0.9.2
+sortedcontainers==2.1.0
 soupsieve==1.8
 sphinx==1.8.4
 sphinxcontrib-websupport==1.1.0  # via sphinx
diff --git a/requirements/edx/testing.txt b/requirements/edx/testing.txt
index 572da49a30cbe0d1d379a1e15de4c8a96885aaad..41c571b5ee0d71121ef72349de4b8a13a919bddc 100644
--- a/requirements/edx/testing.txt
+++ b/requirements/edx/testing.txt
@@ -306,7 +306,7 @@ slumber==0.7.1
 social-auth-app-django==2.1.0
 social-auth-core==1.7.0
 sorl-thumbnail==12.3
-sortedcontainers==0.9.2
+sortedcontainers==2.1.0
 soupsieve==1.8
 splinter==0.9.0
 sqlparse==0.2.4