diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 340629e4045d330efc74eac166550d9a12b7edd5..b822af352c3f118e1e3c7e669f9bf5a2fe878b13 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -339,6 +339,7 @@ LLAgent::LLAgent() :
 	mTeleportFailedSlot(),
 	mIsMaturityRatingChangingDuringTeleport(false),
 	mMaturityRatingChange(0U),
+	mMaturityPreferenceConfirmCallback(NULL),
 	mTeleportState( TELEPORT_NONE ),
 	mRegionp(NULL),
 
@@ -2520,7 +2521,39 @@ void LLMaturityPreferencesResponder::result(const LLSD &pContent)
 {
 	if (!mMaturityPreferencesCallback.empty())
 	{
-		mMaturityPreferencesCallback(pContent);
+		U8 actualPreferenceValue = SIM_ACCESS_MIN;
+		llassert(!pContent.isUndefined());
+		llassert(pContent.isMap());
+
+		if (!pContent.isUndefined() && pContent.isMap())
+		{
+			if (pContent.has("access_prefs"))
+			{
+				llassert(pContent.has("access_prefs"));
+				llassert(pContent.get("access_prefs").isMap());
+				llassert(pContent.get("access_prefs").has("max"));
+				llassert(pContent.get("access_prefs").get("max").isString());
+				if (pContent.get("access_prefs").isMap() && pContent.get("access_prefs").has("max") &&
+					pContent.get("access_prefs").get("max").isString())
+				{
+					LLSD::String actualPreference = pContent.get("access_prefs").get("max").asString();
+					LLStringUtil::trim(actualPreference);
+					actualPreferenceValue = LLViewerRegion::shortStringToAccess(actualPreference);
+				}
+			}
+			else if (pContent.has("max"))
+			{
+				llassert(pContent.get("max").isString());
+				if (pContent.get("max").isString())
+				{
+					LLSD::String actualPreference = pContent.get("max").asString();
+					LLStringUtil::trim(actualPreference);
+					actualPreferenceValue = LLViewerRegion::shortStringToAccess(actualPreference);
+				}
+			}
+		}
+
+		mMaturityPreferencesCallback(actualPreferenceValue);
 	}
 }
 
@@ -2528,12 +2561,24 @@ void LLMaturityPreferencesResponder::error(U32 pStatus, const std::string& pReas
 {
 	if (!mMaturityPreferencesCallback.empty())
 	{
-		LLSD empty;
-		mMaturityPreferencesCallback(empty);
+		mMaturityPreferencesCallback(SIM_ACCESS_MIN);
 	}
 }
 
-bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity, maturity_preferences_callback_t pMaturityPreferencesCallback)
+void LLAgent::setMaturityPreferenceAndConfirm(U32 preferredMaturity, maturity_preferences_callback_t pMaturityPreferencesCallback)
+{
+	llassert(mMaturityPreferenceConfirmCallback == NULL);
+	mMaturityPreferenceConfirmCallback = pMaturityPreferencesCallback;
+
+	gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
+	// PreferredMaturity has a signal hook on change that will call LLAgent::sendMaturityPreferenceToServer
+	// sendMaturityPreferenceToServer will use mMaturityPreferenceConfirmCallback in the LLHTTPResponder
+	// This allows for confirmation that the server has officially received the maturity preference change
+
+	mMaturityPreferenceConfirmCallback = NULL;
+}
+
+bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity)
 {
 	if (!getRegion())
 		return false;
@@ -2561,7 +2606,7 @@ bool LLAgent::sendMaturityPreferenceToServer(int preferredMaturity, maturity_pre
 		body["access_prefs"] = access_prefs;
 		llinfos << "Sending access prefs update to " << (access_prefs["max"].asString()) << " via capability to: "
 		<< url << llendl;
-		LLHTTPClient::ResponderPtr responderPtr = LLHTTPClient::ResponderPtr(new LLMaturityPreferencesResponder(pMaturityPreferencesCallback));
+		LLHTTPClient::ResponderPtr responderPtr = LLHTTPClient::ResponderPtr(new LLMaturityPreferencesResponder(mMaturityPreferenceConfirmCallback));
 		LLHTTPClient::post(url, body, responderPtr);
 		return true;
 	}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index 6c1f4a76a1e7cc37a4ade16dbc94b22156a334d3..18975911de117eab841f1a119483771d4f2dab53 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -694,9 +694,13 @@ class LLAgent : public LLOldEvents::LLObservable
 	void 			setMaturity(char text);
 	static int 		convertTextToMaturity(char text);
 
-	typedef boost::function<void (const LLSD &pResponse)> maturity_preferences_callback_t;
-	bool 			sendMaturityPreferenceToServer(int preferredMaturity, maturity_preferences_callback_t pMaturityPreferencesCallback = NULL); // ! "U8" instead of "int"?
+	typedef boost::function<void (U8)> maturity_preferences_callback_t;
+	void            setMaturityPreferenceAndConfirm(U32 preferredMaturity, maturity_preferences_callback_t pMaturityPreferencesCallback);
+private:
+	maturity_preferences_callback_t mMaturityPreferenceConfirmCallback;
+	bool 			sendMaturityPreferenceToServer(int preferredMaturity); // ! "U8" instead of "int"?
 
+public:
 	// Maturity callbacks for PreferredMaturity control variable
 	void 			handleMaturity(const LLSD& newvalue);
 	bool 			validateMaturity(const LLSD& newvalue);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index bb48391fe09d02e1bc0eccd0ced11aa333bafb11..3c2949d9ee5c941feaf879ae42479d8b0df4a532 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5387,31 +5387,14 @@ static void process_money_balance_reply_extended(LLMessageSystem* msg)
 	}
 }
 
-void handle_maturity_preference_change_and_reteleport(const LLSD &pResponse, U8 pMaturityRatingChange)
+void handle_maturity_preference_change_and_reteleport(U8 pActualMaturityRating, U8 pRequestedMaturityRating)
 {
 	bool isMaturityPreferenceElevated = false;
-	U8 actualPrefValue = SIM_ACCESS_MIN;
 
-	llassert(!pResponse.isUndefined());
-	llassert(pResponse.isMap());
-	llassert(pResponse.has("access_prefs"));
-	llassert(pResponse.get("access_prefs").isMap());
-	llassert(pResponse.get("access_prefs").has("max"));
-	llassert(pResponse.get("access_prefs").get("max").isString());
-
-	if (!pResponse.isUndefined() && pResponse.isMap() && pResponse.has("access_prefs") &&
-		pResponse.get("access_prefs").isMap() && pResponse.get("access_prefs").has("max") &&
-		pResponse.get("access_prefs").get("max").isString())
-	{
-		LLSD::String actualPreference = pResponse.get("access_prefs").get("max").asString();
-		LLStringUtil::trim(actualPreference);
-		actualPrefValue = LLViewerRegion::shortStringToAccess(actualPreference);
-	}
-
-	switch (actualPrefValue)
+	switch (pActualMaturityRating)
 	{
 	case SIM_ACCESS_MIN :
-		switch (pMaturityRatingChange)
+		switch (pRequestedMaturityRating)
 		{
 		case SIM_ACCESS_MIN :
 			isMaturityPreferenceElevated = true;
@@ -5425,7 +5408,7 @@ void handle_maturity_preference_change_and_reteleport(const LLSD &pResponse, U8
 		}
 		break;
 	case SIM_ACCESS_PG :
-		switch (pMaturityRatingChange)
+		switch (pRequestedMaturityRating)
 		{
 		case SIM_ACCESS_MIN :
 		case SIM_ACCESS_PG :
@@ -5439,7 +5422,7 @@ void handle_maturity_preference_change_and_reteleport(const LLSD &pResponse, U8
 		}
 		break;
 	case SIM_ACCESS_MATURE :
-		switch (pMaturityRatingChange)
+		switch (pRequestedMaturityRating)
 		{
 		case SIM_ACCESS_MIN :
 		case SIM_ACCESS_PG :
@@ -5453,7 +5436,7 @@ void handle_maturity_preference_change_and_reteleport(const LLSD &pResponse, U8
 		}
 		break;
 	case SIM_ACCESS_ADULT :
-		switch (pMaturityRatingChange)
+		switch (pRequestedMaturityRating)
 		{
 		case SIM_ACCESS_MIN :
 		case SIM_ACCESS_PG :
@@ -5473,13 +5456,13 @@ void handle_maturity_preference_change_and_reteleport(const LLSD &pResponse, U8
 
 	if (isMaturityPreferenceElevated)
 	{
-		gAgent.setMaturityRatingChangeDuringTeleport(pMaturityRatingChange);
+		gAgent.setMaturityRatingChangeDuringTeleport(pActualMaturityRating);
 		gAgent.restartFailedTeleportRequest();
 	}
 	else
 	{
 		LLSD args;
-		args["RATING"] = LLViewerRegion::accessToString(pMaturityRatingChange);
+		args["RATING"] = LLViewerRegion::accessToString(pRequestedMaturityRating);
 		LLNotificationsUtil::add("MaturityCouldNotBeChanged", args);
 		gAgent.clearFailedTeleportRequest();
 	}
@@ -5494,7 +5477,6 @@ bool handle_prompt_for_maturity_level_change_callback(const LLSD& notification,
 		// set the preference to the maturity of the region we're calling
 		U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
 		gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
-		gAgent.sendMaturityPreferenceToServer(preferredMaturity);
 	}
 	
 	return false;
@@ -5508,8 +5490,7 @@ bool handle_prompt_for_maturity_level_change_and_reteleport_callback(const LLSD&
 	{
 		// set the preference to the maturity of the region we're calling
 		U8 preferredMaturity = static_cast<U8>(notification["payload"]["_region_access"].asInteger());
-		gSavedSettings.setU32("PreferredMaturity", static_cast<U32>(preferredMaturity));
-		gAgent.sendMaturityPreferenceToServer(preferredMaturity, boost::bind(&handle_maturity_preference_change_and_reteleport, _1, preferredMaturity));
+		gAgent.setMaturityPreferenceAndConfirm(static_cast<U32>(preferredMaturity), boost::bind(&handle_maturity_preference_change_and_reteleport, _1, preferredMaturity));
 	}
 	else
 	{