diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 718b068c8ac296330b13f6b2d89c391d6c7c81ce..c4e9292d90b77e0fd15d4cd872261d8f6203c183 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -824,6 +824,13 @@ void LLFloaterPreference::updateShowFavoritesCheckbox(bool val)
 
 void LLFloaterPreference::setHardwareDefaults()
 {
+	std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
+	if (!preset_graphic_active.empty())
+	{
+		saveGraphicsPreset(preset_graphic_active);
+		saveSettings(); // save here to be able to return to the previous preset by Cancel
+	}
+
 	LLFeatureManager::getInstance()->applyRecommendedSettings();
 
 	// reset indirects before refresh because we may have changed what they control
@@ -2478,6 +2485,12 @@ void LLPanelPreferenceGraphics::onPresetsListChange()
 {
 	resetDirtyChilds();
 	setPresetText();
+
+	LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
+	if (instance && !gSavedSettings.getString("PresetGraphicActive").empty())
+	{
+		instance->saveSettings(); //make cancel work correctly after changing the preset
+	}
 }
 
 void LLPanelPreferenceGraphics::setPresetText()
@@ -2486,13 +2499,17 @@ void LLPanelPreferenceGraphics::setPresetText()
 
 	std::string preset_graphic_active = gSavedSettings.getString("PresetGraphicActive");
 
-	if (hasDirtyChilds() && !preset_graphic_active.empty())
+	if (!preset_graphic_active.empty() && preset_graphic_active != preset_text->getText())
 	{
 		LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
 		if (instance)
 		{
 			instance->saveGraphicsPreset(preset_graphic_active);
 		}
+	}
+
+	if (hasDirtyChilds() && !preset_graphic_active.empty())
+	{
 		gSavedSettings.setString("PresetGraphicActive", "");
 		preset_graphic_active.clear();
 		// This doesn't seem to cause an infinite recursion.  This trigger is needed to cause the pulldown
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 8de65b733ba393e7bb62f41018ea15096ae95c4c..ed692c903e6c2402cfbda013952e408863ab8017 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -125,12 +125,10 @@ class LLFloaterPreference : public LLFloater, public LLAvatarPropertiesObserver,
 	// updates click/double-click action controls depending on values from settings.xml
 	void updateClickActionControls();
 
+public:
 	// This function squirrels away the current values of the controls so that
 	// cancel() can restore them.	
 	void saveSettings();
-		
-
-public:
 
 	void setCacheLocation(const LLStringExplicit& location);