diff --git a/indra/newview/llautoreplace.cpp b/indra/newview/llautoreplace.cpp
index 0f1ce2bcd060d3a3d115203bb7aecec1a5fb43ee..d71cf290d6d3fb559076b866160720b8b63ea54a 100644
--- a/indra/newview/llautoreplace.cpp
+++ b/indra/newview/llautoreplace.cpp
@@ -536,6 +536,46 @@ LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::addList(const LLSD&
 	return result;
 }
 
+LLAutoReplaceSettings::AddListResult LLAutoReplaceSettings::replaceList(const LLSD& newList)
+{
+	AddListResult result = AddListInvalidList;
+	if ( listIsValid( newList ) )
+	{
+		std::string listName = newList[AUTOREPLACE_LIST_NAME].asString();
+		bool listFound = false;
+		S32 search_index;
+		LLSD targetList;
+		// The following is working around the fact that LLSD arrays containing maps also seem to have undefined entries... see LLSD-30
+		for ( search_index = 0, targetList = mLists[0];
+			  !listFound && search_index < mLists.size();
+			  search_index += 1, targetList = mLists[search_index]
+			 )
+		{
+			if ( targetList.isMap() )
+			{
+				if ( listNameMatches( targetList, listName) )
+				{
+					LL_DEBUGS("AutoReplace")<<"list to replace found at "<<search_index<<LL_ENDL;
+					mLists.erase(search_index);
+					mLists.insert(search_index, newList);
+					listFound = true;
+					result = AddListOk;
+				}
+			}
+		}
+		
+		if ( ! listFound )
+		{
+			LL_WARNS("AutoReplace") << "attempt to replace unconfigured list" << LL_ENDL;
+		}
+	}
+	else
+	{
+		LL_WARNS("AutoReplace") << "attempt to add invalid list" << LL_ENDL;
+	}
+	return result;
+}
+
 bool LLAutoReplaceSettings::removeReplacementList(std::string listName)
 {
 	bool found = false;
diff --git a/indra/newview/llautoreplace.h b/indra/newview/llautoreplace.h
index 30b1fd2c659e604a8564bc9af3e12c6f7ad67d55..f720cc4edaf0a164fbc0e709f993f0b7756e6332 100644
--- a/indra/newview/llautoreplace.h
+++ b/indra/newview/llautoreplace.h
@@ -67,6 +67,9 @@ class LLAutoReplaceSettings
 	/// Inserts a new list at the end of the priority order
 	AddListResult addList(const LLSD& newList);
 
+	/// Inserts a list in place of an existing list of the same name
+	AddListResult replaceList(const LLSD& newList);
+
 	/// Removes the named list, @returns false if not found
 	bool removeReplacementList(std::string listName);
 
diff --git a/indra/newview/llfloaterautoreplacesettings.cpp b/indra/newview/llfloaterautoreplacesettings.cpp
index 7d1bcba978a05a0257768b7edd31de57a02b58ba..5dcdded7444ecaade77cb0e526c6c04ae5f1c70e 100644
--- a/indra/newview/llfloaterautoreplacesettings.cpp
+++ b/indra/newview/llfloaterautoreplacesettings.cpp
@@ -478,14 +478,25 @@ bool LLFloaterAutoReplaceSettings::callbackNewListName(const LLSD& notification,
 bool LLFloaterAutoReplaceSettings::callbackListNameConflict(const LLSD& notification, const LLSD& response)
 {
 	LLSD newList = notification["payload"]["list"];
-
+	std::string listName = LLAutoReplaceSettings::getListName(newList);
+	
 	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch ( option )
 	{
 	case 0:
 		// Replace current list
-		LL_INFOS("AutoReplace")<<"option 'replace current list' selected"<<LL_ENDL;
-		
+		if ( LLAutoReplaceSettings::AddListOk == mSettings.replaceList(newList) )
+		{
+			LL_INFOS("AutoReplace") << "replaced list '"<<listName<<"'"<<LL_ENDL;
+			mSelectedListName = listName;
+			updateListNames();
+			updateListNamesControls();
+			updateReplacementsList();
+		}
+		else
+		{
+			LL_WARNS("AutoReplace")<<"failed to replace list '"<<listName<<"'"<<LL_ENDL;
+		}
 		break;
 
 	case 1: